피드로 돌아가기
Hacker NewsHacker News
Backend

단순 AST-walking 인터프리터를 67배 가속한 최적화 전략

How to Make a Fast Dynamic Language Interpreter

2026년 4월 21일24advanced

Context

초기 Zef 인터프리터는 Recursive AST walking 방식과 std::unordered_map 기반의 변수 조회를 사용하는 구조로 설계됨. String 기반의 잦은 Key lookup과 과도한 Heap allocation으로 인한 심각한 성능 병목 현상이 발생함.

Technical Solution

  • NaN tagging 기법을 적용한 64-bit Tagged Value 설계로 숫자형 데이터의 Heap allocation 제거 및 타입 판별 속도 최적화
  • Inline caching 도입을 통한 반복적인 속성 조회 및 메서드 디스패치 비용의 획기적 감소
  • Object model 재설계를 통해 Hashtable 의존도를 낮추고 메모리 레이아웃 효율성 개선
  • Watchpoints 메커니즘을 활용하여 변경된 상태만 추적함으로써 불필요한 연산 제거
  • RTTI 및 libc++ hardening 비활성화를 통한 런타임 오버헤드 최소화 및 빌드 구성 최적화
  • Fil-C++에서 Yolo-C++로의 컴파일러 전환을 통한 기본 실행 환경의 성능 베이스라인 상향

Impact

  • 순수 최적화만으로 초기 대비 16.6배의 성능 향상 달성
  • Yolo-C++ 포팅 포함 시 최대 67배의 속도 개선 기록
  • CPython 3.10 대비 1.9배, QuickJS-ng 0.14.0 대비 3배 빠른 실행 속도 확보

Key Takeaway

JIT 컴파일러나 복잡한 GC 튜닝 없이도 Value representation과 Caching 전략 같은 기초적인 데이터 구조 최적화만으로 성능의 비약적 상승이 가능함.


- 동적 언어 구현 시 NaN tagging을 통한 Value representation 최적화 검토 - 빈번한 Map lookup 지점에 Inline caching 적용 가능성 확인 - 런타임 성능이 중요할 경우 RTTI 및 불필요한 표준 라이브러리 hardening 옵션 제거 - 프로토타이핑 단계의 고수준 추상화(AST walking)를 성능 중심의 구조로 단계적 전환

원문 읽기