هیچ محصولی در سبد خرید نیست.

Rust 1.99 منتشر شد؛ قابلیت‌های جدید FFI و raw pointer

Rust 1.99 منتشر شد؛ قابلیت‌های جدید FFI و raw pointer

Rust ۱.۹۹ در ۱ اکتبر ۲۰۲۶ به‌صورت پایدار منتشر شد. مهم‌ترین تغییر این نسخه، پایدارشدن تعریف توابع variadic با ABIهای C و C-unwind است؛ یعنی برنامهٔ Rust می‌تواند خودش تابعی با فهرست آرگومان متغیر تعریف کند و فقط به فراخوانی توابعی که از بیرون نوشته شده‌اند محدود نباشد. برای تیم‌هایی که با کتابخانه‌های C، موتورهای قدیمی، درایورهای سیستم یا لایه‌های FFI کار می‌کنند، این تغییر ارزش بررسی جدی دارد.

در این مقاله، قابلیت‌های مهم Rust ۱.۹۹ را از زاویهٔ عملی بررسی می‌کنیم. عدد نسخه به‌تنهایی دلیل کافی برای ارتقا نیست؛ باید قراردادهای ایمنی، کدهای unsafe، سازگاری ABI و رفتار حافظه در محیط staging آزمایش شوند.

Rust 1.99 منتشر شد؛ قابلیت‌های جدید FFI و raw pointer

چرا Rust ۱.۹۹ برای FFI مهم است؟

Rust پیش از این می‌توانست توابع variadic خارجی، مانند الگوهای مشابه printf در libc، را فراخوانی کند. در Rust ۱.۹۹ امکان تعریف چنین توابعی با ABIهای «C» و «C-unwind» نیز پایدار شده است. تابعی که با این روش تعریف می‌شود فهرستی متغیر از آرگومان‌ها می‌پذیرد و از VaList برای خواندن مقادیر استفاده می‌کند. نوع آرگومان‌هایی که از این فهرست خوانده می‌شوند باید با قرارداد ABI و trait مربوط به ایمنی آرگومان سازگار باشند.

این قابلیت می‌تواند مرز بین کد Rust و APIهای قدیمی C را ساده‌تر کند، اما همچنان در حوزهٔ unsafe قرار دارد. مسئولیت بررسی تعداد آرگومان‌ها، نوع واقعی آن‌ها، ترتیب ارسال و قرارداد حافظه بر عهدهٔ فراخواننده است. بنابراین این نسخه جایگزین تست ABI یا مستندسازی قرارداد FFI نمی‌شود؛ فقط ابزار رسمی‌تری برای پیاده‌سازی آن در اختیار توسعه‌دهنده می‌گذارد.

APIهای جدید برای raw pointer و Layout

یکی دیگر از بخش‌های مهم Rust ۱.۹۹ پایدارشدن APIهایی برای به‌دست‌آوردن اندازه و هم‌ترازی از raw pointerها است. Layout::for_value_raw، size_of_val_raw و align_of_val_raw اطلاعات لازم برای کدهای سطح پایین و نوع‌های unsized را فراهم می‌کنند. این توابع زمانی مفید هستند که کتابخانه‌ای باید اندازهٔ واقعی داده را پیش از تخصیص، کپی یا عبور از یک مرز FFI محاسبه کند.

با این حال، raw pointer به‌خودی‌خود مالکیت یا اعتبار داده را تضمین نمی‌کند. پیش از استفاده باید طول عمر شیء، معتبر بودن pointer، هم‌ترازی، اندازهٔ قابل دسترس و نبودن race بررسی شود. تیم‌هایی که Rust ۱.۹۹ را در کتابخانه‌های unsafe به‌کار می‌گیرند بهتر است برای هر مسیر جدید، یک قرارداد ایمنی مکتوب و تست‌های منفی داشته باشند؛ تست موفقیت معمولی برای کشف خطاهای pointer کافی نیست.

Rust 1.99 منتشر شد؛ قابلیت‌های جدید FFI و raw pointerRust 1.99 منتشر شد؛ قابلیت‌های جدید FFI و raw pointer

تغییرات مرتبط با Box و Vec

در این نسخه چند API مرتبط با Box و Vec نیز پایدار شده‌اند؛ از جمله Box::into_non_null، Box::from_non_null، Vec::into_parts و Vec::from_parts. این APIها کنترل بیشتری روی تخصیص و بازسازی داده می‌دهند و برای allocatorهای سفارشی یا کدهای سطح پایین جذاب‌اند. در مقابل، هرچه کنترل دستی بیشتر شود، احتمال نقض قرارداد مالکیت نیز بالاتر می‌رود.

مستندات جدید Box::leak هم دربارهٔ الگوهایی که بعداً حافظهٔ leaked را دوباره آزاد می‌کنند هشدار می‌دهد. در چنین سناریویی استفاده از Box::into_non_null یا Box::into_raw می‌تواند انتخاب روشن‌تری باشد، چون مسیر مالکیت و آزادسازی را صریح‌تر نشان می‌دهد. این نکته برای پروژه‌ای که هم‌زمان با Rust ۱.۹۹ و allocator سفارشی کار می‌کند اهمیت بیشتری دارد.

چک‌لیست ارتقای امن

قبل از اجرای rustup update stable، نسخهٔ toolchain و وابستگی‌های پروژه را ثبت کنید. سپس تست‌های unit، integration و FFI را روی staging اجرا کنید و خروجی build را با نسخهٔ قبلی مقایسه کنید. اگر پروژه به C یا C++ متصل است، ABI را روی چند پلتفرم هدف بررسی کنید؛ اختلاف در اندازهٔ نوع‌ها، هم‌ترازی یا convention فراخوانی می‌تواند فقط در production آشکار شود.

در مرحلهٔ بعد، همهٔ تغییرات مربوط به raw pointer، VaList و Box را جداگانه بازبینی کنید. ابزارهای sanitizer، تست‌های fuzz و بررسی memory leak را در pipeline قرار دهید و برای هر مسیر unsafe، پیش‌شرط و پس‌شرط قابل مشاهده بنویسید. پس از تأیید staging، Rust ۱.۹۹ را روی یک سرویس کم‌ریسک یا canary ارتقا دهید، لاگ‌ها و مصرف حافظه را پایش کنید و تنها بعد از تأیید معیارهای rollback، rollout را گسترش دهید.

جمع‌بندی

Rust ۱.۹۹ بیش از آنکه یک نسخهٔ صرفاً ظاهری باشد، چند قابلیت مهم برای برنامه‌نویسی سیستم و FFI را به کانال stable می‌آورد. توابع C-variadic، APIهای Layout برای raw pointer و ابزارهای جدید Box و Vec می‌توانند طراحی کتابخانه‌های سطح پایین را ساده‌تر کنند؛ اما هیچ‌کدام مسئولیت ایمنی را حذف نمی‌کنند. بهترین مسیر، ارتقای مرحله‌ای، تست ABI، بازبینی کد unsafe و ثبت امکان بازگشت است.

جزئیات کامل را در اعلامیهٔ رسمی Rust ۱.۹۹ و یادداشت انتشار رسمی بخوانید. برای مطالب بیشتر دربارهٔ برنامه‌نویسی سیستم و زیرساخت، مجلهٔ تکتاز را دنبال کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

از محدودیت زمانی فراتر رفت لطفاً یکبار دیگر کپچا را کامل کنید.