بازنویسی Bun از Zig به Rust در ۱۱ روز با ۶۴ ایجنت
خلاصهٔ کاملتر
تو یکی از شمارههای اخیر خبرنامهٔ Pragmatic Engineer، گرگلی اوروش سراغ یکی از عجیبترین پروژههای امسال رفته: بازنویسی کامل Bun از Zig به Rust. Bun یه رانتایم جاوااسکریپته که همزمان ترنسپایلر و باندلر و تسترانر و پکیجمنیجر هم هست، ماهی ۲۲ میلیون بار دانلود میشه و ابزارهایی مثل Claude Code و OpenCode بهش وابستهان.
انگیزهٔ بازنویسی مشخص بود: Zig زبان امن از نظر حافظه نیست و تیم Bun مدام با نشتی حافظه، کرش و نوشتن خارج از محدودهٔ هیپ درگیر بود — اون هم بعد از اینکه کامپایلر Zig رو پچ کرده و تست نشتی سرتاسری گذاشته بودن. سامنر میگه ترکیب حافظهای که garbage collector مدیریتش میکنه با حافظهٔ دستی چیزیه که هیچ زبانی براش طراحی نشده، و تو Rust ایمن، همین use-after-free و double-free تبدیل به خطای کامپایلر میشن.
مشکل اینجا بود که بازنویسی کامل همیشه ایدهٔ بدی بوده: تخمین ۹ ماه به ۱۸ ماه و بعد به دو سال کش میاد، چون کدبیس اصلی هم داره جلو میره. به گفتهٔ سامنر، ۵۳۵٬۴۹۶ خط Zig یعنی حدود یک سال کار برای یه تیم کوچیک و یک سال بیخروجی برای کاربرها، که اصلاً گزینه نبود. برای همین اول سراغ اسمارتپوینترهای خانگی رفته بودن.
کاری که در نهایت کرد این بود: حدود سه ساعت با مدل دربارهٔ نگاشت الگوهای Zig به Rust حرف زد و نتیجه تو یه فایل PORTING.md ششصدخطی سریالایز شد. قوانین پایهش سختگیرانه بود — بدون tokio و rayon و hyper، بدون ماژولهای ورودی/خروجی استاندارد چون Bun ایونتلوپ و سیسکالهای خودش رو داره، و بدون async fn؛ همهچیز کالبک و ماشین حالت، دقیقاً مثل نسخهٔ Zig. بازچینش کد برای راضیکردن borrow checker مجاز بود، ولی نه با اشارهگر خام.
بعد از یه اجرای آزمایشی روی ۳ فایل از ۱٬۴۴۸ فایل و دو بازبینی تهاجمی تو سشنهای جدا، کار روی ۶۴ ایجنت موازی پخش شد. اولش ایجنتها روی سر هم میپریدن — یکی کار دیگری رو stash میکرد و یکی ریست میزد — تا اینکه دستورالعمل عوض شد: هیچ فرمان گیتی جز کامیتکردن یه فایل مشخص مجاز نیست. آخرش شد ۴ ورکتری، هر کدوم با ۱۶ ایجنت.
خود پورت دو روز طول کشید، ولی هیچی کامپایل نمیشد: حدود ۱۶ هزار خطای کامپایلر. جریان کار کرِیتبهکرِیت شد — خروجی cargo check گروهبندی و ذخیره میشد، ایجنتها خطاها رو رفع میکردن، دو بازبین تهاجمی نگاه میکردن و یکی هم اصلاحات رو اعمال میکرد. جالب اینکه این فاز شبونه پیش میرفت، وقتی تیم خواب بود. دو روز برای اجراشدن تستها و سه روز برای سبزشدن CI هم اضافه کن: کل پروژه ۱۱ روز و ۶۵۰۰ کامیت.
هزینهش با قیمت API حدود ۱۶۵ هزار دلار شد؛ معادل حقوق پایهٔ سالانهٔ یه مهندس نرمافزار. میچل هشیموتو این رقم رو معاملهٔ فوقالعادهای میدونه، چون بهگفتهٔ خودش هیچ مهندسی با همون حقوق نمیتونست تو ۱۱ روز به این نقطه برسه. نویسنده هم سه شرط برای تکرارپذیری میذاره: یه مهندس بسیار انگیزهمند که کدبیس رو خوب بشناسه، یه مجموعه تست واقعاً محکم، و آمادگی برای خرجکردن توکن بدون تضمین نتیجه — با این ترفند که برنامهریزی سطحبالا رو به مدل گرون بدی و کدنویسی و بازبینی رو به مدلهای ارزونتر.
نکات کلیدی:
- بازنویسی ۵۳۵٬۴۹۶ خط Zig به Rust در ۱۱ روز و ۶۵۰۰ کامیت
- انگیزه: باگهای مکرر حافظه و نبود ایمنی حافظه در Zig
- کلید کار: یک راهنمای پورت ۶۰۰ خطی، اجرای آزمایشی و بازبینیهای تهاجمی
- ۶۴ ایجنت موازی در ۴ ورکتری، با ممنوعیت فرمانهای گیت مخرب
- هزینهٔ حدود ۱۶۵ هزار دلار توکن و سه پیششرط برای تکرار این مدل مهاجرت




