needhelp
← Back to blog

Bun کا Rust ری رائٹ: 11 دن، 6,778 کمٹس، اور اصل میں کیا بدلا

by needhelp
Bun
Rust
Zig
JavaScript Runtime
LLM
Software Engineering

Bun کی ٹیم نے مئی 2026 میں کچھ غیر معمولی کیا: انہوں نے runtime کے پورے نیٹو کور کو Rust پورٹ سے بدل دیا، اور یہ 11 دنوں میں ہوا۔

اعلان کے شروع میں جو انکشاف ہے وہ ٹون سیٹ کرتا ہے۔ Bun کو دسمبر 2025 میں Anthropic نے حاصل کیا تھا۔ Jarred Sumner، Bun کے خالق، نے Claude کا پری ریلیز ورژن استعمال کیا — ایک “Mythos-class ماڈل” جسے وہ Fable 5 کہتے ہیں۔ یہ کوئی نظریاتی تجربہ نہیں ہے۔ Bun v1.4.0، پہلا Rust ورژن، اب canary میں ہے۔

کچے نمبرز:

  • 535,496 لائنز Zig (بغیر کمنٹس) Rust کوڈبیس بن گئیں
  • 6,778 کمٹس 3 مئی سے 14 مئی کے درمیان
  • 1,448 .zig فائلیں مشینی طور پر .rs میں پورٹ ہوئیں
  • ~$165,000 API خرچ (5.9B غیر کیشڈ انپٹ ٹوکنز، 690M آؤٹ پٹ ٹوکنز)
  • چوٹی: 64 Claudes ایک ساتھ 4 ورک ٹریز پر

Bun startup بعد Rust ری رائٹ، Claude Code کے تحت چلتے ہوئے

Bun ہمیشہ سے Zig پر شرط تھا

Bun نے esbuild کے JS/TS ٹرانسپائلر کو Go سے Zig میں لائن بہ لائن پورٹ کرنے کے طور پر شروع کیا۔ Jarred Sumner نے 16 اپریل 2021 کو اپنی Zig کی پہلی لائن لکھی، Hacker News پر ایک صفحے کا Zig لینگویج ریفرنس دیکھنے کے بعد۔ ابتدائی ورژن — ٹرانسپائلر، منیفائر، بنڈلر، npm-مطابق پیکیج مینیجر، Jest جیسا ٹیسٹ رنر، Node.js API سطح — ایک شخص نے ایک سال میں لکھا، ایک تنگ Oakland اپارٹمنٹ میں، LLMs کے اس قسم کے کام کے لیے مفید ہونے سے پہلے۔

وہ شرط کامیاب رہی۔ Bun کے CLI کے اب 22 ملین سے زائد ماہانہ ڈاؤن لوڈز ہیں۔ Claude Code اور OpenCode اسے runtime کے طور پر استعمال کرتے ہیں۔ Vercel، Railway اور DigitalOcean فرسٹ پارٹی سپورٹ بھیجتے ہیں۔

دائرہ کار مسئلہ بھی تھا۔

قرض: GC میموری کے ساتھ مینوئل میموری

JavaScript گاربیج کلکٹڈ ہے۔ Bun JavaScriptCore (Safari کا انجن) کے علاوہ C/C++ لائبریریوں کا ڈھیر ایمبیڈ کرتا ہے: uWebSockets، BoringSSL، SQLite، lsquic۔ Zig، C کی طرح، آپ کے لیے میموری مینیج نہیں کرتا۔ Bun کا کام GC والی زبان اور مینوئلی مینیجڈ نیٹو کوڈ کے درمیان بیٹھنا ہے، اور وہی بارڈری ہے جہاں اس کے زیادہ تر بگ رہتے تھے۔

اعلان میں v1.3.14 میں طے کردہ بگز کی ایک فہرست دی گئی ہے: node:zlib میں heap-use-after-free، node:http2 میں use-after-free، UDPSocket.sendMany میں out-of-bounds رائٹس، ہر tls.connect پر میموری لیک، CSS پارسر میں ڈبل فری۔ فہرست جاری ہے۔

