컴파일러와 인터프리터의 공통점은, 사람이 이해할 수 있는 고수준 언어 (high-level language)로 작성된 소스 코드를 기계가 이해할 수 있는 기계어 (machine language)로 번역한다는 것이다.
그렇다면 차이점은 무엇일까?
컴파일러는 사람이 고수준 언어를 작성하면 그 내용을 한꺼번에 번역한다. 그래서 줄(line) 단위로 번역하는 인터프리터에 비해 번역 시간은 상대적으로 더 걸리는 편이다. 하지만 컴파일러는 한번 번역을 하면 실행 파일이 생성되고, 다음에 실행할 때 이 파일을 재사용하면 되기 때문에 인터프리터에 비해 실행 시간은 빠른 편이다.
인터프리터는 컴파일러와 달리 한줄 한줄씩 번역하기 때문에 컴파일러에 비해 번역 시간은 빠른 편이다. 하지만, 실행 파일을 따로 생성하지 않기 때문에 매번 프로그램을 실행할 때마다 동일한 번역을 반복해야 한다. 그래서 컴파일러 비해 실행 속도는 느린 편이다.
실행 속도만 비교하면, 컴파일러가 더 좋아보이는데 인터프리터를 사용하는 이유가 뭘까?
컴파일러는 운영체제, 하드웨어와 같은 플랫폼에 종속적이지만, 인터프리터는 플랫폼에 독립적이다. 즉, 인터프리터에 의해 번역된 기계어는 어떤 플랫폼에서든지 동일하게 실행할 수 있다.
javac 컴파일러는 소스 코드를 바이트 코드로 컴파일한다. (.java → .class)
이 바이트 코드는 JVM (자바 가상 머신)의 인터프리터에 의해 기계어로 변환된다.
이렇게 만들어진 기계어는 플랫폼 독립적으로 실행될 수 있다.
자바와 코틀린이 100% 호환 가능한 이유도 두 언어로 작성된 소스코드는 어차피 자바 컴파일러에 의해 모두 바이트 코드로 변환되며, 이는 JVM의 인터프리터가 각 플랫폼에 맞게 기계어로 번역하기 때문이다.