اگر در حال توسعهی نرمافزارهای سیستمی با سینتکس الهامگرفته از پاسکال هستید، زمان کامپایل شما بهشدت کاهش یافت و اهداف اجراییتان گستردهتر شد. در ۸ ژوئن ۲۰۲۶، پروژه Blaise نسخه ۰.۱۰.۰ را منتشر کرد؛ نقطه عطفی که این زبان را با ارائه یک بکاند (Backend) — یعنی بخشی از کامپایلر که کد را به زبان ماشین تبدیل میکند، شبیه به مترجمی که متن را دقیقاً به زبان مقصد برمیگرداند — به یک ابزار سیستمی حرفهای نزدیکتر میکند.
برای توسعهدهندگان، این بدان معناست که Blaise دیگر صرفاً به بکاند QBE وابسته نیست. این زبان اکنون میتواند فایلهای ELF .o را مستقیماً تولید کند، بدون اینکه به یک اسمبلر خارجی نیاز داشته باشد. این تغییر به زبان اجازه میدهد تا بهصورت بومی برای لینوکس x86-64 هدفگذاری شود و شکاف بین یک پروژه پژوهشی و یک ابزار کاربردی برای محاسبات با کارایی بالا را پر کند.
همانطور که در تحلیلهای پیشین ما دربارهی زبانهای برنامهنویسی سیستمی اشاره کردیم، حذف لایههای واسط در تولید کد، همواره منجر به پایداری بیشتر باینریها میشود. طبق گزارش یادداشتهای انتشار در گیتهاب، این بهروزرسانی ستونهای فنی زیر را معرفی میکند:
معماری هسته
- بکاند بومی x86-64: این قابلیت از طریق پرچم
--backend nativeیا هدفگذاری--target linux-x86_64فراخوانی میشود. این بخش تمام نقاط عطف M1 تا M8 را پوشش میدهد؛ از جمله محاسبات اعداد صحیح و اعشاری، جریان کنترل، حلقههای for/while/repeat و رکوردها. همچنین از آرایههای استاتیک، دینامیک و باز (Open Arrays)، و یک سیستم کامل کلاس با دیسپچ متدها، vtables، سازندهها و متدکارهای تخریب (Destructors) پشتیبانی میکند. - حافظه و اجرا: پیادهسازی ARC (شمارش مراجع) برای رشتهها، کلاسها و اینترفیسها. این سیستم شامل دیسپچ اینترفیس از طریق itab، هندلینگ استثنائات (try/except/finally) و پشتیبانی از Generics برای کلاسهای monomorphised، رکوردها، اینترفیسها و روتینهای آزاد است.
- پشتیبانی از رشتهها (Threads): معرفی
threadvarبرای ذخیرهسازی محلی هر رشته (TLS) و یک تخصیصکننده حافظه مجزا برای هر رشته جهت کاهش تداخل قفلها (Lock Contention). شمارش مراجع اکنون از طریق ARC اتمیک (افزایش/کاهش اتمیک) ایمن شده است. همچنین مراجع ضعیف (Weak Refs) از طریق یک جدول مراجع ضعیف که توسط Mutex محافظت میشود، در بین رشتهها کار میکنند. هر رشته اکنون زنجیره فریم استثنائات مخصوص به خود را از طریق متغیرهای جهانی استثنائات محلی دریافت میکند. - کامپایل افزایشی (Incremental Compilation): استفاده از پرچم
--incrementalو فرمت جدید.bif(فایل رابط Blaise). این سریالسازی فشرده از رابط عمومی یک واحد (Unit) است که داخل فایل .o جاسازی میشود و شامل ثابتها، انواع داده، روتینها، متغیرهای جهانی، بدنه توابع inline و دستورات مربوط به قرارداد فراخوانی (Calling Convention) است.
اصلاحات زبانی
- پرانتزهای اجباری: توابع اکنون حتی با صفر آرگومان به
()نیاز دارند (مثلاًObj.Free()). این کار تضمین میکند کهFooهمیشه یک خواندن (Read) وFoo()همیشه یک فراخوانی (Call) باشد و ابهام بین مقداردهی Result و بازگشت (Recursion) را از بین میبرد. - عملگر الماس (Diamond Operator): پشتیبانی از استنتاج نوع برای Generics؛ مثلاً در
var L: TList<Integer> := TList<>.Create()، نوع داده از سمت چپ استنتاج میشود. - کتابخانه استاندارد و سینتکس: افزودن میانبر
Exit(Value)(که در ۳۰۵ نقطه از خودِ کامپایلر آزمایش شده است)، ثابتهای مجموعهای (مثلاًconst X = [a, b]) و ردیابی مجزا برای حالتهای پارامترoutدر مقابلvar. - بهبودات ورودی/خروجی: دستور
WriteLnاکنون مقادیر Boolean را بهدرستی True/False چاپ میکند و مقادیر ۳۲ بیتی بدون علامت را مدیریت میکند. همچنینTStringList.TextوLoadFromFileاکنون خطوط را دقیقاً همانطور که هستند، بدون حذف فضاهای خالی (Trimming)، حفظ میکنند.
این انتشار، بازی را برای توسعهدهندگان Blaise تغییر میدهد چون «حدس زدن» سازوکارهای داخلی کامپایلر را حذف میکند. تیم توسعه با حذف منطق IsNoArgFuncCall توانست سه باگ پنهان در تولید کد (Codegen) را شناسایی و رفع کند. این موضوع ثابت میکند که قوانین سختگیرانهتر زبانی، منجر به باینریهای پایدارتر میشود. همچنین این بهروزرسانی فراخوانی صحیح فیلدهای Procedure را اضافه میکند: Obj.Handler() از طریق اشارهگر کد ذخیرهشده دیسپچ میشود، در حالی که Obj.Handler مقدار فیلد را میخواند.
برای کاربر نهایی، افزودن ARC اتمیک و تخصیصکنندههای حافظه مجزا به این معناست که بالاخره میتوان برنامههای Blaise را روی چندین هسته پردازشی مقیاس کرد. انتقال به کامپایل افزایشی، که توسط رشتههای پردازشی موازی پشتیبانی میشود، پاسخی مستقیم به نیاز برای چرخههای تکرار سریعتر است. این سیستم خطاهای EImportError را که هنگام استفاده از دادههای رابط قدیمی رخ میداد، حل میکند.
بهبودات دیگر شامل پرچم --dump-ast برای تشخیص مشکلات تولید کد و تغییر نام نمادها (Symbol Mangling) با پیشوند واحد برای روتینهای آزاد و کلاسها است تا بیلدهای چند-واحدی بدون تداخل ممکن شود. همچنین تخته کانبان TUI پروژه با حالت CLI، ذخیرهسازی تاریخ و زمان به UTC و تشخیص تغییرات فایلهای خارجی بهروزرسانی شد.
برای تأیید این ادعاها، پروژه گزارش داده است که ۲۶۲۷ تست با موفقیت پاس شده و ۲۶۲۲۰۲ خط از کد QBE IR در نقطه تثبیت (Fixpoint) تأیید شده است. با بیش از ۱۳۰ کامیت از نسخه ۰.۹.۰، این کامپایلر اکنون رسماً Self-hosting (خود-میزبان) است و وضعیت FIXPOINT_OK را دارد.
گام بعدی شما
- اگر از زبانهای سیستمی استفاده میکنید، بکاند بومی را با پرچم
--backend nativeتست کنید. - ساختار جدید فایلهای
.bifرا برای بهینهسازی زمان بیلد در پروژههای بزرگ بررسی کنید. - از قابلیتهای جدید Generics و عملگر الماس برای سادهسازی کدها بهره ببرید.
- منتظر نسخه ۰.۱۱.۰ باشید که احتمالاً بر پایه این زیرساختهای ایمنی رشتهها و اجرای بومی بنا خواهد شد.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو