Ant: 처음부터 구축된 경량 JavaScript 런타임

JavaScript 런타임 환경은 종종 Node.js, Bun, Deno와 같은 거물들에 의해 지배되며, 이들은 모두 V8이나 JavaScriptCore와 같은 거대한 엔진에 의존합니다. 이러한 엔진들은 엄청난 성능을 제공하지만, 바이너리 크기와 메모리 오버헤드라는 상당한 비용을 수반합니다. 현대적인 CLI 도구와 컨테이너화된 애플리케이션을 괴롭히는 "runtime bloat"를 제거하기 위해 특별히 설계된 처음부터 구축된 JavaScript 런타임인 Ant를 소개합니다.

최소주의적 런타임 설계 철학

대부분의 현대적 런타임은 기존 브라우저 엔진을 래퍼(wrapper)로 사용합니다. 이러한 방식은 빠른 개발과 높은 성능을 가능하게 하지만, 바이너리 크기가 종종 50MB에서 100MB에 이르는 결과를 초래합니다. CLI 도구나 경량 Docker 컨테이너를 배포하는 개발자들에게 이러한 오버헤드는 상당한 병목 현상입니다.

Ant는 "Ant Silver"라고 불리는 자체 엔진을 처음부터 구현함으로써 다른 접근 방식을 취합니다. V8, JSC, 또는 SpiderMonkey에 대한 의존성을 피함으로써, 저자는 바이너리 크기를 놀라울 정도로 작게 유지할 수 있었습니다: 표준 빌드에서는 약 9MB이며, -Os 최적화로 컴파일할 경우 6.5MB까지 낮아집니다.

성능 및 콜드 스타트

더 작은 런타임의 주요 장점 중 하나는 콜드 스타트 지연 시간을 줄이는 것입니다. 이는 특히 첫 실행 시간이 가장 눈에 띄는 성능 지표인 서버리스 환경이나 CLI 애플리케이션에서 매우 중요합니다.

M4 Pro 칩에서 Hono 콜드스타트 테스트(examples/npm/hono/bench-coldstart.js)를 사용하여 수행된 벤치마크에 따르면, Ant는 인상적인 속도를 보여줍니다:

  • 콜드 스타트 시간: ~5ms
  • 비교: Bun보다 약 2.4배 빠르고 Node.js보다 5.8배 빠릅니다.

저자는 Ant가 특정 형태와 시나리오에서 V8과 경쟁할 수 있을 만큼 성능이 뛰어나다고 언급했지만, 이것이 특화된 도구임을 인식하는 것이 중요합니다. 초점은 모든 가능한 JavaScript 워크로드에 대한 원시적이고 범용적인 처리량보다는 효율성과 민첩성에 맞춰져 있습니다.

기술적 아키텍처 및 호환성

처음부터 런타임을 구축하는 것은 언어 사양 및 API 호환성에 대한 엄격한 접근 방식이 필요합니다. Ant는 다음과 같은 기술적 이정표에 집중합니다:

엔진 및 JIT

Ant Silver는 런타임을 구동하는 핵심 엔진입니다. 향후 성능 향상을 보장하기 위해, 프로젝트는 현재 MIR(Mid-level Intermediate Representation)의 포크를 백엔드로 사용하는 JIT(Just-In-Time) 컴파일러를 구현하고 있습니다.

표준 준수

실제 환경에서의 유용성을 보장하기 위해, Ant는 서로 다른 런타임 간에 작동하는 표준화된 API 세트를 목표로 하는 WinterCG Minimum Common API를 목표로 합니다. 현재 호환성 상태는 다음과 같습니다:

  • javascript-zoo compat-table: 100% 통과율.
  • test262: 약 64% 완료.

Ant의 사용 사례

Ant는 거대한 엔터프라이즈 백엔드를 위해 Node.js를 대체하려는 의도라기보다는, 특정 아키텍처적 요구 사항을 위한 중요한 간극을 것을 채웁니다:

  1. 임베디드 CLI 도구: 사용자가 무거운 런타임 환경을 설치할 필요 없이 JavaScript 기반의 CLI를 배포합니다.
  2. Micro-Containers: 클라우드 네이티브 환경에서 배포 및 확장을 가속화하기 위해 Docker 이미지의 크기를 줄입니다.
  3. Edge Computing: 밀리초 단위가 중요한 이벤트 기반 함수를 위해 초고속 콜드 스타트 시간을 활용합니다.

바이너리 크기와 시작 속도를 우선시함으로써, Ant는 전통적인 엔진의 부담 없이 JavaScript의 유연성을 필요로 하는 개발자들에게 실행 가능한 대안을 제공합니다.

Sources