자바스크립트(JavaScript) 런타임 Bun이 타입스크립트(TypeScript) 및 자바스크립트 코드를 실행 전에 네이티브 코드로 직접 컴파일하는 AOT(Ahead-of-Time) 컴파일러의 실험적 버전을 공개했습니다. 이는 기존의 `bun build --compile` 명령이 자바스크립트 번들과 Bun 런타임을 단일 실행 파일로 묶거나, `--bytecode` 명령이 자바스크립트코어(JavaScriptCore)의 바이트코드를 미리 생성하는 방식과는 다른, 보다 근본적인 성능 최적화를 목표로 합니다.
새로운 `--compile --aot` 방식은 타입스크립트의 타입 정보를 컴파일 과정에 적극적으로 활용하여 정적 검증과 코드 생성에 반영합니다. 예를 들어, `const port: number = "8080"`과 같이 컴파일 시점에 명확한 타입 오류는 빌드 단계에서 거부하여 실행 파일 생성을 막습니다. 또한, `JSON.parse()`와 같이 런타임에 들어오는 데이터에 대해서는 선언된 인터페이스와 일치하는지 검사하여 타입 안정성을 확보하며, `as` 키워드의 동작을 실제 형변환으로 변경하여 `("5" as number) + 1`이 `6`을 반환하게 합니다. `x!`와 같은 Non-null assertion도 런타임 검사로 동작해 값이 `null` 또는 `undefined`일 경우 오류를 발생시킵니다.
이 AOT 컴파일러는 타입 안정성을 유지하기 위해 객체 모델에도 변화를 줍니다. `any` 타입을 거쳐 전달된 객체라도 타입이 지정된 함수에 전달되면 실제 필드 타입을 검증하고, 이미 타입이 지정된 객체의 필드를 `any`로 우회해 다른 타입의 값으로 변경하려는 시도를 차단합니다. `Object.prototype`에 속성을 주입하거나 `Array.prototype.map` 같은 내장 메서드를 교체하는 행위도 제한하여, 컴파일러가 객체 구조나 메서드 호출 대상을 안정적으로 가정하고 최적화할 수 있는 조건을 제공합니다. 이러한 제약은 성능 향상에 기여하지만, 기존 자바스크립트의 유연한 동적 특성 중 일부를 변경하므로 완전한 하위 호환성을 제공하지는 않습니다.
이번 실험은 Bun이 런타임 성능과 안정성 측면에서 한계를 돌파하려는 매우 급진적인 시도로 볼 수 있습니다. 타입스크립트의 타입 시스템을 컴파일 과정에 깊이 통합함으로써, 런타임 오류를 줄이고 실행 속도를 향상시킬 잠재력을 가집니다. 하지만 `as` 키워드의 의미 변경이나 프로토타입 변경 제한 등은 기존 자바스크립트 개발자들에게는 다소 생소하거나 불편하게 느껴질 수 있어, 커뮤니티의 수용 여부가 중요할 것입니다. 이러한 변화는 더 빠르고 안정적인 애플리케이션 개발 환경을 제공할 수 있지만, 동시에 자바스크립트 생태계의 표준적인 동작 방식과 거리가 멀어질 수 있다는 도전 과제를 안고 있습니다.