본문으로 건너뛰기

TurboFan JIT 분석하기

· 약 3분
Ben L. Titzer, 소프트웨어 엔지니어 및 TurboFan 메카닉

지난주에는 특정 유형의 자바스크립트에 TurboFan을 활성화했다고 발표했습니다. 이번 포스트에서는 TurboFan의 설계에 대해 더 깊이 파고들어 보고자 합니다.

성능은 항상 V8 전략의 핵심이었습니다. TurboFan은 최첨단 중간 표현과 다층 번역 및 최적화 파이프라인을 결합하여 이전 CrankShaft JIT에서 가능했던 것보다 더 높은 품질의 기계 코드를 생성합니다. TurboFan의 최적화는 더 많고, 더 정교하며, CrankShaft보다 더 철저히 적용되어 유동적 코드 이동, 제어 흐름 최적화 및 정밀한 수치 범위 분석을 가능하게 합니다. 이러한 모든 것들은 이전에는 도달할 수 없었던 것입니다.

계층 구조​

컴파일러는 시간이 지남에 따라 새로운 언어 기능을 지원하고, 새로운 최적화를 추가하며, 새로운 컴퓨터 아키텍처를 목표로 하면서 복잡해지기 마련입니다. TurboFan에서는 많은 컴파일러에서 배운 교훈을 적용하여 시간이 지남에 따라 이러한 요구를 처리할 수 있도록 계층 구조를 개발했습니다. 소스 수준 언어(JavaScript), VM의 기능(V8) 및 아키텍처의 복잡성(x86부터 ARM, MIPS까지) 간의 명확한 분리로 더 깨끗하고 견고한 코드를 제공합니다. 계층화는 최적화 및 기능을 구현할 때 컴파일러 작업자가 로컬에서 합리적으로 생각할 수 있도록 하며 더 효과적인 단위 테스트를 작성할 수 있게 해줍니다. 또한 코드 양도 줄어듭니다. TurboFan이 지원하는 7가지 대상 아키텍처 중 각 아키텍처는 3,000줄 미만의 플랫폼별 코드가 필요합니다. 이는 CrankShaft의 13,000~16,000줄과 비교하여 훨씬 줄어든 양입니다. 이를 통해 ARM, Intel, MIPS 및 IBM의 엔지니어들이 TurboFan에 훨씬 더 효과적으로 기여할 수 있었습니다. TurboFan은 JavaScript 프론트엔드와 아키텍처에 의존하는 백엔드를 분리하는 유연한 설계를 통해 ES6의 모든 미래 기능을 더 쉽게 지원할 수 있습니다.

더 정교한 최적화​

TurboFan JIT은 더 발전된 기술을 통해 CrankShaft보다 더 적극적인 최적화를 구현합니다. 자바스크립트는 주로 비최적화된 형태로 컴파일러 파이프라인에 들어가며 점진적으로 낮은 형태로 변환되고 최적화되어 기계 코드가 생성됩니다. 설계의 중심은 코드의 보다 능동적인 sea-of-nodes 내부 표현(IR)을 사용하는 것으로, 이는 더 효과적인 재배열 및 최적화를 가능하게 합니다.

TurboFan 그래프 예시

수치 범위 분석은 TurboFan이 숫자 계산 코드를 훨씬 더 잘 이해할 수 있도록 도와줍니다. 그래프 기반의 IR은 대부분의 최적화를 간단한 로컬 축소로 표현할 수 있게 하며, 이는 독립적으로 작성하고 테스트하기 더 쉽습니다. 최적화 엔진은 이러한 로컬 규칙을 체계적이고 철저하게 적용합니다. 그래픽 표현에서 벗어나는 과정에서는 재정렬 자유를 활용해 코드가 루프 밖으로 이동하거나 덜 자주 실행되는 경로로 이동하도록 하는 혁신적인 스케줄링 알고리즘을 사용합니다. 마지막으로 복잡한 명령 선택과 같은 아키텍처별 최적화는 각 대상 플랫폼의 특성을 활용하여 최고 품질의 코드를 제공합니다.

새 수준의 성능 전달​

TurboFan을 통해 이미 훌륭한 속도 향상을 보고 있지만, 해야 할 일이 아직 많습니다. 더 많은 최적화를 활성화하고 더 다양한 코드 유형에 TurboFan을 적용하면서 계속 지켜봐 주세요!