Sumner واضح ہے کہ یہ Zig کی غلطی نہیں ہے۔ “ہم Zig کے بغیر اتنی دور نہیں آ سکتے تھے، اور میں ہمیشہ شکرگزار رہوں گا۔” مسئلہ ساختی ہے: GC بارڈر کے پار lifetimes ہینڈل کرنا کسی بھی زبان میں مشکل ہے جو اس کے لیے ڈیزائن نہیں کی گئی، اور Zig کا جواب — ہر کال سائٹ پر واضح defer — شاذ و نادر ہی پہنچے جانے والے ایرر پاتھز میں غلط ہونا آسان ہے۔

اس نے C++ پر غور کیا۔ Bun کا تقریباً 20% پہلے سے C++ ہے، اور مزید منتقل کرنے سے کنسٹرکٹرز اور ڈیسٹرکٹرز مل جاتے۔ لیکن یہ پھر بھی کوڈ ریویو کے ذریعے نافذ کردہ اسٹائل گائیڈز پر انحصار کرتا، اور میموری کرپشن پھر بھی ہوتی۔

Rust کی پیشکش مختلف ہے: safe Rust میں، use-after-free، double-free اور “forgot to free” کمپائلر ایررز ہیں۔ borrow checker اور Drop اسٹائل گائیڈ کے مسئلے کو ٹائپ سسٹم کے مسئلے میں بدل دیتے ہیں۔

حکمت عملی: ٹرانسپائل کریں، دوبارہ ڈیزائن نہ کریں

ری رائٹس کی بری شہرت ہے، اور اچھی وجہ سے۔ 535K لائنوں کہ سکریچ سے ری رائٹ فیچرز اور فکسز کو ایک سال کے لیے روک دیتا۔ Bun نے ایک مشینی پورٹ کا راستہ چنا: وہی آرکیٹیکچر، وہی پرفارمنس ٹارگٹس، وہی فیچرز، وہی ٹیسٹ سویٹ — بس Rust میں۔

دو فیصلوں نے پوری کوشش کو آگے بڑھایا:

  1. ایک ساتھ، بتدریج نہیں۔ Sumner کا esbuild کو Zig میں پورٹ کرنے کا تجربہ بتاتا تھا کہ بتدریج ری رائٹس عارضی سکیفولڈنگ چھوڑ دیتے ہیں جو نقصان پہنچاتی ہے۔
  2. اسے ٹرانسپائلڈ نظر آنے دیں۔ مقصد Rust تھا جو Zig جیسی پڑھے، جسے v1.4 شپ ہونے کے بعد native Rust کی طرف ریفیکٹر کیا جائے۔

اہم بات یہ کہ Bun کا ٹیسٹ سویٹ TypeScript میں لکھا ہے، اس لیے اسے اس سے فرق نہیں پڑتا کہ runtime کس زبان میں لکھی گئی ہے۔ اس نے انہیں “تمام ٹیسٹ گرین” کو ڈن ہونے کی ڈیفینیشن ماننے دیا۔

تیاری چھوٹی تھی لیکن دانستہ۔ کوڈ لکھنے سے پہلے، Sumner نے Claude کے ساتھ ~3 گھنٹے Zig پیٹرنز کو Rust میں میپ کرنے میں گزارے؛ وہ گفتگو PORTING.md بنی (یہ بعد میں Hacker News پر آئی)۔ دوسرے پاس نے کوڈبیس کے ہر سٹرکٹ فیلڈ کی مناسب Rust lifetimes کا تجزیہ کیا اور انہیں LIFETIMES.tsv میں سیریلائز کیا۔ دونوں دستاویزات adversarial ریویو سے گزریں اس سے پہلے کہ ایک لائن بھی پورٹ ہو۔

