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