Rewriting Bun in Rust
Bun 프로젝트를 Rust로 재작성하는 작업은 안정성과 안전성을 개선하기 위해 진행되었습니다. Bun은 원래 esbuild의 JavaScript 및 TypeScript 트랜스파일러를 Go에서 Zig로 포팅하여 시작되었으며, 이 과정에서 개발자는 Zig를 사용하여 코드를 작성했습니다. 이 작업은 Bun이 가진 메모리 누수, 레이스 조건, 사용 후 해제 오류와 같은 여러 버그를 해결하고 시스템의 안정성을 확보하는 데 중점을 두었습니다.
Bun의 초기 버전에서 발견된 메모리 누수와 사용 후 해제 오류들은 특히 `crypto.scrypt`, `tlsSocket`, `fs.watch` 등에서 발생했으며, 이는 시스템의 안정성에 심각한 영향을 미쳤습니다. 개발팀은 이러한 문제를 해결하기 위해 Zig 컴파일러에 Address Sanitizer 지원을 추가하고, Fuzzilli와 같은 도구를 사용하여 런타임 API를 지속적으로 퍼징하는 방식으로 안전성을 강화했습니다.
이러한 재작성 작업은 Bun의 기능 범위(JavaScript, TypeScript 트랜스파일러, 번들러, 패키지 관리자 등)를 유지하면서 Rust의 장점을 활용하는 데 중점을 두었습니다. 결과적으로 Bun은 메모리 사용량을 줄이고 바이너리 크기를 축소하며, 생산 배포의 유지보수성을 향상시켰습니다.
현재 Bun v1.4에서는 Rust의 장점을 더욱 활용하여 속도와 안정성을 개선하는 데 집중하고 있습니다. Rust의 borrow checker, Miri, LeakSanitizer, 그리고 지속적인 커버리지 기반 퍼징을 통해 시스템 안정성을 체계적으로 향상시키고 있습니다. 이 재작성 과정은 단 한 명의 엔지니어가 11일 만에 테스트 스위트 전체를 통과시키는 등 개발 효율성도 크게 높였습니다.
Bun의 초기 버전에서 발견된 메모리 누수와 사용 후 해제 오류들은 특히 `crypto.scrypt`, `tlsSocket`, `fs.watch` 등에서 발생했으며, 이는 시스템의 안정성에 심각한 영향을 미쳤습니다. 개발팀은 이러한 문제를 해결하기 위해 Zig 컴파일러에 Address Sanitizer 지원을 추가하고, Fuzzilli와 같은 도구를 사용하여 런타임 API를 지속적으로 퍼징하는 방식으로 안전성을 강화했습니다.
이러한 재작성 작업은 Bun의 기능 범위(JavaScript, TypeScript 트랜스파일러, 번들러, 패키지 관리자 등)를 유지하면서 Rust의 장점을 활용하는 데 중점을 두었습니다. 결과적으로 Bun은 메모리 사용량을 줄이고 바이너리 크기를 축소하며, 생산 배포의 유지보수성을 향상시켰습니다.
현재 Bun v1.4에서는 Rust의 장점을 더욱 활용하여 속도와 안정성을 개선하는 데 집중하고 있습니다. Rust의 borrow checker, Miri, LeakSanitizer, 그리고 지속적인 커버리지 기반 퍼징을 통해 시스템 안정성을 체계적으로 향상시키고 있습니다. 이 재작성 과정은 단 한 명의 엔지니어가 11일 만에 테스트 스위트 전체를 통과시키는 등 개발 효율성도 크게 높였습니다.