절차적 프로그래밍


Procedural Programming

1 정의

절차적 프로그래밍이란 단순히 순차적인 명령 수행이 아니라 루틴, 서브루틴, 매서드, 함수등(이를 통틀어 프로시저라고 한다.)을 이용한 프로그래밍 패러다임을 뜻한다.

'절차적 프로그래밍'이라는 한국어 번역은 오해의 여지가 크다. Procedural Programming에서 Procedural를 '절차적'로 번역해버려서 마치 절차적으로 실행하는 것이 중점이 되는 것 처럼 보이기 때문이다. 그러나 procedural의 procedure는 '절차'라는 의미가 아니라 '프로시져'[1]의 의미이다. 이 패러다임에서는 프로시져 콜, 즉 함수 호출을 통해서 추상화와 재사용성을 얻어내는 것이 본질이기 때문이다. 그러나 이미 망할 교과서에 절차적 프로그래밍이라고 줄기차게 쓰여져 있어서 굳어져버렸기 때문에 어쩔 수 없이 이 번역명이 사용되고 있다.

2 장점

프로시저를 이용하여 프로그래밍을 하게되면 기본적으로 함수를 통해 코드의 재활용성이 높아지게 된다. 또한 메인 프로시저 뿐만아니라 함수 내에 호출을 통해 여러 부분을 생략하여 프로그램 흐름을 쉽게 볼 수 있으므로 코드의 가독성이 높아진다. 또한 모듈화와 구조화에 더 용이해지므로 대규모 프로젝트에 많은 프로그래머들이 투입된 경우 자신이 맡은 부분만 프로그래밍 하여 조립하는 것도 가능하다.

3 단점

당연히 단점 또한 존재한다. 기본적으로 프로시저를 호출하는 것은 그냥 코드를 쓰는 것보다 시간이 매우 많이 소모된다. 프로시저를 호출하면 스택에 프레임이 할당되는데, 여기에 다시 변수를 설정하고.... 하여튼 복잡한 과정을 거친다. 이런것은 코드를 그냥 쓰는것(이것을 인라인이라고 한다)보다 매우매우매우 많은 시간과 자원을 잡아먹으므로 함수를 사용할 때는 원칙적으로는 이것이 꼭 필요한지 생각해 보는 것이 좋다.

다만 프로시저를 프로시저가 아닌 것처럼! 사용하는 방법이 있다. 그것이 바로 C++등에서 지원하는 인라인 함수이다. 인라인함수를 사용하게되면 컴파일러가 함수를 호출하는 것이아니라(스택프래임 등을 확보하고 프레임 포인터들을 바꾸는 것이 아니라), 인라인 함수 내의 내용으로 코드를 바꾸어 버린다(!!) 따라서 코드를 그냥 쓰는 것과 다름없이 사용가능하다.

다만 위의 내용은 다소 낡은 내용인데, 왜냐면 현재는 대부분의 컴파일러의 성능이 굉장히 좋아진 터라 최적화 옵션을 주면 inline 지시자 없이도 자동으로 인라이닝을 해주기 때문이다. 다른 한편으로는 2016년 기준으로 하드웨어의 성능이 뿅맞은 테리어 마냥 좋아졌기 때문에 현재 단순 프로시져 콜 오버헤드를 걱정해야 하는 시기는 이미 지났다고 볼 수 있다. 이제는 커널 튜닝/해킹을 하지 않는 이상 함수콜 오버헤드를 걱정할 필요는 없다! 따지고 보면 객체 지향 프로그래밍은 vtable 참조때문에 프로시져 지향 프로그래밍보다 함수 콜이 느린데도 잘만 쓴다.
  1. C언어를 포함한 대부분의 언어에서는 함수라고 불리는 그것이다.