<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bun on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/ko/tags/bun/</link><description>Recent content in Bun on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Wed, 06 May 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/ko/tags/bun/index.xml" rel="self" type="application/rss+xml"/><item><title>Bun이 Zig에서 Rust로 포팅 중이다 — Claude가 따라가는 30KB짜리 PORTING.md</title><link>https://ice-ice-bear.github.io/ko/posts/2026-05-06-bun-zig-to-rust-porting/</link><pubDate>Wed, 06 May 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/ko/posts/2026-05-06-bun-zig-to-rust-porting/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post Bun이 Zig에서 Rust로 포팅 중이다 — Claude가 따라가는 30KB짜리 PORTING.md" /&gt;&lt;h2 id="개요"&gt;개요
&lt;/h2&gt;&lt;p&gt;JavaScript 런타임 &lt;a class="link" href="https://bun.com" target="_blank" rel="noopener"
 &gt;Bun&lt;/a&gt;의 GitHub 레포 &lt;a class="link" href="https://github.com/oven-sh/bun" target="_blank" rel="noopener"
 &gt;oven-sh/bun&lt;/a&gt;에 &lt;a class="link" href="https://github.com/oven-sh/bun/tree/claude/phase-a-port" target="_blank" rel="noopener"
 &gt;&lt;code&gt;claude/phase-a-port&lt;/code&gt;&lt;/a&gt;이라는 의미심장한 이름의 브랜치가 올라왔다. 이 브랜치 안에는 &lt;a class="link" href="https://github.com/oven-sh/bun/blob/claude/phase-a-port/docs/PORTING.md" target="_blank" rel="noopener"
 &gt;&lt;code&gt;docs/PORTING.md&lt;/code&gt;&lt;/a&gt;라는 30KB+짜리 포팅 가이드가 들어 있고, 내용은 &lt;a class="link" href="https://ziglang.org/" target="_blank" rel="noopener"
 &gt;Zig&lt;/a&gt;로 짜인 Bun 코드베이스를 &lt;a class="link" href="https://www.rust-lang.org/" target="_blank" rel="noopener"
 &gt;Rust&lt;/a&gt;로 1:1 번역하기 위한 type map / idiom map / crate map이다. 브랜치 이름이 &lt;code&gt;claude/&lt;/code&gt;로 시작한다는 점에서 &lt;a class="link" href="https://www.anthropic.com/claude-code" target="_blank" rel="noopener"
 &gt;Anthropic Claude Code&lt;/a&gt;를 써서 자동 포팅 중일 가능성이 매우 높다.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR
 Zig[".zig 소스 트리"] --&gt; PhaseA["Phase A &amp;lt;br/&amp;gt; .zig 옆에 .rs 생성 &amp;lt;br/&amp;gt; 컴파일 안 돼도 OK"]
 Guide["docs/PORTING.md &amp;lt;br/&amp;gt; type/idiom/crate map"] --&gt; PhaseA
 Lifetimes["docs/LIFETIMES.tsv &amp;lt;br/&amp;gt; 필드별 소유권 클래스"] --&gt; PhaseA
 PhaseA --&gt; Markers["// TODO(port) &amp;lt;br/&amp;gt; // PERF(port) &amp;lt;br/&amp;gt; // PORT NOTE"]
 Markers --&gt; PhaseB["Phase B &amp;lt;br/&amp;gt; crate별 컴파일 통과 &amp;lt;br/&amp;gt; grep 한 번으로 일괄 처리"]
 PhaseB --&gt; Rust["bun_str / bun_sys &amp;lt;br/&amp;gt; bun_jsc / bun_uws &amp;lt;br/&amp;gt; bun_alloc / bun_bundler"]&lt;/pre&gt;&lt;h2 id="발견된-사실"&gt;발견된 사실
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/oven-sh/bun" target="_blank" rel="noopener"
 &gt;oven-sh/bun&lt;/a&gt; (89K+ stars, &amp;ldquo;Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one&amp;rdquo;)에 &lt;a class="link" href="https://github.com/oven-sh/bun/tree/claude/phase-a-port" target="_blank" rel="noopener"
 &gt;&lt;code&gt;claude/phase-a-port&lt;/code&gt;&lt;/a&gt; 브랜치가 살아 있다.&lt;/li&gt;
