C++로 만든 인터프리터, 16배 빨라지다!
AST-walking 인터프리터인 Zef의 성능 개선을 위해 다양한 최적화 기법을 적용
값 표현 방식(Value Representation), 인라인 캐싱(Inline Caching), 객체 모델(Object Model) 등 핵심 기술을 활용하여 성능 향상
최적화 과정을 통해 Zef 인터프리터가 Lua, QuickJS, CPython과 경쟁 가능한 수준으로 발전
Fil-C++ 컴파일러 사용으로 인한 성능 저하를 감안하고도 16배 이상의 속도 향상을 달성
AST-walking 인터프리터의 성능 병목 지점 분석
저자는 Zef 인터프리터의 성능 개선을 위해 AST(Abstract Syntax Tree) 기반의 인터프리터에서 발생하는 병목 지점을 분석했다. 초기 인터프리터는 문자열 기반의 해시 테이블(Hashtable)을 광범위하게 사용하고, 재귀 호출을 통해 스코프 체인을 탐색하는 방식으로 구현되어 있었다. 이러한 설계는 변수 접근, 함수 호출, 메서드 호출 등 다양한 연산에서 성능 저하(Performance Bottleneck)를 유발하는 주요 원인으로 작용했다.
값 표현 방식 및 인라인 캐싱을 통한 최적화
저자는 값 표현 방식(Value Representation)을 개선하여 숫자 연산의 속도를 높이고, 인라인 캐싱(Inline Caching) 기법을 도입하여 객체 접근 속도를 향상시켰다. 특히, 객체 모델(Object Model)을 재설계하여 객체 할당 비용을 줄이고, 해시 테이블 탐색을 최소화했다. 이러한 변화는 런타임 시 메서드 호출(Method Call)의 효율성을 크게 개선하는 결과를 가져왔다.
Fil-C++ 컴파일러의 한계와 극복
저자는 Fil-C++ 컴파일러를 사용하여 개발 속도를 높였지만, Fil-C++의 성능 저하(Performance Degradation)로 인해 초기에는 성능상의 불리함을 안고 시작했다. 하지만, 다양한 최적화 기법을 통해 Fil-C++의 한계를 극복하고, Lua, QuickJS, CPython과 경쟁할 수 있는 수준의 성능을 달성했다. 이는 컴파일러의 제약에도 불구하고, 아키텍처 설계(Architecture Design)와 알고리즘 최적화(Algorithm Optimization)를 통해 성능을 극대화할 수 있음을 보여준다.
다양한 최적화 기법의 효과 및 트레이드오프
저자는 직접 연산자 호출, RMW(Read Modify Write) 연산자, 심볼 사용, 인라인 캐싱, 인자 최적화 등 다양한 최적화 기법을 적용하여 Zef 인터프리터의 성능을 단계적으로 개선했다. 각 최적화 기법은 특정 연산의 속도를 향상시키는 데 기여했으며, 특히 객체 모델(Object Model)과 인라인 캐싱(Inline Caching)의 결합은 획기적인 성능 향상을 가져왔다. 하지만, 이러한 최적화 과정에서 코드 복잡도가 증가하고, 유지보수성이 저하될 수 있다는 트레이드오프(Trade-offs)가 발생할 수 있다.