tracing JIT
tracing JIT
Section titled “tracing JIT”tracing JIT(TraceMonkey, LuaJIT 등)은 인터프리터가 실행되는 동안 자주 반복되는 경로(hot loop)를 감지하고, 그 경로에서 실제로 실행된 명령어들의 흐름(trace)을 기록해서 그것을 기계어로 컴파일한다.
분기가 없는 straight-line code라 최적화가 쉽고, 실제 실행 데이터(타입, 값)를 기반으로 하니 정확도가 높다.
Meta-tracing JIT
Section titled “Meta-tracing JIT”Meta-tracing JIT는 특정 언어를 위한 tracing JIT를 직접 만드는 게 아니라, 인터프리터를 트레이싱해서 JIT를 자동으로 만들어내는 상위 계층이다.
- 언어 구현자는 그 언어의 인터프리터를 (RPython 같은 제한된 언어로) 작성한다.
- Meta-tracing 프레임워크가 그 인터프리터 자체의 실행을 트레이싱한다. 즉 “이 언어 프로그램의 hot loop”이 아니라 “인터프리터가 이 hot loop를 해석하는 동안 사ㅓ용한 인터프리터 레벨의 명령어들”을 추적한다.
- 이 트레이스에서 인터프리터의 오버헤드(디스패치, 스택 관리 등)를 제거하고, 실제 사용자 프로그램의 로직만 남겨서 기계어로 컴파일한다.
즉 “인터프리터를 인터프리터하는 게 아니라, 인터프리터가 인터프리터할 때 생기는 트레이스를 컴파일”하는 한 단계 위의 추상화이다.
이 방식이 유용한 이유는 다음과 같다.
- 언어 구현자는 JIT 컴파일러 자체를 만들 필요 없이 인터프리터만 작성하면 된다. JIT는 프레임워크가 자동으로 생성해주기 때문이다.
jit_merge_point,promote같은 소수의 힌트(annotation)만 인터프리터 코드에 넣어주면, 프레임워크가 어디서 트레이스를 시작/병합할지 판단한다.- 결과적으로 인터프리터 구현 하나로 JIT의 효과를 같이 누릴 수 있다.
예시
- PyPy: Python 인터프리터를 RPython으로 작성 → RPython의 meta-tracing JIT(트레이싱 프레임워크)가 PyPy용 JIT을 자동 생성한다.
- 같은 프레임워크로 Prolog, Smalltalk 등 다른 언어용 인터프리터도 만들면 동일한 메커니즘으로 JIT을 얻을 수 있다 (실제로 RPython 기반 여러 언어 구현체가 존재)
참고