جو وہیں رہا: JavaScriptCore اور ایمبیڈڈ C/C++ لائبریریاں۔ ری رائٹ native glue اور Bun-specific کوڈ تھا، JS انجن نہیں۔

عملدرآمد: 64 Claudes، 11 دن

پورٹ تقریباً 50 “ڈائنامک ورک فلو” میں Claude Code پر، مسلسل 11 دنوں تک چلا۔ ہر ورک فلو ایک لوپ تھا: ٹاسک لو، کوڈ تیار کرو، ریویو کرو، فیڈ بیک لگاؤ۔

ریویو ماڈل دلچسپ حصہ ہے۔ ہر implementer کے لیے دو یا زیادہ adversarial reviewers تھے — الگ Claude سیشنز جنہیں کہا گیا تھا کہ کوڈ کو غلط مانو اور ہر وجہ تلاش کرو جو یہ ناکام ہو۔ Implementer کبھی ریویو نہیں کرتا؛ reviewer کبھی implement نہیں کرتا۔ اعلان اسے انسانی ریویو کا آئینہ بتاتا ہے: مصنف ضم کرنا چاہتا ہے، اس لیے ایک مختلف پارٹی چیک کرتی ہے۔

کچھ میکانکس قابل ذکر ہیں:

  • پہلے ٹرائل رن۔ انہوں نے تمام 1,448 کا عہد کرنے سے پہلے 3 فائلیں پورٹ کیں۔
  • ورک ٹری شارڈنگ۔ پہلی رنز میں Claudes git stash اور git reset سے ایک دوسرے پر چڑھ رہے تھے۔ حل: 4 ورک ٹریز، 16 Claudes ہر ایک، اصول کے ساتھ کہ درمیان میں کبھی git یا cargo نہ چلائیں۔
  • کمپائلر ایررز بطور ورک کیو۔ cargo check نے ~16,000 ایررز ایک فائل میں ڈالے، crate کے حساب سے گروپ کیے، اور 64 Claudes کام کرتے رہے — 4 ورک ٹریز پر 16 فکس/ریویو/اپلائی لوپس۔
  • سائیکلیکل ڈیپنڈنسیز۔ Zig مؤثر طریقے سے ایک کمپائلیشن یونٹ تھا؛ Rust کو ~100 crates چاہیے تھیں۔ سائیکل کھولنے سے وہ 16,000 میں سے زیادہ تر ایررز سامنے آئے۔
  • آئسولیشن۔ اسٹریس ٹیسٹ جو TCP ساکٹس ختم کریں یا ~10k پروسیسز اسپان کریں، systemd-run cgroups کے تحت چلے۔ مشین کا ڈسک بھر گیا اور کچھ بار کریش ہوا۔
