- 컴파일러(compiler)란?
컴파일러는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램으로, high-level programming language를 실행 프로그램으로 만들기 위한 lower level language(어셈블리 언어 등)로 바꾸는데 사용된다.
원래 문서를 소스코드 또는 원시코드라고 하며, 원시코드에서 출력된 문서인 목적 코드로 옮기는 과정을 컴파일이라고 한다. 소스코드를 컴파일 하는 이유는 이해하기 쉬운 형태의 high-level programming language로부터 실행 가능한 기계어 프로그램을 만들기 위해서이다.
컴파일러는 소스 프로그램을 읽어 바로 결과를 출력하는 인터프리터와 구분된다.
위의 그림은 일반적인 다중언어, 다중 대상 컴파일러의 동작 모습을 나타낸 그림이다.
컴파일러에서 지켜야하는 두가지 조건이 있다.
1. 컴파일러는 옮기는 과정에서 프로그램의 뜻을 보전해야 하며 입력받은 프로그램의 의미를 따라야한다.
2. 컴파일러는 입력으로 들어온 프로그램을 어떤 면에서든 개선해야 한다. 같은 언어로 옮긴 경우라면 성능이 개선되어야 하는 장점이 있어야 한다.
위의 두가지 조건이 만족되지 않는다면 사용자가 컴파일러를 믿고 프로그램을 작성할 수도 없으며 컴파일을 수행할 이유가 없어진다.
컴파일러의 실행 단계는 구문 분석, 최적화, 코드 생성, 링킹 순서로 진행된다.
구문 분석 : 소스 코드 파일을 읽어 문법요소 단위로 잘라 문법 요소들을 해석해 추성 구문 트리를 생성한다. 이 때 문법에 맞지 않는 소스 코드는 사용자에게 알려준다.
최적화 : 추상 구문 트리를 분석해 최적화를 수행한다. 도달할 수 없는 코드 식별, 상수 표현식 미리 계산, 루프 풀기 등 대부분 최적화가 이 단계에서 수행된다.
코드 생성 : 최적화된 구문 트리로부터 목적 코드를 생성한다. 하드웨어에 맞는 최적화가 이 단계에서 수행된다.
링킹 : 목적 코드가 기계어일 경우 여러 라이브러리 목적 코드를 묶어 하나의 실행 파일을 생성한다.
컴파일러 관련 언어로는 C, JAVA가 있다.
- 인터프리터(interpreter)란?
인터프리터는 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경이다. 이는 원시 코드를 기계어로 번역하는 컴파일러와는 차이가 있다.
인터프리터는 소스 코드를 직접 실행하며 소스 코드를 효율적인 다른 중간 코드로 변환하고 변환한 것을 바로 실행한다. 인터프리터 시스템의 일부인 컴파일러가 만든 미리 컴파일된 저장 코드의 실행을 호출하는 기능을 가지고 있다.
high-level programming language로 작성된 프로그램들을 실행하는 방법은 두가지가 있다.
1. 가장 일반적인 방법으로 프로그램을 컴파일 하는 방법이 있다.
2. 프로그램을 인터프리터에 통과시키는 방법이 있다.
인터프리터의 장점은 기계어 명령어들이 만들어지는 컴파일 단계를 거칠 필요가 없다는 것이다. 컴파일 과정은 원시 프로그램의 크기가 크면 시간이 많이 소요가 되는 반면 인터프리터는 고급 프로그램을 바로 실행시킬 수 있다. 또, 인터프리터를 이용하면 프로그래밍을 대화식으로 할 수도 있다.
이런 이유로 개발 단계에서 종종 인터프리터가 사용되는데 한번에 적은 양의 내용을 추가하고 빠르게 테스트 해볼 수 있기 때문이다.
인터프리터 관련 언어로는 Python, BASIC 등이 있다.