&lt;li&gt;그 안 &lt;a class="link" href="https://github.com/oven-sh/bun/blob/claude/phase-a-port/docs/PORTING.md" target="_blank" rel="noopener"
 &gt;&lt;code&gt;docs/PORTING.md&lt;/code&gt;&lt;/a&gt;는 Zig 코드를 Rust로 옮기기 위한 1:1 번역 가이드다. 분량은 수만 줄급, 완전한 type map / idiom map / crate map을 포함한다.&lt;/li&gt;
&lt;li&gt;Phase A의 목표는 명확하다. &lt;strong&gt;&amp;ldquo;draft &lt;code&gt;.rs&lt;/code&gt;가 &lt;code&gt;.zig&lt;/code&gt; 옆에 생긴다. 컴파일 안 돼도 OK. 로직만 정확하게.&amp;rdquo;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Phase B에서 crate-by-crate 컴파일 통과를 시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="왜-의미-있나"&gt;왜 의미 있나
&lt;/h2&gt;&lt;p&gt;Bun은 &lt;a class="link" href="https://ziglang.org/" target="_blank" rel="noopener"
 &gt;Zig&lt;/a&gt;로 만들어진 가장 큰 인프라 프로젝트다. 런타임, 번들러, 패키지 매니저까지 한 바이너리에 들어 있고 &lt;a class="link" href="https://bun.com" target="_blank" rel="noopener"
 &gt;홈페이지&lt;/a&gt;도 단일 도메인으로 통일됐다. Zig는 0.x 메이저 변경이 잦고 ABI/언어 안정성에서 reservation을 받는 언어인데, 그 위에 쌓인 가장 큰 코드베이스가 Rust로 옮겨가는 결정 자체가 &lt;strong&gt;industry signal&lt;/strong&gt;이다. Zig에서 Rust로 가는 포팅은 일반적이지 않은 방향이다.&lt;/p&gt;
&lt;p&gt;브랜치 이름이 &lt;code&gt;claude/phase-a-port&lt;/code&gt;라는 점은 강력한 단서다. 인간이 다 짜는 거라면 이런 식으로 네이밍하지 않는다. 이건 &lt;a class="link" href="https://www.anthropic.com/claude-code" target="_blank" rel="noopener"
 &gt;Claude Code&lt;/a&gt; 에이전트에게 &amp;ldquo;phase A를 너가 처리해라&amp;rdquo; 라고 던지는 형태에 가깝다.&lt;/p&gt;
&lt;h2 id="가이드의-구조-portingmd-발췌"&gt;가이드의 구조 (PORTING.md 발췌)
&lt;/h2&gt;&lt;h3 id="ground-rules"&gt;Ground rules
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.rs&lt;/code&gt;는 &lt;code&gt;.zig&lt;/code&gt;와 같은 디렉토리, 같은 basename&lt;/li&gt;
&lt;li&gt;크로스 area 타입은 &lt;code&gt;bun_&amp;lt;area&amp;gt;::Type&lt;/code&gt;으로 참조 (Phase B에서 Cargo.toml 와이어업)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;금지&lt;/strong&gt;: tokio, rayon, hyper, async-trait, futures, std::fs/net/process — Bun은 자체 이벤트 루프 + 시스템콜&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;금지&lt;/strong&gt;: &lt;code&gt;async fn&lt;/code&gt; — 모두 콜백 + 상태머신&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unsafe&lt;/code&gt;는 Zig가 unsafe였던 곳에서 OK. 모든 unsafe block에 &lt;code&gt;// SAFETY: &amp;lt;why&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;확신 안 서면 &lt;code&gt;// TODO(port): &amp;lt;reason&amp;gt;&lt;/code&gt; 남기기&lt;/strong&gt; — 추측보다 플래그가 낫다&lt;/li&gt;
&lt;li&gt;Zig의 perf 이디엄 (&lt;code&gt;appendAssumeCapacity&lt;/code&gt;, arena bulk-free, comptime monomorphization)은 평범한 Rust로 → &lt;code&gt;// PERF(port): ...&lt;/code&gt; 마킹 후 Phase B에서 grep + 벤치&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="crate-map-예시"&gt;Crate map (예시)
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Zig namespace&lt;/th&gt;
 &lt;th&gt;Rust crate&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bun.String&lt;/code&gt;, &lt;code&gt;bun.strings&lt;/code&gt;, &lt;code&gt;ZigString&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bun_str&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bun.sys&lt;/code&gt;, &lt;code&gt;bun.FD&lt;/code&gt;, &lt;code&gt;Maybe(T)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bun_sys&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bun.jsc&lt;/code&gt;, &lt;code&gt;JSValue&lt;/code&gt;, &lt;code&gt;JSGlobalObject&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bun_jsc&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bun.uws&lt;/code&gt;, &lt;code&gt;us_socket_t&lt;/code&gt;, &lt;code&gt;Loop&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bun_uws_sys&lt;/code&gt; / &lt;code&gt;bun_uws&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bun.allocators&lt;/code&gt;, &lt;code&gt;MimallocArena&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bun_alloc&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bun.shell&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bun_shell&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bun.bake&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bun_bake&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bun.install&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bun_install&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bun.bundle_v2&lt;/code&gt;, &lt;code&gt;Transpiler&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bun_bundler&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;MimallocArena&lt;/code&gt;는 &lt;a class="link" href="https://github.com/microsoft/mimalloc" target="_blank" rel="noopener"
 &gt;mimalloc&lt;/a&gt; 위에 올린 arena allocator고, &lt;code&gt;bun.uws&lt;/code&gt;는 Bun 자체 이벤트 루프(uSockets) 바인딩이다. 두 곳 모두 Rust 표준의 &lt;a class="link" href="https://tokio.rs/" target="_blank" rel="noopener"
 &gt;tokio&lt;/a&gt; 같은 async 런타임을 쓰지 않는다는 점이 결정적이다.&lt;/p&gt;
