프로그래밍 언어는 컴파일 언어와 인터프리터 언어의 두 그룹으로 분류할 수 있다.
C, C++, Go와 같은 컴파일 언어는 소스 코드를 한번에 기계 코드로 변환하는 반면,
Python, R, JavaScript와 같은 인터프리터 언어는 소스 코드를 한 줄씩 읽고 해석한다.
컴파일 언어는 고급 언어로 작성된 소스 코드를 저급 언어로 번역하는 프로그램인 컴파일러
를 사용한다.
고급 언어는 사람이 이해하고 작성하기 쉬운 반면, 저급 언어는 컴퓨터가 직접 이해하고 처리하기 쉽다.
컴파일러는 컴파일 타임
에 전체 소스 코드
를 기계어 코드
로 변환한 후 실행 파일
을 생성한다.
컴파일 단계와 실행 단계가 분리되어 있으며 컴파일은 한 번만 수행된다.
컴파일된 실행 파일은 프로그램 실행 중 바로 실행되기 때문에 코드 실행 속도가 빠르다.
하지만 프로젝트의 규모가 클 경우 컴파일 시간이 오래 걸린다는 단점이 있다.
인터프리터 언어는 별도의 실행 파일을 생성하지 않는다.
대신 소스 코드를 한 줄씩 읽고, 바이트 코드로 변환
하여 실행한다.
즉, 해석 단계와 실행 단계가 분리되지 않고 코드가 실행될 때마다 해석 과정이 수행된다.
따라서 실행 속도가 상대적으로 느리다.
Java Compiler
는 Java 코드를 한 번에 Java 바이트 코드
로 변환한다.
Java 바이트코드의 확장자는 .class
이다.
.java 파일 → [Java Compiler] → .class파일
변환된 코드는 JVM의 Java Interpreter
를 사용하여 한 줄씩 실행된다.
.class 파일 → [JVM] → 바이너리 코드
Java는 컴파일 언어이자 인터프리터 언어
처음에는 인터프리터 언어로 사용되다가, 컴파일 언어의 장점을 가져와 성능을 향상시켰다.
실행 속도를 높이기 위해 JVM의 JIT(Just In Time) 컴파일러
는 반복되는 코드를 네이티브 코드로 변환하고, 인터프리터는 컴파일된 네이티브 코드를 직접 사용한다.
JIT 컴파일러란?
JIT(Just-In-Time)
은 실제 실행 시점에 프로그램을 번역하는 컴파일 기법이다. 코드를 매번 해석하지 않고 동일한 코드를 캐싱한다. 자주 사용하는 메소드를 저장하고 해석 없이 바로 실행하여 성능을 향상시킨다.