إعادة كتابة Bun بلغة Rust: 11 يوماً، 6,778 commit، وماذا تغير بالفعل
فريق Bun شحن شيئاً غير معتاد في مايو 2026: استبدلوا النواة الأصلية الكاملة لبيئة التشغيل بنسخة Rust، وفعلوها في 11 يوماً.
الإفصاح في أعلى الإعلان يحدد النغمة. Bun استُحوذت من قبل Anthropic في ديسمبر 2025. Jarred Sumner، مبتكر Bun، استخدم نسخة ما قبل الإصدار من Claude — “نموذج من فئة Mythos” يسمونه Fable 5 — لمعظم العمل. هذه ليست تجربة فكرية. Bun v1.4.0، أول نسخة Rust، في canary الآن.
الأرقام الخام:
- 535,496 سطراً من Zig (باستثناء التعليقات) أصبحت قاعدة كود Rust
- 6,778 commit بين 3 مايو و 14 مايو
- 1,448 ملف
.zigنُقلت آلياً إلى.rs - ~$165,000 في إنفاق API (5.9B رمز إدخال غير مخبأ، 690M رمز إخراج)
- الذروة: 64 Claude يعملون في وقت واحد عبر 4 worktrees
Bun كان دائماً رهاناً على Zig
بدأ Bun كنقل سطر بسطر لمترجم esbuild من Go إلى Zig. Sumner كتب أول سطر له في Zig في 16 أبريل 2021، بعد رؤية مرجع لغة Zig ذي الصفحة الواحدة على Hacker News. النسخة الأولية — مترجم، مصغر، حازم، مدير حزم متوافق مع npm، مشغل اختبار شبيه Jest، سطح API Node.js — كتبها شخص واحد في سنة واحدة، في شقة ضيقة في Oakland، قبل أن تكون النماذج اللغوية الكبيرة مفيدة لهذا النوع من العمل.
ذلك الرهان أثمر. CLI الخاص بـ Bun الآن يشهد أكثر من 22 مليون تحميل شهرياً. Claude Code و OpenCode يستخدمونه كبيئة تشغيل. Vercel و Railway و DigitalOcean يشحنون دعماً من الدرجة الأولى.
الديون: ذاكرة GC بجانب ذاكرة يدوية
JavaScript تُدار بالقمامة. Bun يضم JavaScriptCore (المحرك في Safari) بالإضافة إلى كومة من مكتبات C/C++: uWebSockets، BoringSSL، SQLite، lsquic. Zig، مثل C، لا يدير الذاكرة لك. وظيفة Bun هي الجلوس بين لغة مُدارة بالقمامة وكود أصلي يُدار يدوياً، وهذه الحدود هي حيث عاشت معظم أخطائه الأسوأ.
Sumner واضح أن هذا ليس خطأ Zig. “لما وصلنا إلى هنا لولا Zig، وسأكون دائماً ممتناً.” المشكلة هيكلية: التعامل مع فترات الحياة عبر حدود GC صعب في أي لغة لا تُصمم له، وإجابة Zig — defer صريح في كل موقع استدعاء — من السهل أن تخطئ فيه في مسارات الأخطاء نادرة الوصول.
عرض Rust مختلف: في Rust الآمن، use-after-free و double-free و “نسيت تحرير الذاكرة” هي أخطاء مترجم. مدقق الاقتراض و Drop يحولان مشكلة دليل أسلوب إلى مشكلة نظام أنواع.
الاستراتيجية: ترجمة، لا إعادة تصميم
إعادة الكتابة لها سمعة سيئة، ولسبب وجيه. إعادة كتابة من الصفر لـ 535K سطر ستجمد الميزات والإصلاحات لمدة عام. الشكل الذي اختاره Bun كان نقلاً ميكانيكياً: نفس البنية، نفس أهداف الأداء، نفس الميزات، نفس مجموعة الاختبار — فقط في Rust.
قراران قادا الجهد كله:
- مرة واحدة، وليس تدريجياً. تجربة Sumner في نقل esbuild إلى Zig أخبرته أن إعادة الكتابة التدريجية تترك سقالات مؤقتة تضر أكثر مما تنفع.
- اجعله يبدو مترجماً. الهدف كان Rust يقرأ مثل Zig الذي جاء منه، ليُعاد هيكلته نحو Rust أصيل بعد شحن v1.4.
التنفيذ: 64 Claude، 11 يوماً
النقل جرى كحوالى 50 “سير عمل ديناميكي” في Claude Code، باستمرار، لمدة 11 يوماً. كل سير عمل كان حلقة: خذ مهمة، أنتج كوداً، احصل على مراجعة، طبق الملاحظات.
نموذج المراجعة هو الجزء المثير للاهتمام. لكل منفذ، كان هناك مراجعان خصمان أو أكثر — جلسات Claude منفصلة أُخبرت بافتراض أن الكود خطأ وإيجاد كل سبب يفشل. المنفذ لا يراجع أبداً؛ المراجع لا ينفذ أبداً.
timeline
title إعادة كتابة Bun من Zig → Rust في 11 يوماً
2026-05-03 : فتح فرع النقل (PR #30412)
2026-05-04 : أول دفعة مسودة 100 ملف
2026-05-06 : ~16,000 خطأ مترجم، 64 Claude
2026-05-08 : أول تشغيل CI (972 ملفاً فاشلاً)
2026-05-09 : Linux x64 يتحول إلى أخضر
2026-05-11 : Windows أخضر (آخر منصة)
2026-05-14 : جميع 6 منصات خضراء، دمج
ماذا اشترى Rust بالفعل
الهدف المعلن كان الاستقرار، والمقال يدعم ذلك بأرقام صلبة.
الأخطاء. Bun v1.4.0 يصلح 128 خطأ تتكرر في v1.3.14.
الذاكرة. Drop حل محل defer لكل موقع استدعاء. مثال المقال: حزم نفس مشروع 60 وحدة 2,000 مرة في عملية واحدة. في v1.3.14 كل بناء يُسرّب ~3 MB للأبد؛ في v1.4.0 الذاكرة تستقر.
حجم الملف الثنائي. إعادة كتابة Rust وحدها قلصت 3.8 MB (Windows)، 5.5 MB (macOS)، 6.8 MB (Linux) — معظمها من إسقاط comptime الزائد في Zig.
السرعة. LTO عبر اللغات بين Rust و C/C++ يسمح للمترجم بالدمج عبر حدود اللغة. Bun قاس مكاسب 2–5%:
Bun.serve: 169.6k → 177.7k طلب/ث (+4.8%)express: 64.5k → 66.6k (+3.2%)next build: 13.62s → 13.03s (+4.5%)
أين تزلق النقل
نقل أمين لـ 535K سطر ليس مجانياً. المقال يوثق 19 تراجعاً معروفاً، كلها صُححت. المفيدة منها هي فجوات دلالية صغيرة بين اللغات:
- آثار جانبية
debug_assert!. تأكيد Zig هو دالة، لذا وسيطته تعمل في كل بناء.debug_assert!في Rust هي ماكرو يُمحى في الإصدار — استدعاءinsert_staleكان يغير حالة HMR بصمت وتوقف عن العمل. - شرائح فردية الطول. مساعد Zig تجاهل بايت فردي زائد؛
bytemuck::cast_sliceينهار عليه. - فحوصات الحدود. Zig يزيلها في
ReleaseFast؛ Rust يبقيها.
ماذا يعني هذا
اجرد زاوية النموذج اللغوي وهناك قصة هندسية حقيقية: مشروع وصل لسقف ما يمكن لإدارة الذاكرة اليدوية أن تعطيه على نطاق واسع، واختار مدقق اقتراض Rust كأداة لجعل فئة كاملة من الأخطاء مستحيلة بدلاً من مجرد غير مشجعة.
زاوية النموذج اللغوي هي الجزء الذي سيتجادل الناس حوله. Sumner صريح أن هذا كان سيأخذ ثلاثة مهندسين بمعرفة كاملة بقاعدة الكود حوالي سنة، وأنهم لم يكونوا ليفعلوها أبداً — البديل الواقعي كان “لا تفعل شيئاً واستمر في إصلاح الأخطاء.” بدلاً من ذلك، مهندس واحد يشرف على 64 Claude فعلها في 11 يوماً بحوالي $165K.
حوالي 4% من كود Rust في Bun موجود في كتل unsafe (~13,000 كلمة unsafe عبر ~27,000 سطر من ~780,000 إجمالي)، و 78% من تلك الكتل هي سطر واحد. منذ الدمج، شغلوا 11 جولة مراجعة أمنية وأضافوا fuzzing موجه بالتغطية 24/7 عبر كل محلل — 100 مليار تنفيذ حتى الآن، ~15 PR.
سؤال قابلية الصيانة هو الذي سأراقبه. Sumner يقول أن Rust تقرأ مثل Zig، ويظهر مقارنة جنباً لجنب لـ canMergeSymbols لتوضيح النقطة. الرهان هو أن النقل الأمين قابل للمراجعة ملفاً بملف، وهو ما سمح لشخص واحد بالموافقة على diff مليون سطر.
سطر ختامه هو الذي سيتقدم بشكل مثير للاهتمام: “مهندس واحد يمكنه فعل أكثر بكثير اليوم مما قبل عام.”