timeline
    title Bun کا 11 دن کا Zig → Rust ری رائٹ (مئی 2026)
    2026-05-03 : پورٹ برانچ کھلی (PR #30412)
    2026-05-04 : پہلا 100-فائل ڈرافٹ بیچ
    2026-05-06 : ~16,000 کمپائلر ایررز، 64 Claudes
    2026-05-08 : پہلا CI رن (972 فیلنگ فائلیں)
    2026-05-09 : Linux x64 گرین ہوا
    2026-05-11 : Windows گرین (آخری پلیٹ فارم)
    2026-05-14 : تمام 6 پلیٹ فارم گرین، ضم ہوا

نمبروں کے مطابق: چوٹی 1,300 لائنز فی منٹ، مصروف ترین گھنٹے میں 695 کمٹس (6 مئی)، ایک مصروف ترین منٹ میں 58 کمٹس۔ ہر کمٹ دو adversarial reviewers سے گزر کر آیا۔ آخری diff +1,009,272 لائنز تھا۔ صفر ٹیسٹ چھوڑے یا ڈیلیٹ کیے گئے۔

CI وہ جگہ ہے جہاں یہ حقیقی ہوا۔ پہلے رن کے دو دن بعد، فیل ہونے والی ٹیسٹ فائلیں 972 سے 23 رہ گئیں۔ ڈیڑھ دن بعد Linux مکمل طور پر گرین ہوا۔ Windows نے 11 مئی کو آخری پوزیشن حاصل کی؛ تمام چھ پلیٹ فارم بلڈ #54202، 14 مئی کو گرین تھے۔

Rust نے اصل میں کیا دیا

بیان کردہ مقصد استحکام تھا۔

بگز۔ Bun v1.4.0 میں 128 بگز طے ہوئے جو v1.3.14 میں ری پروڈیوس ہوتے ہیں۔

میموری۔ Drop نے فی کال سائٹ defer کو بدل دیا۔ پوسٹ کی مثال: ایک ہی 60 ماڈیول پروجیکٹ کو ایک پروسیس میں 2,000 بار بنڈل کرنا۔ v1.3.14 میں ہر بلڈ سے ~3 MB ہمیشہ کے لیے لیک ہوتا ہے؛ v1.4.0 میں میموری برابر ہو جاتی ہے۔

بلڈز v1.3.14 v1.4.0
500 1,914 MB 526 MB
1,000 3,506 MB 586 MB
1,500 5,097 MB 608 MB
2,000 6,745 MB 609 MB

ایک پچھلی کوشش Zig میں یہ طے کرنے کی کبھی ضم نہیں ہوئی تھی، Sumner لکھتے ہیں، کیونکہ Drop کے مساوی کی کمی نے اعتماد محسوس کرنا مشکل بنا دیا تھا۔

بائنری سائز۔ صرف Rust ری رائٹ نے 3.8 MB (Windows)، 5.5 MB (macOS)، 6.8 MB (Linux) کم کیا — زیادہ تر زیادہ Zig comptime کو ہٹانے سے۔ مزید لنکر ورک (identical code folding، ICU ڈیٹا تراشنا) نے کل سکڑاؤ کو Linux اور Windows پر ~20% تک پہنچایا۔

ورژن پلیٹ فارم سائز
v1.4.0 Windows 76 MB
v1.3.14 Windows 94 MB
v1.4.0 Linux 70 MB
v1.3.14 Linux 88 MB

رفتار۔ C/C++ اور Rust کے درمیان کراس لینگویج LTO کمپائلر کو لینگویج بارڈرز کے پار inline کرنے دیتا ہے۔ Bun نے 2–5% بہتری ناپی:

  • Bun.serve: 169.6k → 177.7k req/s (+4.8%)
  • express: 64.5k → 66.6k (+3.2%)
  • next build: 13.62s → 13.03s (+4.5%)
  • tsc -b --force: 0.94s → 0.89s (+4.7%)

Prisma نے اپنا Compute public beta Rust ری رائٹ پر منتقل کر دیا۔ Alexey Orlenko نے کہا: “ہم میموری لیکس اور ایک کنکشن پول سے دوڑتے تھے جو VM کو روک کر دوبارہ شروع کرنے کے بعد ری کور نہیں کر سکتا تھا۔ جب Rust ری رائٹ آیا، ہم نے اسے انہی فیل موڈز پر ٹیسٹ کیا۔ اس نے انہیں پرفیکٹلی ہینڈل کیا۔”

Claude Code v2.1.181 (17 جون) اور بعد کے ورژنز Rust پورٹ استعمال کرتے ہیں۔ Linux پر سٹارٹ اپ 10% تیز ہے۔ Sumner کا فیصلہ صارف پر نظر آنے والی تبدیلی پر: “بورنگ اچھی ہے۔”

پورٹ کہاں پھسلا

535K لائنوں کا وفادار ترجمہ مفت نہیں ہے۔ 19 معروف regressions، تمام طے شدہ۔ سبق آموز چیزیں زبانوں کے درمیان چھوٹے سیمینٹک گیپس ہیں:

  • debug_assert! سائیڈ ایفیکٹس۔ Zig کا assert ایک فنکشن ہے، اس لیے اس کی دلیل ہر بلڈ میں چلتی ہے۔ Rust کا debug_assert! ایک میکرو ہے جو ریلیز میں مٹ جاتا ہے — ایک insert_stale کال جو HMR سٹیٹ میوٹیٹ کرتی تھی خاموشی سے چلنا بند ہو گئی۔ (#30678)
  • Odd-length slices۔ Zig کا ہیلپر ایک اضافی odd بائٹ کو نظر انداز کرتا تھا؛ bytemuck::cast_slice اس پر پینک کرتا ہے۔ UTF-16 BOM اور odd بائٹ کاؤنٹ والے Blob.text() نے کریش کرنا شروع کر دیا۔ (#31188)
  • باؤنڈز چیکس۔ Zig کا ReleaseFast انہیں ہٹاتا ہے؛ Rust رکھتا ہے۔ ایک پلیس ہولڈر کانسٹنٹ نے filename-interning کی چھت 8.4M سے 270K کر دی، اور حقیقی پروجیکٹ اسے لگے۔ (#31503)
  • comptime فارمیٹ سٹرنگز۔ Zig فارمیٹ سٹرنگز کو کمپائل ٹائم ایویلیوایٹ کرتا ہے، اس لیے کلر مارکر آرگیومنٹس کو سبسٹیٹیوٹ کرنے سے پہلے چلے جاتے ہیں۔ Rust میں comptime نہیں ہے، اس لیے مارکر پارسر نے OSC 8 ہائپر لنکس میں لٹرل بیک سلیش کھا لیا۔ (#30693)

یہ وہ بگ ہیں جو صرف اس لیے ظاہر ہوتے ہیں کہ دو زبانیں ایک جیسی نظر آتی ہیں لیکن نہیں ہیں۔

اس کا کیا مطلب ہے

LLM والے پہلو کو ہٹا دیں تو ایک حقیقی انجینئرنگ کہانی ہے: ایک پروجیکٹ اس حد تک پہنچ گیا جو مینوئل میموری مینجمنٹ اسے اسکیل پر دے سکتی تھی، اور Rust کے borrow checker کو ایسے ٹول کے طور پر چنا جس سے بگز کی ایک پوری کلاس ناممکن ہو جائے نہ کہ صرف حوصلہ شکنی۔

LLM والا پہلو وہ حصہ ہے جس پر لوگ بحث کریں گے۔ Sumner صاف گوئی سے کہتا ہے کہ اس میں پورے کوڈبیس سیاق و سباق کے ساتھ تین انجینئرز کو تقریباً ایک سال لگتا، اور وہ یہ کبھی نہ کرتے — حقیقت پسندانہ متبادل تھا “کچھ نہ کرو اور بگ فکس کرتے رہو۔” اس کے بجائے، ایک انجینئر 64 Claudes کی نگرانی میں 11 دنوں میں ~$165K میں کر گیا۔

Bun کے Rust کوڈ کا تقریباً 4% unsafe بلاکس میں ہے (~13,000 unsafe کی ورڈز ~27,000 لائنوں میں کل ~780,000 میں سے)، اور ان میں سے 78% بلاکس ایک ایک لائن کے ہیں۔ ضم ہونے کے بعد سے، انہوں نے 11 راؤنڈز سیکیورٹی ریویو کیے اور 24/7 کوریج گائیڈڈ فیوزنگ شامل کی — 100 بلین ایکزیکیوشنز اب تک، ~15 PRs۔

مینٹینیبلٹی کا سوال وہ ہے جسے میں دیکھوں گا۔ Sumner کہتا ہے کہ Rust Zig جیسی پڑھتا ہے۔ شرط یہ ہے کہ وفادار پورٹ port-by-port قابل ریویو ہے۔

اس کی آخری لائن دلچسپ ہوگی: “آج ایک انجینئر ایک سال پہلے سے بہت کچھ کر سکتا ہے۔”

References

Share this page