점투자 2: 자바는 컴파일 언아인가?

A: 컴파일 방식과 인터프리터 방식이 섞여 있다.

자바 소스코드가, 기계어로 번역되는 방식을 정리하면 다음과 같다

  1. 먼저 자바 가상 머신(JVM)이, 소스 코드(.java)를 바이트 코드(.class)로 컴파일 한다. 바이트코드는 자바 가상 머신이 읽을 수 있는 형태의 저수준 언어이다. 어셈블리어, 기계어와는 다르다. 기본적으로 CPU에 종속적인 기계어로된 목적 파일을 생성하는 일반적인 컴파일이 아키텍쳐, 운영체제(=플랫폼)에 종속적이지만, 아 방식으로 생성된 바이트코드는 플랫폼과 상관없이 자바 가상 머신 상에서 구동되기 때문에 플랫폼에 비 종속적이다.

  2. 컴파일된 바이트 코드들을, 다시 기계어로 변환한다. 이 방식은 JIT 컴파일이라는 과정을 통해 이루어 지는데, 컴파일이라는 이름이 붙어있지만 기본적으로 인터프리터 방식을 따른다. 즉, 한 줄 한 줄을 실행 과정에서 목적파일 생성 없이 바로 기계어로 변환 후 바로 실행한다 (= 동적 컴파일). 단, 이미 실행한 명령어는 캐싱 해 두고 반복해서 기계어로 번역하는 것을 방지한다.

  3. 바이트코드를 기계어로 번역하는 것은 소스코드를 바로 번역 하는 것 보다 빠르다 (인터프리터 방식에 대한 우위). 그리고, 전체 소스코드를 바이트코드로 일괄 전환하는 것은 전체 소스코드를 기계어로 일괄 번역하여 목적 파일을 만드는 것 보다 빠르다 (컴파일 방식에 대한 우위). 이런 의미에서, 위의 방식은 인터프리터 방식과 컴파일 방식의 장점을 섞어 놓았다고 볼 수 있다.

Last updated