컴파일러
위키백과 ― 우리 모두의 백과사전.
컴파일러(compiler, 순화 용어: 옮김틀, 번역기)는 특정 프로그래밍 언어로 써 있는 문서를 다른 프로그래밍 언어로 옮기는 프로그램을 말한다. 원래의 문서를 소스 코드 혹은 원시 코드라고 부르고, 출력된 문서를 목적 코드라고 부른다. 목적 코드는 주로 다른 프로그램이나 하드웨어가 처리하기에 용이한 형태로 출력되지만 사람이 읽을 수 있는 문서 파일이나 그림 파일 등으로 옮기는 경우도 있다. 원시 코드에서 목적 코드로 옮기는 과정을 컴파일(compile, 순화 용어: 옮김, 번역)이라고 한다. 컴파일러는 소스 프로그램을 읽어서 즉시 결과를 출력하는 인터프리터와는 구분된다.
소스 코드를 컴파일하는 이유는 대부분 사람에게 이해하기 쉬운 형태의 고수준 언어로부터 실행가능한 기계어 프로그램을 만들기 위해서이다. 좁은 의미의 컴파일러는 주로 고수준 언어로 쓰여진 소스 코드를 저수준 언어(어셈블리어, 기계어 등)로 번역하는 프로그램을 가리킨다.
목차 |
[편집] 원리
컴파일러에서 꼭 지켜야 할 두 가지 조건이 있다. 첫째로, 컴파일러는 옮김의 과정에서 프로그램의 뜻을 보존하여야 한다. 입력 받은 프로그램의 의미를 충실히 따라야 한다. 이런 조건이 없다면 컴파일러를 사용하는 사용자가 컴파일러를 믿고 프로그램을 작성할 수도 없고, 잘못된 옮김을 인정한다면 컴파일러를 올바르게 하기 위한 노력을 들일 필요가 없을 것이다. 두번째로, 실용적인 면에서, 컴파일러는 입력으로 들어온 프로그램을 어떤 면에서든지 개선해야 한다. 예를 들어, 소스 코드를 기계어로 옮긴다면 기계가 이해할 수 없었던 언어를 기계가 이해할 수 있게 개선한 것이 된다. 같은 언어로 옮긴 경우에는 성능이 개선되는 등의 장점이 있어야 한다. 그렇지 않다면 컴파일을 수행할 이유가 없어진다.
[편집] 분류
컴파일러는 입력/출력되는 언어의 종류, 내부구조, 목적코드의 동작에 따라 여러 가지로 분류할 수 있다.
[편집] 목적코드가 실행되는 방법
컴파일러가 실행되는 컴퓨터나 운영체제가 컴파일러의 목적코드가 실행될 컴퓨터나 운영체제와 같은 경우 네이티브 컴파일러(native compiler)라고 한다. 반면에 크로스 컴파일러(cross compiler)는 다른 컴퓨터나 운영체제에서 실행되도록 제작된다. 임베디드 시스템 등 소프트웨어 개발에 충분한 환경을 갖추지 못한 환경에서 동작할 프로그램을 만들기 위해 사용된다.
또한 가상 머신에서 동작할 프로그램을 만드는 컴파일러도 있다. 이 경우 일반적으로 출력물이 가상 머신을 위해 제작된 바이트코드 형태의 기계어가 되므로 바이트코드 컴파일러라고 부른다.
[편집] 일단 구조와 다단 구조
소스를 한 번 읽고 번역하여 바로 출력물을 내놓는 컴파일러도 있지만 여러 가지 목적을 위해 중간 결과를 만들어 그 결과를 다시 최종 결과로 출력하는 컴파일러도 있다. 중간 결과를 만드는 데는 여러 가지 이유가 있다.
- 다양한 언어 지원 : 다양한 입력 언어를 동일한 중간 표현으로 표현하거나 동일한 중간 표현을 여러 가지 출력 언어로 표현하면 다양한 입력 언어와 출력 언어를 지원하는 컴파일러를 작성할 수 있다.
- 효율성 : 고수준 언어일수록 효율성보다는 사람에게 이해하기 쉬운 형태를 염두에 두고 설계된다. 때문에 중간형태를 거치는 것이 보다 저수준에서 효율적으로 프로그램을 최적화한 다음 최종적으로 출력물을 내놓는 데 유리할 수 있다.
- 저스트 인 타임 컴파일 : 스몰토크, 자바, 마이크로소프트 공통 중간 언어(CIL) 등의 컴파일러는 가상 머신의 바이트코드를 출력한다. 그러나 가상 머신은 플랫폼의 기계어에 비해 속도가 느릴 수밖에 없으므로 이들 가상 머신에는 저스트 인 타임 컴파일러가 탑재되어 실행 직전에 현재 플랫폼의 기계어로 다시한번 컴파일되어 속도를 향상시킨다.
[편집] 참고 자료
- Cooper, Keith D. & Linda Torczon, Engineering a compiler, Morgan Kaufmann, 2004, pp 1-8.
|
|
---|---|
수학적 기초 | 수리논리학 · 집합론 · 정수론 · 그래프 이론 · 형 이론 · 범주론 · 수치해석 |
계산 이론 | 오토마타 이론 · 계산 가능성 이론 · 계산 복잡도 이론 · 양자 계산 이론 |
알고리즘 & 자료 구조 | 알고리즘 · 자료구조 · 계산 기하학 |
프로그래밍 언어 & 컴파일러 | 구문 분석 · 컴파일러 · 인터프리터 · 프로그래밍 언어 · 구조적 프로그래밍 · 객체지향 프로그래밍 |
병행,병렬 & 분산 시스템 | 병행 컴퓨팅 · 분산 컴퓨팅 · 병렬 컴퓨팅 · 그리드 컴퓨팅 |
소프트웨어 공학 | 요구 분석 · 소프트웨어 설계 · 컴퓨터 프로그래밍 · 형식수법 · 소프트웨어 테스팅 · 소프트웨어 개발 |
시스템 아키텍처 | 컴퓨터 아키텍처 · 마이크로아키텍처 · 운영체계 |
통신 & 네트워크 | 컴퓨터 오디오 · 라우팅 · 네트워크 토플로지 · 암호학 |
데이터베이스 | 데이터 마이닝 · RDBMS · SQL |
인공 지능 | 자동추론 · 전산언어학 · 컴퓨터 비전 · 진화연산 · 기계학습 · 자연언어 처리 · 로봇학 |
컴퓨터 그래픽 | 시각화 · 영상 처리 |
인간과 컴퓨터 상호 작용 | Computer accessibility · 사용자 인터페이스 · 착용 컴퓨터 · 유비쿼터스 컴퓨팅 · 가상현실 |
계산과학 | 인공생명 · 생물정보학 · 인지과학 · 계산화학 · 계산론적 신경과학 · 계산물리학 · 수치해석 · Symbolic mathematics |