프로시저 간 최적화

프로시저 간 최적화(interprocedural optimization, IPO)는 중소 규모의 길이의 자주 사용되는 수많은 함수들을 포함하여 프로그램의 성능 개선을 위해 컴퓨터 프로그래밍에 사용되는 컴파일러 기법의 모임이다. IPO는 다른 컴파일러 최적화와는 다른데, IPO가 프로그램 전반을 분석하는 반면, 다른 최적화 기법들은 하나의 함수, 또는 하나의 코드 블록만 본다.

IPO는 중복 연산, 비효율적인 메모리 사용을 감소시키거나 제거하고 루프와 같은 반복적인 시퀀스를 단순케하는 방법을 강구한다. 루프 안에서 발생되는 다른 루틴으로의 호출이 있을 경우 IPO는 이를 인라인하는 것이 최적인지를 확인하고 결정할 수 있다. 게다가 IPO는 더 나은 메모리 레이아웃과 로컬리티를 위해 루틴을 재정렬할 수 있다.

또, IPO는 전체 프로그램 수준에서 일반적인 컴파일러 최적화를 수행할 수도 있는데 이를테면 전혀 실행될 가능성이 없는 코드를 제거하는 죽은 코드 제거를 들 수 있다. 이를 수행하기 위해 컴파일러는 전혀 취하지 않은 브랜치에 대해 테스트하고 브랜치 안의 코드를 제거한다. 또, IPO는 더 나은 상수(constant)의 사용 보장을 시도한다. 현대의 컴파일러들은 컴파일 시간에 옵션으로서 IPO를 제공한다. 실제 IPO 프로세스는 인간이 읽을 수 있는 소스 코드와 완성된 실행 파일 바이너리 프로그램을 생성하는 과정 사이에서 발생할 수 있다.

전체 프로그램 최적화(Whole program optimization, WPO)는 프로그램 내 모든 모듈에 대한 정보를 사용하여 프로그램을 최적화하는 것을 말한다. 일반적으로 모듈 단위로 최적화가 수행되지만 이 접근 방식은 비록 컴파일 중에 리소스의 쓰기와 테스트가 더 용이하고 수요를 더 줄일 수 있으나 과감한 인라인과 같은 수많은 최적화의 안전에 대한 확실성을 허용하지 않는다.

링크 타임 최적화(Link-time optimization)는 링크 타임에 컴파일러가 프로그램에 수행하는 프로그램 최적화의 일종이다. 링크 타임 최적화는 파일 대 파일을 기초로 하여 이 파일들을 함께 링크하는 프로그램 언어(예: C, 포트란)에 적절하며, 자바의 JIT 컴파일과 같은 방식에는 부적절하다.

역사 
프로시저 언어 또는 알골계 언어의 경우 프로시저 간 분석 및 최적화는 1970년대 초에 상업화에 들어간 것으로 보인다. IBM의 PL/I 최적화 컴파일러는 프로시저 간 분석을 수행함으로써 프로시저 호출과 예외의 부작용을 인지하였다. (캐스트, PL/I 용어로는 "on conditions")

프로시저 간 분석 및 최적화 기법은 1980년대와 1990년대에 학술 논문의 주제였다.

각주

외부 링크 
 How to trick C/C++ compilers into generating terrible code?

컴파일러 최적화