&lt;h3 id="type-map-예시"&gt;Type map (예시)
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Zig&lt;/th&gt;
 &lt;th&gt;Rust&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[]const u8&lt;/code&gt; (struct field)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;Box&amp;lt;[u8]&amp;gt;&lt;/code&gt; / &lt;code&gt;Vec&amp;lt;u8&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;amp;'static [u8]&lt;/code&gt; / 아레나 raw ptr&lt;/strong&gt; — &lt;code&gt;deinit&lt;/code&gt;을 보고 결정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[:0]const u8&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;amp;ZStr&lt;/code&gt; (length-carrying NUL-terminated)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;?T&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;anyerror!T&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Result&amp;lt;T, bun_core::Error&amp;gt;&lt;/code&gt; (Phase A 항상)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;comptime T: type&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt; (제네릭 + trait bound)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;comptime n: uN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;const N: uN&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;inline for&lt;/code&gt; over tuple&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;const [T; N]&lt;/code&gt; + &lt;code&gt;for&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;for (slice, 0..) |x, i|&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;for (i, x) in slice.iter().enumerate()&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;defer x.deinit()&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;삭제&lt;/strong&gt; — &lt;code&gt;impl Drop&lt;/code&gt;으로 암묵적 처리&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;errdefer alloc.free(x)&lt;/code&gt; (방금 만든 로컬)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;삭제&lt;/strong&gt; — &lt;code&gt;?&lt;/code&gt;가 알아서 drop&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;errdefer { side effects }&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a class="link" href="https://docs.rs/scopeguard/" target="_blank" rel="noopener"
 &gt;&lt;code&gt;scopeguard::guard(...)&lt;/code&gt;&lt;/a&gt; + 성공 경로에서 disarm&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="인상적인-미시-규칙"&gt;인상적인 미시 규칙
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bun_core::Error&lt;/code&gt;가 &lt;strong&gt;&lt;code&gt;#[repr(transparent)] NonZeroU16&lt;/code&gt;&lt;/strong&gt; — 힙 할당 없는 Copy 가능 에러 newtype + link-time 등록 name table. &lt;code&gt;anyhow::Error&lt;/code&gt; / &lt;code&gt;Box&amp;lt;dyn Error&amp;gt;&lt;/code&gt; 금지 이유는 heap-alloc, !Copy, &lt;code&gt;@errorName&lt;/code&gt; snapshot 호환성 깨짐.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bun.Wyhash11&lt;/code&gt;은 &lt;strong&gt;on-disk 호환성 때문에&lt;/strong&gt; &lt;code&gt;std.hash.Wyhash&lt;/code&gt; (seed 0)와 별개로 유지. lockfile, npm manifest cache, integrity 모두 이거 의존 → Rust로 갈 때도 별도 구현 유지.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;defer pool.put(x)&lt;/code&gt; → Rust pool은 Drop 가드 반환. &lt;strong&gt;수동 defer 금지.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scopeguard::guard((), \|_\| ...)&lt;/code&gt; 같은 unit-state 패턴 &lt;strong&gt;금지&lt;/strong&gt; — RAII 누락의 신호.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@errorName(e)&lt;/code&gt; → &lt;code&gt;IntoStaticStr&lt;/code&gt; derive. &lt;strong&gt;&lt;code&gt;Display&lt;/code&gt; / &lt;code&gt;format!(&amp;quot;{e:?}&amp;quot;)&lt;/code&gt; 절대 금지&lt;/strong&gt; — JS &lt;code&gt;error.code&lt;/code&gt;, snapshot test, crash-handler trace가 정확한 string에 의존.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;for (a, b) \|x, y\|&lt;/code&gt; → &lt;code&gt;for (x, y) in a.iter().zip(b)&lt;/code&gt; + &lt;strong&gt;&lt;code&gt;debug_assert_eq!(a.len(), b.len())&lt;/code&gt;&lt;/strong&gt; (Zig는 assert, Rust zip은 silent truncate)&lt;/li&gt;
&lt;li&gt;TLS 코드는 &lt;a class="link" href="https://boringssl.googlesource.com/boringssl/" target="_blank" rel="noopener"
 &gt;BoringSSL&lt;/a&gt; FFI 그대로 유지. RustTLS 같은 풀-Rust로 다시 짜지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="phase-a-vs-phase-b"&gt;Phase A vs Phase B
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phase A&lt;/strong&gt; = 한 &lt;code&gt;.zig&lt;/code&gt; → 한 &lt;code&gt;.rs&lt;/code&gt;. 컴파일 안 돼도 됨. 로직 충실성 + idiomatic 형태.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase B&lt;/strong&gt; = crate별 컴파일 통과. &lt;code&gt;// TODO(port)&lt;/code&gt;, &lt;code&gt;// PERF(port)&lt;/code&gt; grep으로 일괄 처리.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 분리가 핵심이다. 한 번에 다 짜려고 하면 LLM 컨텍스트가 무너지지만, 하나의 &lt;code&gt;.zig&lt;/code&gt; 파일을 하나의 &lt;code&gt;.rs&lt;/code&gt;로 바꾸는 단위로 쪼개면 한 세션 안에서 끝낼 수 있다. 컴파일 통과 강제는 다음 phase로 미룬다.&lt;/p&gt;
&lt;h2 id="의미--agent-skills의-실전-적용"&gt;의미 — agent-skills의 실전 적용
&lt;/h2&gt;&lt;p&gt;이 PORTING.md 자체가 흥미로운 사례다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;LLM이 따라야 할 가이드를 인간이 미리 만들어 둔 형태&lt;/strong&gt;다. 30KB+ 분량을 미리 작성한 건, &amp;ldquo;Claude가 알아서 포팅해라&amp;quot;가 아니라 &amp;ldquo;&lt;strong&gt;Claude에게 정확히 무엇을 어떻게 번역할지 강제하기 위함&lt;/strong&gt;&amp;ldquo;이다. &lt;a class="link" href="https://www.anthropic.com/news/skills" target="_blank" rel="noopener"
 &gt;Anthropic이 말하는 agent-skills&lt;/a&gt; 사상의 실전 적용이다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;type-by-type 결정을 미리 박아둠&lt;/strong&gt; — &lt;code&gt;[]const u8&lt;/code&gt; (필드)을 &lt;code&gt;Box&amp;lt;[u8]&amp;gt;&lt;/code&gt;으로 갈지 &lt;code&gt;&amp;amp;'static [u8]&lt;/code&gt;으로 갈지를 LLM이 자기 마음대로 정하게 두지 않고, &lt;strong&gt;&amp;ldquo;deinit 보고 결정하라&amp;rdquo;&lt;/strong&gt; 는 메타-규칙으로 못박았다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;docs/LIFETIMES.tsv&lt;/code&gt;&lt;/strong&gt; 라는 사전 분석 파일을 가이드가 명시한다. 필드별 OWNED / SHARED / BORROW_PARAM / STATIC / JSC_BORROW / BACKREF / INTRUSIVE / FFI / ARENA / UNKNOWN 클래스를 미리 매겨두고 그 컬럼 그대로 쓰라는 형태. &lt;strong&gt;LLM에게 줄 cross-file analysis를 사전에 만들어두는 패턴&lt;/strong&gt;이다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PORT NOTE&lt;/code&gt; / &lt;code&gt;TODO(port)&lt;/code&gt; / &lt;code&gt;PERF(port)&lt;/code&gt;&lt;/strong&gt; 세 마커로 phase 간 핸드오프 — 다음 단계 작업자(또는 다른 LLM 세션)가 grep 한 번으로 일거리를 잡을 수 있게 설계됐다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="인사이트"&gt;인사이트
