تصور کنید سالها منطق پیچیده در کدهای قدیمی C++ دارید و میخواهید بدون ریسکِ خطاهای حافظه، آنها را به Rust منتقل کنید، اما نمیخواهید ماهها وقت صرف جنگ با Borrow Checker کنید. حالا با معرفی Cpp2Rust، این کابوس برای برنامهنویسان به یک تسک کامپایلی ساده تبدیل شده است.
این ابزار که جزئیات آن در یک مقاله پژوهشی در کنفرانس PLDI ۲۰۲۶ منتشر شده، مستقیماً کد C++ را به کد کاملاً ایمن (Safe Rust) تبدیل میکند. طبق مستندات پروژه، هدف اصلی این است که توسعهدهندگان بتوانند از امنیت حافظه در Rust بهره ببرند بدون اینکه مجبور باشند دههها منطق تثبیتشده در C++ را دستی بازنویسی کنند. این رویکرد مکمل استراتژیهای مهاجرت تدریجی است که پیشتر در نقشه راه Mainmatter برای انتقال کدهای قدیمی C به Rust بررسی شده بود.
همانطور که در تحلیلهای پیشین ما دربارهی استانداردهای ایمنی حافظه اشاره کردیم، اکثر تبدیلکنندههای فعلی، بلوکهای unsafe تولید میکنند که مخاطرات C++ را عیناً به Rust میبرند. اما Cpp2Rust برای حل این مشکل از یک مدل شمارش مراجع استفاده میکند تا خروجی نهایی دقیقاً با استانداردهای ایمنی Rust مطابقت داشته باشد.
بر اساس مستندات این پروژه در گیتهاب (GitHub)، این سامانه در سه مرحله اصلی عمل میکند:
- تجزیه AST: ابزار از Clang برای تحلیل فایلهای ورودی و تولید یک درخت نحو انتزاعی (AST) — که شبیه به نقشهی ساختمان از ساختار کد است — استفاده میکند.
- ترجمه: سیستم AST را پیمایش کرده و رشتههای متنی Rust را تولید میکند و در نقاط لازم، فراخوانیهای کتابخانه زمان-اجرای libcc2rs را درج میکند.
- قالببندی: خروجی نهایی از طریق rustfmt پردازش شده تا یک فایل واحد
.rsتولید شود.
برای مدیریت پیچیدگی اشارهگرهای C، کتابخانه libcc2rs یک نوع دادهای به نام Ptr<T> معرفی کرده است. این نوع داده، مقادیر تهی (Null)، محاسبات اشارهگر و همپوشانیها را از طریق عملیاتهای بررسیشده در زمان اجرا مدیریت میکند. به این ترتیب، کد میتواند بدون استفاده از بلوکهای unsafe، از سد Borrow Checker عبور کند. برای کاربرانی که به بازدهی حداکثری نیاز دارند، پرچم --model=unsafe امکان تولید کد استاندارد unsafe را فراهم میکند.
این تغییر، مهاجرت از C++ را از یک بازنگری معماری پرریسک به یک فرآیند مدیریتپذیر تبدیل میکند. با خودکارسازی لایهی ایمنی، تیمها میتوانند زیرساختهای حیاتی را با تضمین فوریِ حافظه پورت کنند و پنجرههای زمانی برای آسیبپذیریهای امنیتی را بهشدور کاهش دهند.
گام بعدی شما
- برای پروژههای خود یک فایل
compile_commands.jsonاز طریق CMake تولید کنید. - مترجم را روی دایرکتوری سورس خود اجرا کنید تا تفاوت مدل ایمن و غیرایمن را بسنجید.
- عملکرد
Ptr<T>را در بخشهای حساس حافظه بررسی کنید تا اثر آن بر تأخیر (Latency) را ارزیابی کنید.
اما بحث بهینهسازی عملکرد در این تبدیلها تازه شروع شده است؛ اثر این رویکرد بر سرعت اجرای سیستمهای بلادرنگ را در گزارش بعدی بررسی خواهیم کرد.




گفتگو