Bun(JS 런타임)이 Zig에서 Rust로 바이브 포팅되고 있음

1 week ago 11
  • Bun 창시자 Jarred Sumner가 Zig → Rust 포팅 가이드(PORTING.md)를 claude/phase-a-port 브랜치에 커밋하며, AI 에이전트를 활용한 대규모 언어 전환 실험이 공개됨
  • 포팅은 Phase A(파일 단위로 로직만 초벌 번역, 컴파일 불필요)와 Phase B(크레이트별 컴파일 통과)로 나뉘며, 약 300개의 타입·관용구 매핑 규칙을 LLM에게 제공하는 방식
  • Sumner 본인이 Hacker News에서 "리라이트를 확정한 것이 아니며, 이 코드가 전부 버려질 가능성이 높다"고 밝혀, 현 시점에서는 실험적 탐색 단계
  • 커뮤니티에서는 Anthropic 인수 이후 Zig의 AI 기여 금지 정책과의 충돌, Bun이 이미 Zig를 포크해 운영 중인 점, Rust 생태계의 안전성 이점 등이 배경으로 거론됨
  • PR 대부분이 @robobun(AI 봇)에 의해 자동 생성되고 CodeRabbitAI와 Claude가 리뷰하는 구조로 진행되어, AI 주도 대규모 코드 마이그레이션의 현실적 가능성과 한계를 보여주는 사례

포팅 가이드(PORTING.md) 핵심 구조

  • 포팅 대상은 Zig 파일 하나를 동일 디렉토리에 .rs 파일로 변환하는 것이며, Phase A에서는 로직의 충실한 재현이 목표이고 컴파일 여부는 무관
  • tokio, rayon, hyper, async-trait, std::fs, std::net 등 외부 비동기·I/O 크레이트 사용 금지 — Bun이 자체 이벤트 루프와 시스콜을 소유하기 때문
  • async fn 금지, 모든 비동기 처리는 Zig와 동일하게 콜백 + 상태 머신 방식 유지
  • 확신할 수 없는 부분은 // TODO(port):로, 성능 관련 Zig 관용구는 // PERF(port):로 표시하여 Phase B에서 처리

타입·관용구 매핑 규칙

  • []const u8 → &[u8](절대 &str 아님), ?T → Option<T>, anyerror!T → Result<T, bun_core::Error> 등 약 50개 이상의 타입 매핑 테이블 제공
  • defer x.deinit() → 삭제 후 impl Drop으로 대체, errdefer → scopeguard 사용, comptime → const generic·const fn·macro_rules!로 변환
  • 문자열은 바이트 기반 처리 원칙: std::string::String이나 &str 사용을 금지하고 &[u8]/Vec<u8> 사용 — Bun이 WTF-8과 임의 바이트를 다루기 때문
  • @intCast → T::try_from(x).unwrap()(항상 검사), @truncate → x as T(의도적 래핑), @bitCast → transmute 등 Zig 내장 함수별 Rust 대응 정리

크레이트 맵과 소유권 모델

  • @import("bun").X 등 Zig 네임스페이스를 bun_str, bun_sys, bun_jsc, bun_alloc 등 약 30개 Rust 크레이트에 1:1 매핑
  • AST/파서 크레이트는 bumpalo::Bump 아레나 유지, 그 외 크레이트는 글로벌 mimalloc 할당자 사용으로 allocator 파라미터 삭제
  • bun.ptr.Owned → Box<T>, bun.ptr.Shared → Rc<T>, bun.ptr.AtomicShared → Arc<T> 등 포인터 소유권 매핑

커뮤니티 반응 (Lobsters·HN)

  • "정말 Rust로 전환하려는 건지, Anthropic LLM의 쇼케이스인지" 의문을 제기하는 의견 다수
  • Zig의 AI 기여 금지 정책과 Anthropic의 AI 중심 개발 워크플로 간 충돌이 배경일 수 있다는 추측, 다만 음모론 수준이라는 자평도 함께 존재
  • 약 300개 규칙을 LLM이 충실히 따를 수 있는지에 대한 회의적 시각 — "~16k 토큰이라 서브에이전트에게는 적당하다"는 긍정적 평가도 병존
  • "Phase A에서 컴파일 안 되는 코드를 먼저 만드는 접근이 기존 코딩 에이전트 사용법과 정반대"라는 흥미로운 관찰
  • Bun의 Zig 포크 유지 부담, Zig의 잦은 브레이킹 체인지, 아직 베타 단계인 언어에 핵심 제품을 의존하는 리스크 등이 전환 동기로 언급됨
Read Entire Article