&lt;/h2&gt;&lt;p&gt;Bun처럼 큰 코드베이스의 언어 마이그레이션을 LLM 자동화로 시도하는 케이스가 처음으로 공개적으로 등장했다. 흥미로운 점은 &lt;strong&gt;핵심 노하우가 모델 자체가 아니라 가이드의 정밀도&lt;/strong&gt; 라는 사실이다. PORTING.md는 type map과 idiom map을 미리 박아두고, LIFETIMES.tsv로 필드별 소유권을 사전 분석해두며, TODO/PERF/PORT NOTE 세 마커로 phase 간 핸드오프를 설계했다. 결과적으로 LLM은 창의적인 결정을 하지 않고 &lt;strong&gt;&amp;ldquo;이 줄을 이 줄로 바꾼다&amp;rdquo;&lt;/strong&gt; 는 기계적 작업만 한다. tokio / rayon / async-trait 같은 흔한 Rust async 스택을 아예 금지한 것도 같은 맥락 — Bun은 자체 이벤트 루프와 &lt;a class="link" href="https://boringssl.googlesource.com/boringssl/" target="_blank" rel="noopener"
 &gt;BoringSSL&lt;/a&gt; 같은 FFI 자산을 유지하기 때문에 LLM이 멋대로 &amp;ldquo;Rust답게&amp;rdquo; 바꾸면 인프라가 깨진다. 이 PORTING.md는 LLM-driven port의 일종의 &lt;strong&gt;교과서&lt;/strong&gt; 가 될 가능성이 있다. 거대 코드베이스 마이그레이션이 LLM 비용으로 풀린다면, 그 비용 효율을 결정하는 것은 GPU도 모델도 아니라 &lt;strong&gt;사전에 짜둔 가이드의 두께&lt;/strong&gt; 다.&lt;/p&gt;
