العودة
Eurydice: تجميع Rust إلى C قابل للقراءة للبرامج عالية الموثوقية
SiTech AI Team3 دقيقة قراءة

Eurydice: تجميع Rust إلى C قابل للقراءة للبرامج عالية الموثوقية

Eurydice، وهو جزء من مشروع Aeneas، يحوّل كود Rust إلى C قابل للقراءة ويحافظ على بنية البرنامج. وهو مصمم للبرامج عالية الموثوقية حيث تتطلب أدوات التحقق والتوافق لغة C.

محوّل من Rust إلى C للكود عالي الموثوقية

Eurydice هو مشروع بحثي يحوّل برامج Rust إلى كود مصدر C ويحافظ على البنية الأصلية للكود دون تغيير. وهو موجه نحو المشاريع البرمجية عالية الموثوقية، حيث تتطلب أدوات التحقق والتوافق الحالية لغة C كبيانات إدخال. وقبل أن تتعلم هذه الأدوات العمل مباشرة مع Rust، يقدم Eurydice مساراً أكثر سلاسة للانتقال، وقد يشكل أيضاً نقطة انطلاق للبيئات التي يتوفر فيها مترجم C ولكن لا يتوفر مترجم Rust. وقد استخدم المشروع بالفعل لإعادة تجميع عدة روتينات للتشفير ما بعد الكمي من Rust إلى C.

بدأ Eurydice في عام 2023 وهو مرخّص بموجب شروط مختلطة من MIT و Apache-2.0. وهو جزء من مشروع Aeneas الذي ينشئ أدوات لاستخدام التحقق الشكلي على كود Rust. يحتفظ مشروع Aeneas بموظفي Inria، المعهد الوطني الفرنسي لأبحاث علوم الكمبيوتر، وMicrosoft، ويتلقى مساهمات خارجية.

الحفاظ على البنية بدلاً من التحسين

مثل معظم المترجمات، يأخذ Eurydice برنامج Rust ويحوّله إلى تمثيل وسيط، ويجري سلسلة من التحويلات ثم يُصدِر كوداً بلغة منخفضة المستوى، وفي هذه الحالة لغة C. لكن هدفهما يختلف، إذ يحافظ الناتج القابل للقراءة على البنية العامة للمصدر مع إزالة تلك البنى الموجودة في Rust وغير الموجودة في C. حيثما يجب تحديد ترتيب تقييم الأصلية، يُدخل الأداة متغيرات مؤقتة إضافية. تجميع نفس الدوال بواسطة rustc، على العكس، ينشئ حلقات معقدة وعمليات معالجة بتات كاملة، وهي مناسبة لإصدار التعليمات البرمجية، لكنها أقل قابلية للقراءة بكثير.

أين تصبح الترجمة صعبة

من المستحيل تمثيل كل برنامج Rust بأمانة في C. يجب إعادة تجميع حلقات for القائمة على المكررات، بدلاً من النطاقات، إلى حلقات while التي يتعامل معها كود Eurydice المساعد لإدارة حالة المكرر. ولأن C لا يحتوي على مفهوم الأنواع العامة (generics)، يجب أن يُفرّغ كود Rust أحادياً الشكل عند التحويل، مما قد ينشئ عدة تنفيذات للدالة التي تختلف فقط في النوع. الأنواع ذات الحجم الديناميكي تخلق تحدياً كبيراً بشكل خاص: يُصدِر Eurydice تمثيلين، واحداً بعضو مصفوفة مرنة وآخر بعضو مصفوفة ذات طول معروف. التحويل بينهما أثناء التشغيل لا يفعل شيئاً، لكنه تقنياً ينتهك قاعدة التسمية الصارمة في C، لذلك ينصح المشروع بتجميع الكود المولّد بخيار -fno-strict-aliasing.

القيود الحالية والأدوات المصاحبة

يعتمد Eurydice على KaRaMeL، الذي يستخدم نفس النهج لإعادة التجميع إلى C المهيكل من لغة أكثر تجريداً، وفي هذه الحالة لغة البرمجة F*. بدلاً من تطوير محلل ومدقق أنواع خاص، يعتمد Eurydice على Charon، أداة أخرى من Aeneas، لاستخراج البرنامج المعالج والمعالج مسبقاً من rustc وإصدار تمثيله الوسيط متوسط المستوى بصيغة JSON. عملياً، غالباً ما يرفض Charon الميزات الأحدث في Rust، مثل const generics، ولهذا يعمل Eurydice بشكل أفضل حالياً على برامج صغيرة مكتفية ذاتياً تتجنب ميزات Rust المعقدة. يقول كاتب التقرير الأصلي إن الأداة تكون أكثر قيمة عندما يستمر كود Rust في التغيير وتكون هناك حاجة لطريقة آلية للحفاظ على تزامن نسخة C. Eurydice هو مجرد أحدث إدخال في مجموعة أدوات سريعة النمو التي تكيّف كود Rust ليناسب المزيد من البيئات.

المصادر: lwn.net

SSiTech

SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي

نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.