자바스크립트 JIT 컴파일링 원리
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 대상자: 웹 개발자, JavaScript 엔진 최적화에 관심 있는 개발자
- 난이도: 중간 (JavaScript 엔진 기초 지식 필요)
핵심 요약
- JIT 컴파일링: 자바스크립트는 인터프리터(예: V8의 Ignition)와 JIT 컴파일러(예: V8의 TurboFan)의 협업으로 핫 코드(자주 실행되는 함수)를 최적화된 머신 코드로 변환
- Hidden Classes(Shape): 동적 객체에서 속성 순서 일관성으로 메모리 오프셋 고정 → 속성 접근 최적화
- Inline Caching(ICS): Monomorphic (하나의 hidden class) > Polymorphic (다양한 hidden class) > Megamorphic (성능 저하)의 정리된 접근 패턴
섹션별 세부 요약
1. 파싱(Parsing)
- JS 코드를 AST(추상 구문 트리)로 변환
- 예:
function Foo() { this.x = 10; }
→ AST 생성
2. 인터프리터(Interpreter)
- AST를 바이트코드(예: V8의 Ignition)로 실행
- 초기 실행 시 속성 접근 및 호출 패턴 분석
3. 프로파일링(Profiling)
- 핫 코드(자주 실행되는 함수/루프) 식별
- 예:
printX(a)
→a.x
접근 빈도 기록
4. JIT 컴파일러(JIT Compiler)
- Runtime Feedback 기반 최적화
- 예:
TurboFan
은a.x
접근을 메모리 오프셋으로 변환
5. Deoptimization
- 객체 구조 변경 (예:
d.y = 10
) → Inline Cache 무효화 - 최적화된 코드가 무효화되면 인터프리터로 복귀
6. Hidden Classes(Shape)
- 속성 순서 일관성 → 동일한 hidden class 할당
- 예:
```javascript
var a = { x: 1 };
var b = { x: 2 }; // a와 b는 동일한 hidden class
var c = { y: 3, x: 4 }; // 속성 순서 변경 → 새로운 hidden class
```
7. Inline Caching
- Monomorphic: 동일한 hidden class → 가장 빠른 접근
- Polymorphic: 여러 hidden class → 캐시 확장 필요
- Megamorphic: 많은 hidden class → 캐시 미스, 느림
결론
- 속성 순서 일관성 유지 → hidden class 최적화
- Inline Cache 성능은 Monomorphic > Polymorphic > Megamorphic 순으로 관리
- 동적 속성 추가는 최적화 무효화 → Deoptimization 발생 가능