Ahead-of-Time 컴파일을 적용한 실험적인 Bun + JSC 미리보기
요약
본 글은 Bun과 JSC에 Ahead-of-Time (AOT) 컴파일을 적용한 실험적인 미리보기를 다룹니다. AOT는 코드를 실행 전에 컴파일하여 시작 속도 향상, 메모리 및 CPU 사용량 감소 등의 이점을 제공합니다. 다만, TypeScript의 유연성 때문에 타입 정보 전파에 어려움이 있으며, 더 많은 최적화가 필요함을 언급합니다.
핵심 포인트
- AOT 컴파일 적용으로 시작 속도가 24% 향상되고 리소스 사용량이 크게 감소했습니다.
- TypeScript의 유연한 타입 시스템은 AOT 컴파일 시 성능 최적화를 어렵게 만드는 요인입니다.
- 향후 uint32_t 같은 크기 지정 타입 지원 및 바이트코드 최적화가 필요합니다.
Claude Code의 CLI용: 시작 속도 24% 향상, 메모리 사용량 48% 감소, CPU 사용량 46% 감소, 바이너리 크기는 거의 2배 증가
대부분의 JavaScript 사용은 Just-in-Time (JIT) 컴파일됩니다.
코드가 실행됨에 따라 값의 타입이 감지되고, 함수가 충분히 자주 실행되면 해당 함수의 더 빠른 전문화된 버전이 온디맨드(on-demand)로 컴파일됩니다.
Ahead of Time (AOT) 컴파일은 이러한 작업을 실행 파일 자체에 포함시킵니다.
Ahead of time 컴파일의 비용은 타입에 대한 정보가 적다는 것입니다.
Rust나 Go 같은 네이티브 언어에서는 숫자가 double 또는 int, 부호(sign), 크기 등을 지정합니다.
TypeScript는 더 유연하고 덜 구체적이어서 성능 최적화가 어렵습니다.
이 프로토타입에서는 타입 정보를 전파하기 위해 제한된 양의 TypeScript 문법을 사용했습니다.
일반적으로, ahead of time 컴파일은 just-in-time 컴파일보다 느린 최고 JavaScript 실행 속도를 초래합니다.
우리는 더 엄격한 flavor의 TypeScript를 사용하고 Array 및 Object 같은 내장 기능(builtins)에 대한 수정을 제한함으로써 대부분의 격차를 좁힐 수 있다고 생각합니다.
아직 구현되지 않은 최적화가 많이 있습니다.
바이너리 크기 증가 폭을 훨씬 더 줄이고 싶습니다 (1 GB에서 시작했습니다).
uint32_t와 같은 크기 지정 타입(sized types)을 지원하고 더 상세한 타입을 전파해야 합니다.
별도의 검사기(checker)를 실행할 수 없고 진단 기능도 없습니다.
AOT는 Bun의 bundler 및 parser를 사용하여 typescript를 파싱하고, typecheck bytecode intrinsic을 통해 JSC에 태그하며, B3 (JSC가 JIT에 사용하는 것)를 통해 바이트코드를 기계 코드로 컴파일합니다.
이는 JavaScriptCore 변경 사항이 잘 격리되도록 유지하여, 업스트림 WebKit과의 동기화(syncing)를 돕습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 X 토픽: Claude/Anthropic의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기