&lt;h2 id="참고"&gt;참고
&lt;/h2&gt;&lt;h3 id="bun과-포팅-브랜치"&gt;Bun과 포팅 브랜치
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://bun.com" target="_blank" rel="noopener"
 &gt;Bun 홈페이지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/oven-sh/bun" target="_blank" rel="noopener"
 &gt;oven-sh/bun GitHub 레포&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/oven-sh/bun/tree/claude/phase-a-port" target="_blank" rel="noopener"
 &gt;&lt;code&gt;claude/phase-a-port&lt;/code&gt; 브랜치&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/oven-sh/bun/blob/claude/phase-a-port/docs/PORTING.md" target="_blank" rel="noopener"
 &gt;&lt;code&gt;docs/PORTING.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="언어와-생태계"&gt;언어와 생태계
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ziglang.org/" target="_blank" rel="noopener"
 &gt;Zig 언어&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.rust-lang.org/" target="_blank" rel="noopener"
 &gt;Rust 언어&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.anthropic.com/claude-code" target="_blank" rel="noopener"
 &gt;Anthropic Claude Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.anthropic.com/news/skills" target="_blank" rel="noopener"
 &gt;Anthropic agent-skills 발표&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="도구--crate-레퍼런스"&gt;도구 / crate 레퍼런스
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.rs/scopeguard/" target="_blank" rel="noopener"
 &gt;scopeguard crate&lt;/a&gt; — &lt;code&gt;errdefer&lt;/code&gt; 대응 RAII 가드&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/microsoft/mimalloc" target="_blank" rel="noopener"
 &gt;mimalloc&lt;/a&gt; — &lt;code&gt;MimallocArena&lt;/code&gt; 의존 allocator&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://boringssl.googlesource.com/boringssl/" target="_blank" rel="noopener"
 &gt;BoringSSL&lt;/a&gt; — TLS FFI 유지 대상&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tokio.rs/" target="_blank" rel="noopener"
 &gt;tokio&lt;/a&gt; — Phase A에서 명시적으로 금지된 async 런타임&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>