컴파일러(compiler, 순화 용어: 해석기, 번역기)는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램을 말한다. 컴파일러는 고급 프로그래밍 언어를 실행 프로그램으로 만들기 위해 저급 프로그래밍 언어(예, 어셈블리 언어, object 코드, machine code)로 바꾸는 데 사용된다. 원래의 문서를 소스 코드 혹은 원시 코드라고 부르고, 출력된 문서를 목적 코드라고 부른다. 목적 코드는 주로 다른 프로그램이나 하드웨어가 처리하기에 용이한 형태로 출력되지만 사람이 읽을 수 있는 문서 파일이나 그림 파일 등으로 옮기는 경우도 있다. 원시 코드에서 목적 코드로 옮기는 과정을 컴파일(compile)이라고 한다
컴파일러는 소스 프로그램을 읽어서 즉시 결과를 출력하는 인터프리터와는 구분된다. 인터프리터는(interpreter) 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다. 원시 코드를 기계어로 번역하는 컴파일러와 대비된다. 그러나 현대에 들어가 많은 인터프리터가 JIT 컴파일 등의 기술로 실시간 컴파일을 수행하므로, 컴파일러와 인터프리터 사이의 기술적 구분은 사라져 가는 추세이다. JIT 컴파일 또는 동적 번역은 프로그램은 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데, 인터프리터 방식과 정적 컴파일 방식으로 나눌 수 있다.JIT 컴파일은(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.
소스 코드를 컴파일하는 이유는 대부분 사람에게 이해하기 쉬운 형태의 고수준 언어로부터 실행 가능한 기계어 프로그램을 만들기 위해서이다. 좁은 의미의 컴파일러는 주로 고수준 언어로 쓰인 소스 코드를 저수준 언어(어셈블리어, 기계어 등)로 번역하는 프로그램을 가리킨다.
컴파일러의 역사
초기 컴퓨터 프로그램들은 어셈블리어로 작성되었다. 그러나 서로 다른 CPU(중앙처리장치:컴퓨터 부품과 정보를 교환하면서 컴퓨터 시스템 전체를 제어하는 장치로, 모든 컴퓨터의 작동과정이 중앙 처리 장치의 제어를 받기 때문에 컴퓨터의 두뇌에 해당한다.) 아키텍처가 등장할 때마다 매번 똑같은 프로그램을 서로 다른 어셈블리어로 작성하는 비용이 커지면서, 고급 프로그래밍 언어(high-level programming language)의 필요성이 대두되었다. 그러나 초기 컴퓨터 하드웨어의 메모리 크기가 너무 작아, 컴파일러의 등장에 기술적 걸림돌이 되었다. 1950년대 초부터 기계어에 독립적인 최초의 고급 프로그래밍 언어가 나타났고, 실험적인 컴파일러들이 등장하기 시작했다. 세계 최초의 컴파일러는 1952년 그레이스 호퍼가 개발한 프로그래밍 언어 A-0을 기계어로 번역하는 컴파일러이다. 컴파일러라는 용어 또한 이때 호퍼가 처음 사용하였다. 최적화 기능이 탑재된 최초의 완전한 컴파일러는 1957년 IBM의 존 매커스가 개발한 포트란 컴파일러이다.
참고로 그레이스 호퍼는 '영어로 명령을 입력하는 언어'의 창시자이며 에디슨이 버그라는 용어를 쓴 이후 진짜 '버그'가 원인이 된 것은 호퍼의 사례가 처음이었다. 그래서 호퍼 본인은 그 버그를 테이프로 붙이면서 "최초로 입증된 사례(First actual case)"라는 표현을 쓴 것이다. 이 나방은 아직도 스미소니언 박물관에 소장되어 있다.
컴파일러의 원리
컴파일러에서 꼭 지켜야 할 두 가지 조건이 있다. 첫 번째로, 실용적인 면에서, 컴파일러는 입력으로 들어온 프로그램을 어떤 면에서든지 개선해야 한다. 예를 들어, 소스 코드를 기계어로 옮긴다면 기계가 이해할 수 없었던 언어를 기계가 이해할 수 있게 개선한 것이 된다. 같은 언어로 옮긴 경우에는 성능이 개선되는 등의 장점이 있어야 한다. 그렇지 않다면 컴파일을 수행할 이유가 없어진다. 두 번째로, 컴파일러는 옮김의 과정에서 프로그램의 뜻을 보존하여야 한다. 입력받은 프로그램의 의미를 충실히 따라야 한다. 이런 조건이 없다면 컴파일러를 사용하는 사용자가 컴파일러를 믿고 프로그램을 작성할 수도 없고, 잘못된 옮김을 인정한다면 컴파일러를 올바르게 하기 위한 노력을 들일 필요가 없을 것이다.
컴파일러의 기능
* 자바(JAVA)의 경우 바이트(Byte) 코드로 변환한다. 중간단계의 코드를 생성하고 이것을 해석해서 실행한다.
* 고급언어를 직접 기계어 코드로 변환한다.
C/C++ 언어와 같은 고급언어는 직접 기계어 코드로 변환한다. 마이크로프로세서는 각각 다른 기계어 코드를 가지고 있기 때문에 같은 고급언어라도 다른 기계어 코드를 생성해야 한다. 따라서 개발자는 해당 마이크로프로세서에 맞는 컴파일러를 사용해야 한다. 그러나 자바(JAVA)는 다양한 마이크로프로세서에서 실행되도록 하는 철학을 가지고 개발되었기 때문에 바이트 코드를 가지고 해석해서 실행하는 방식이다. 장점은 한번 컴파일된 바이트 코드는 다른 플랫폼에서 재컴파일 없이 실행할 수 있다. 그러나 단점은 바이트 코드를 해석해서 실행할 프로그램 구조가 필요하고, 직접 기계어 코드를 실행하는 것보다 속도에서 늦다.
'프로그래밍/그래픽스' 카테고리의 다른 글
OpenGL(Open Graphics Library) (0) | 2023.08.27 |
---|---|
JAVA (0) | 2023.08.24 |
프로그래밍(Programming)이란? (0) | 2023.08.19 |
[C++] C++ 프로그래밍 언어의 특징 및 기본 코드 예제 (0) | 2023.08.15 |
[C] C언어의 장점과 단점 (0) | 2023.08.15 |