TurboFan JIT 분석하기
지난주에는 특정 유형의 자바스크립트에 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이 숫자 계산 코드를 훨씬 더 잘 이해할 수 있도록 도와줍니다. 그래프 기반의 IR은 대부분의 최적화를 간단한 로컬 축소로 표현할 수 있게 하며, 이는 독립적으로 작성하고 테스트하기 더 쉽습니다. 최적화 엔진은 이러한 로컬 규칙을 체계적이고 철저하게 적용합니다. 그래픽 표현에서 벗어나는 과정에서는 재정렬 자유를 활용해 코드가 루프 밖으로 이동하거나 덜 자주 실행되는 경로로 이동하도록 하는 혁신적인 스케줄링 알고리즘을 사용합니다. 마지막으로 복잡한 명령 선택과 같은 아키텍처별 최적화는 각 대상 플랫폼의 특성을 활용하여 최고 품질의 코드를 제공합니다.
새 수준의 성능 전달
TurboFan을 통해 이미 훌륭한 속도 향상을 보고 있지만, 해야 할 일이 아직 많습니다. 더 많은 최적화를 활성화하고 더 다양한 코드 유형에 TurboFan을 적용하면서 계속 지켜봐 주세요!