컴파일러와 인터프리터는 모두 high-level language를 machine language로 변환하는 역할이다.
그리고 Java는 이 두 가지를 모두 사용한다. 따라서 두 가지를 사용하는 이유와 더불어 각각에 대해서 알아보겠다.
Java에서의 컴파일러와 인터프리터 역할
- 컴파일러 :
.java
파일을 javac(라고 하는 자바 컴파일러)가 바이트코드로 작성된 .class
파일로 변환한다.
- 즉, 자바 소스 코드를 JVM을 위한 기계어로 변환한다.
- 인터프리터 :
.class
파일 내의 바이트코드를 특정 환경의 기계에서 실행할 수 있도록 한다.
Java는 왜 컴파일러와 인터프리터 모두 사용하는가?
- 컴파일러는 코드를 바로 기계어로 변환하기 때문에 프로그램이 작성된 기계 상에서 실행할 때 매우 효율적이다.
- 그러나 이것은 동시에 기계 종류에 종속된다는 말이기도 하다.
- 따라서 인터프리터를 사용하는 이유가 여기서 나온다.
[인터프리터를 사용하는 이유]
- 인터프리팅은 플랫폼에 종속되지 않는다.
- 물론 컴파일러를 먼저 수행하고 인터프리팅하는 과정이 있어, 컴파일 과정만 필요한 언어보다는 속도가 느리다.
- 자바 바이트 코드는 컴퓨터와 프로그램 사이에 별도의 버퍼 역할을 한다.
특징 정리
- 컴파일러는 소스코드 전체를 컴퓨터 프로세서가 실행 할 수 있도록 바로 기계어로 변환한다.
- 인터프리터는 고레벨 언어를 중간 코드(intermediate code)로 변환하고 이를 각 행마다 실행한다.
- 이 중간 코드는 다른 프로그램에 의해 실행된다.
- 일반적으로 컴파일러가 각 행마다 실행하는 특성을 가진 인터프리터보다는 실행시간이 빠르다.
- 컴파일러는 전체 소스코드를 변환 한 뒤 에러를 보고하지만 인터프리터는 각 행 마다 실행하는 도중 에러가 보고되면 이후 작성된 코드를 살펴보지 않는다. 이는 보안적인 관점에서 도움이 된다.
마무리
자바에서는 인터프리터 특성 중 한 줄씩 읽는 특성에 집중하기보다는, 플랫폼에 독립적으로 작동할 수 있도록 사용됨을 중점을 두어야 할 것 같다.