컴파일러는 특정 프로그래밍 언어를 다른 프로그래밍 언어로 옮기는 번역 프로그램이다 .
보통 high-level 프로그래밍 언어를 low-level language인 기계어, 어셈블리어 등으로 바꾸는데에 사용된다.
하지만 정의에서도 알 수 있듯, python을 c언어로 변역하는 프로그램도 컴파일러라고 할 수 있다.
컴파일러는 파일 전체를 한꺼번에 번역하여 번역한 결과를 컴퓨터가 실행가능한 목적 프로그램으로 저장한다.
컴파일러는 문법적인 에러가 발생하면 컴파일 단계에서 발생하게 되는데 이를 컴파일 에러라고 한다.
컴파일 에러가 발생하면 실행자체가 불가능하다.
따라서 컴파일 에러와 관련된 에러를 초기에 발견할 수 있다.
인터프리터는 컴파일러와 대조적으로 코드를 한 줄씩 해석하여 실행하는 프로그램이다.
컴파일러와 달리 목적파일을 생성하지 않기 때문에 메모리를 사용하지 않는다.
인터프리터는 실행시 마다 소스코드를 한 줄씩 기계어로 번역하기 때문에 실행속도는 컴파일러 보다 느리다.
하지만 컴파일러 보다 프로그램 수정이 간단하다는 점, 한 줄씩 실행되기 때문에 디버깅 과정이 간단하다는 점이 있다.
인터프리터는 컴파일러와 달리 에러가 존재하는 코드를 실행하기 전까지는 정상적으로 작동한다는 특징이 있다.
또한, 컴파일 에러가 존재하지 않기 떄문에 대부분의 에러는 런타임에서 발생할 가능성이 크다.
하이브리드 타입이란 컴파일러와 인터프리터의 장점을 섞은 프로그램이다.
대표적으로 Java와 C#이 하이브리드를 이용한 프로그래밍 언어이다.
하이브리드들은 VM 위에서 동작하여 어느 플랫폼 위에서도 동작할 수 있다 (컴파일러 언어 단점 보완).
Java를 예를 들면 다음과 같이 하이브리드 타입은 동작한다.
1. 먼저 컴파일러가 동작하여 소스코드를 바이트 코드로 변환한다.
2. vm 위에 존재하는 인터프리터가 해당 바이트 코드를 기계어로 변환하여 실행한다.
이 방식은 vm이 각 플랫폼을 지원한다면 어디서든 실행가능하다는 장점, 실행속도도 기존 인터프리터에 비해 빠르다는 장점이 있다 (컴파일 한걸 해석하기 떄문)
하지만, vm에 종속적이기 때문에 하드웨어를 직접 제어하는 작업은 불가능하다.
JIT 컴파일이란 프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일 하는 방식을 의미한다.
최근 JVM, V8 엔진 에서 지원하는 컴파일링 방식이다.