Rust 1.99 قراردادهای FFI و اشارهگرهای خام را شفافتر میکند
Rust 1.99.0 تعریف توابع متغیرآرگومان با ABI زبان C، APIهای چیدمان اشارهگر خام و چند راهنمایی مهم برای کدهای سطح پایین و میانافزاری را به نسخه پایدار میآورد.

Rust 1.99.0 که در اول اکتبر منتشر شد، مرز میان مدل ایمنی Rust و رابطهای سطح پایین را شفافتر میکند. این انتشار برای تیمهایی مهم است که ابزارهای بومی، آداپتورهای FFI، تخصیصدهندهها و ابزارهای ساخت پیرامون WebAssembly یا پروژههای ICP را نگهداری میکنند.
مهمترین تغییر، پایدار شدن امکان تعریف توابع متغیرآرگومان با ABIهای C و C-unwind است. Rust پیشتر میتوانست توابعی مانند printf را که در کتابخانههای خارجی تعریف شدهاند فراخوانی کند؛ اما اکنون خود Rust نیز میتواند توابع سازگارِ متغیرآرگومان را پیادهسازی کند. آرگومانها از طریق VaList خوانده میشوند و نوع آرگومانهای مجاز با VaArgSafe محدود میشود. Rust همچنین پشتیبانی از توابع متغیرآرگومانِ naked را که از اسمبلی درونخطی استفاده میکنند پایدار کرده است.
این قابلیت برای لایههای سازگاری مفید است، اما بار ایمنی FFI را از بین نمیبرد. یک تابع متغیرآرگومان همچنان به این وابسته است که فراخواننده تعداد، نوع و ABI مورد انتظار آرگومانها را رعایت کند. مثال اعلامیه انتشار، تابع را unsafe معرفی میکند و پیششرط آن را مستند میسازد. در bindingهای تولیدی، این قرارداد باید در API پوششی قابل مشاهده بماند و به هر محل فراخوانی واگذار نشود.
Rust 1.99 همچنین Layout::for_value_raw، size_of_val_raw و align_of_val_raw را پایدار میکند. این APIها امکان دریافت اندازه و همترازی از اشارهگرهای خام، از جمله اشارهگر به انواع با اندازه پویا، را فراهم میکنند. این ویژگی برای تخصیصدهندهها، نمایش اشیا و کدهای FFI که باید چیدمان حافظه را بررسی کنند، بدون تبدیل همهچیز به referenceهای معمولی، کاربردی است.
نتیجه عملی این تغییر، دقت بیشتر است نه مجوز بیشتر. پرسوجوی چیدمان از طریق اشارهگر خام میتواند به مدیریت درست metadata کمک کند، اما اشارهگر نامعتبر را معتبر نمیکند و نیاز به رعایت provenance، مقداردهی اولیه، همترازی و طول عمر را از بین نمیبرد. تیمها باید این APIهای جدید را ابزارهایی محدود درون abstractionهای unsafe حسابرسیشده بدانند.
این انتشار برای کد مدیریت حافظه نیز هشدار مرتبطی دارد: مستندات Rust اکنون استفاده از الگوهایی را که پس از عبور رفتوبرگشتی از Box::leak حافظه را آزاد میکنند، توصیه نمیکند. در اعلامیه، استفاده از Box::into_non_null یا Box::into_raw پیشنهاد شده است. این تغییر راهنمای مستندسازی است، نه تغییر در معنای زبان؛ بااینحال برای کتابخانههایی که مالکیت را میان تخصیصدهندههای سفارشی یا runtimeهای خارجی منتقل میکنند، اهمیت دارد.
برای توسعهدهندگان ICP، پیام اصلی بررسی لبه بومیِ خط لوله ساخت و استقرار است. کانتینرهای WebAssembly معمولاً از توابع متغیرآرگومان C استفاده نمیکنند، اما ابزارهای میزبان، کتابخانههای رمزنگاری، bindingهای انتقال و یکپارچهسازیهای سفارشی ساخت ممکن است از این مرزها عبور کنند. Rust 1.99 بسیاری از این عملیات را در نسخه پایدار در دسترس قرار میدهد؛ اما قراردادهای آنها را خودکار نمیکند.
Cargo نیز یک پروفایل داخلی debug اضافه میکند تا برای انتقال احتمالی dev به سمت تکرار سریعتر آماده شود؛ طبق یادداشت انتشار، این دو پروفایل فعلاً رفتار یکسانی دارند. کاربران CI باید همچنین نکته سازگاری انتشار را بررسی کنند: وقتی Cargo متغیر محیطی CI را تشخیص دهد، کامپایل افزایشی بهصورت پیشفرض غیرفعال میشود. این موضوع حتی بدون تغییر کد منبع میتواند بر زمان ساخت و فرضیات مربوط به cache اثر بگذارد.
مسیر امن ارتقا تدریجی است: Rust 1.99 را با rustup update stable نصب کنید، crateهای سنگین از نظر FFI و تخصیص حافظه را با toolchain جدید بسازید و پیش از تغییر سیاست پروفایل، هشدارها و زمانهای CI را بررسی کنید. اهمیت این انتشار در یک قابلیت نمایشی واحد خلاصه نمیشود؛ Rust 1.99 قراردادهای سطح پایین را در نقاط برخورد با ABIهای خارجی و حافظه خام آشکارتر میکند.
خبرخوان را در ایمیل بگیرید
هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.


