자바는 인터프리터 언어일까, 컴파일 언어일까?
javac의 역할
javac
는 보통 "자바 컴파일러"라고 부르지만, 엄밀히 말하면 바이트코드 생성기에 가깝다.
.java
파일을 바이트코드로 변환해 .class
파일을 생성하는 역할을 한다.
- 하지만 컴파일의 일반적인 정의(고수준 언어를 다른 형태로 변환)로 볼 때,
javac
를 컴파일러라 부르는 것도 틀리지는 않다.
JIT 컴파일러의 역할
- JIT(Just-In-Time) 컴파일러는 자바 실행 과정에서 런타임 시 동작하는 컴파일러로, 바이트코드를 네이티브 기계어로 변환한다.
- 이는 런타임 중에 수행되며, 프로그램의 성능을 최적화하기 위해 반복 실행되는 바이트코드를 기계어로 캐싱하여 이후 실행 속도를 높인다.
클래스 로더의 동작
- 클래스 로더는 JVM에서 클래스 파일을 적재하고, 필요한 클래스를 메모리에 로드한다.
- 이 과정에서 동적 동작이 발생하며, 대표적으로 다음과 같은 작업이 수행된다.
- 인스트루먼테이션(Instrumentation): 런타임 시 클래스의 바이트코드를 변경하거나 수정할 수 있다.
- 모듈 식별: 자바 모듈 시스템을 활용해 필요한 모듈을 로드하고 관리한다.
- 클래스 탐색: 사용자가 정의한 클래스 및 라이브러리 클래스 경로를 검색하여 로드한다.
인터프리터의 역할
- 클래스 로더에 의해 적재된 바이트코드는 인터프리터를 통해 한 줄씩 읽혀 실행된다.
- JIT 컴파일러가 기계어로 변환한 코드는 인터프리터 없이 바로 실행되지만, 초기 실행 시에는 인터프리터가 주로 사용된다.
결론
- 자바는 인터프리터 언어이자 컴파일러 언어다.
- 컴파일러 언어의 측면: JIT 컴파일러가 실행 시 기계어로 변환한다.
- 인터프리터 언어의 측면: 바이트코드를 인터프리터로 해석하며 실행한다.
- 이 두 가지 방식의 조합으로 플랫폼 독립성과 높은 성능을 모두 달성한다.