.java) 작성javac).class) 로 아직 컴퓨터가 읽을 수 없는, JVM이 이해할 수 있는 코드💡 Opcode는 수행할 작업(명령)이고 피연산자는 그 작업을 수행할 대상(데이터)라고 생각하면 된다.
인터프리터
JIT 컴파일러 (Just-In-Time Compiler)
자바는 실행 과정에서 1. 바이트 코드로 컴파일하는 과정과 2. 바이트 코드를 인터프리터하는 방식 2가지를 진행한다.
초창기 자바는 인터프리터 방식으로만 바이트 코드를 한 줄씩 번역했기 때문에 컴파일만 하는 언어(C, C++)나 인터프리터만 하는 언어(Python)보다 느렸다.
이러한 느린 속도를 개선하기 위해 JIT 컴파일러가 도입되었고 인터프리터와 함께 혼합해서 사용된다.
즉 JIT 컴파일러는 프로그램의 실행 시점, 즉 런타임에 바이트 코드를 기계어로 변환하는 컴파일러다.
프로그램이 실행될 때, JIT 컴파일러는 자주 호출되는 코드인 Hot Spot을 감지하고, 미리 해당 시스템에 맞는 네이티브 코드로 컴파일하여 캐시에 저장해둠
이후 동일한 코드가 호출되면, 인터프리터가 다시 해석하는 대신 캐시에 저장된 네이티브 코드를 바로 가져와 실행
➡️ 이와 같이 반복되는 코드에 대해 인터프리팅 과정을 생략하고 최적화된 네이티브 코드를 직접 실행하기 때문에, 프로그램의 전체적인 실행 속도를 크게 향상시킬 수 있는 것이다.
JIT 컴파일러가 수행하는 여러 최적화 기법 중 가장 대표적인 것은 메서드 인라이닝(Method Inlining)이다.
메서드를 호출하고 반환하는 과정에는 보이지 않는 비용이 발생한다. 예를 들면, 새로운 스택 프레임을 만들고, 파라미터를 복사하고, 실행 흐름을 점프하는 등의 작업이 필요하다.
인라이닝은 자주 호출되지만 내용이 짧은 메서드의 코드를, 해당 메서드를 호출하는 부분에 그대로 복사하여 삽입하는 기법이다.
int add(int a, int b) {
return a + b;
}
void calculate() {
int sum = 0;
for (int i = 0; i < 10000; i++) {
sum = add(sum, i); // 반복문 안에서 add 메서드가 계속 호출됨
}
}
calculate 메서드는 루프를 돌 때마다 add 메서드를 10,000번 호출하고 반환하는 과정을 반복한다.
// JIT 컴파일러에 의해 최적화된 내부 코드 (실제 코드가 이렇게 바뀌는 것은 아님)
void calculate() {
int sum = 0;
for (int i = 0; i < 10000; i++) {
sum = sum + i; // add 메서드 호출 대신 코드가 직접 삽입됨
}
}
JIT 컴파일러는 add 메서드가 매우 자주 호출되는 것을 감지하고, 그 내용이 간단하다는 것을 파악한다. 이후 calculate 메서드를 다음과 같이 내부적으로 변환한다.
이렇게 하면 메서드 호출에 따르는 부가적인 비용이 완전히 사라지게 되어 실행 속도가 크게 향상된다. 이 외에도 JIT 컴파일러는 루프 최적화, 불필요한 코드 제거 등 다양한 최적화를 수행한다.
WORA는 한 번 작성하면, 어디서든 실행된다는 의미로, 자바의 가장 핵심적인 철학이자 장점을 나타내는 표어다.
일반적으로 C나 C++과 같은 언어는 소스 코드를 컴파일하면 특정 운영체제와 CPU 아키텍처에 종속적인 기계어가 생성된다. 예를 들어, 윈도우 환경에서 컴파일한 실행 파일(.exe)은 리눅스나 맥 환경에서 실행할 수 없다. 따라서 다른 환경에서 실행하려면 해당 환경에 맞게 소스 코드를 다시 컴파일해야 한다.
하지만 자바는 자바 가상 머신(JVM)이라는 중간 계층을 둠으로써 이러한 문제를 해결했다.
자바 개발자는 운영체제가 아닌 JVM을 목표로 코드를 작성하고 컴파일하여 플랫폼에 독립적인 바이트 코드(.class)를 생성한다. 썬 마이크로시스템즈(현재 오라클)는 윈도우용, 리눅스용, 맥용 등 각 운영체제에 맞는 JVM을 미리 만들어 배포한다.
사용자는 자신의 운영체제에 맞는 JVM만 설치하면, 어떤 환경에서 컴파일되었는지에 상관없이 동일한 바이트 코드 파일을 가져와 실행할 수 있다.
결론적으로, JVM이 설치된 환경이라면 어디서든지 자바 프로그램을 수정 없이 바로 실행할 수 있게 되는 것이 WORA의 핵심 개념이다.