Java

[JVM 밑바닥까지 파헤치기] 8-2. 바이트코드 실행 엔진: 바이트코드 해석

noahkim_ 2024. 12. 24. 02:16

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다

 

  • JVM 실행 엔진은 해석 실행과 컴파일 실행 두가지 방법으로 코드를 실행함 (선택 가능)

 

1. 해석 실행

단계 인터프리터 방식 컴파일러 방식
1. 어휘 분석 소스코드를 토큰 단위로 분리 동일
2. 구문 분석 문법 규칙에 맞는 구조로 변환 동일
3. 추상 구문 트리(AST) 코드의 구조를 트리 형태로 구성 동일
4. 실행 🔁 인터프리터가 AST를 순차적으로 실행
🔁 중간 코드 → 최적화 → 목적 코드로 변환 후 실행
최적화 여부 거의 없음 / 제한적
컴파일 단계에서 다양한 수준의 최적화 수행
실행 결과 한 줄씩 바로 실행 → 느리지만 즉각적 결과 확인 가능
실행 전 전체 코드 컴파일 필요 → 실행 속도 빠름
대표 언어 Python, JavaScript, Ruby 등 C, C++, Rust 등

 

2. 명령어 집합

구분 스택 기반 (Stack-based)
레지스터 기반 (Register-based)
명령어 구조 피연산자 스택 이용
명령어는 주로 1개의 작업만 수행
레지스터에 직접 연산
2개 이상의 매개변수 포함 가능
실행 흐름 피연산자 스택에서 값을 꺼내 연산하고 다시 푸시
레지스터 간 직접 연산 수행
장점 ✅ 이식성 뛰어남: 하드웨어 독립적
✅ 명령어 구조 간단
✅ 연산 속도 빠름
✅ 메모리 접근 적음
단점 ❌ 실행 속도 느림: 스택 사용으로 메모리 접근이 많음
❌ 이식성 낮음: 하드웨어 구조에 종속됨
대표 사용 사례 JVM (Java), Python Bytecode, WebAssembly
CPU 머신 코드, C/C++ 컴파일 결과

 

예) 스택 기반

더보기
iconst_1
iconst_1
iadd
istore_0

 

예) 레지스터 기반

더보기
mov eax, 1
add eax, 1