مرحبا يا هبر! لعدة أسابيع حتى الآن ، كنت أقوم بتطوير لغة البرمجة الخاصة بي Rust. أود أن أتحدث عما قد يواجهه المبتدئ في هذا العمل وما يجب أن يعرف عنه.
تاريخ موجز
بدأ كل شيء بشوكة من عين ، وتعرفت عليه لمعرفة كيفية بناء لغات البرمجة. نظرًا لأن ein يتم تفسيره من وإلى ، لم تكن سرعة تنفيذه هي الأعلى ، وبعد أن بدأت أفهم شيئًا ما ، قررت أن أبدأ في كتابة مترجمتي الخاصة ، والتي تم التخلي عنها في النهاية.
ولكن من السابق لأوانه اليأس! قرأت بضع مقالات حول VM وما هي و قررت كتابة VM مكدسة بسيطة.
ما هي "الآلة الافتراضية المكدسة" وكيف تعمل؟
على habr هناك مقالة otdelny حول هذا الموضوع ، ولكن ليس للقيادة على الروابط سأشرح بإيجاز معنى هذا الشيء الصغير.
يقوم المكدس VM بتنفيذ جميع العمليات على البيانات المخزنة في شكل مكدس ، وتسترد كل عملية المقدار الضروري من البيانات للعملية وبعد التنفيذ ، يمكنها "إرسال" رقم جديد إلى المكدس.
الشروع في العمل
تحتاج أولاً إلى إنشاء مشروع جديد باستخدام البضائع:
cargo new habr_vm
أولاً ، نحتاج إلى إنشاء بعض العمليات الأساسية لجهاز VM الخاص بنا:
enum Opcode { Push(i32), Add, AddAssign(i32), Sub, SubAssign(i32), }
هذه هي عملياتنا الأساسية ، سيضيف أمر Push رقمًا جديدًا إلى المكدس ، وسيأخذ Add and Sub رقمين من المكدس وينفذ إجراءات معهم (الجمع والطرح على التوالي) ، ولست بحاجة لشرح AddAssign و SubAssign.
المهمة التالية هي إنشاء الآلة الافتراضية نفسها ، لذلك سننشئ بنية غير معقدة:
struct Vm { pub stack: Vec<i32>, }
وننفذها:
impl Vm {
قمنا بتنفيذ هيكلنا ، ماذا بعد ذلك؟ بعد ذلك نحتاج إلى إنشاء "برنامجنا".
إليك كيف يجب أن تبدو:
let program = vec![ Opcode::Push(2),
الأمر بسيط ، أليس كذلك؟ إذا كان الأمر كذلك ، فلنقم بتشغيل برنامجنا!
let mut vm = Vm {stack: Vec::new()}; vm.run(program);
الأمر بسيط جدًا بالنسبة لي ، لذا يمكنك إضافة عدد كافٍ من رموز العمليات للعملية التي تحتاجها.
الخلاصة
أعتقد أنني شرحت بشكل واضح تمامًا كيفية كتابة كل هذا على صدأ وكيف يعمل.
وأود أن أضيف أنه يمكنك بسهولة إرسال YAP من خلال مثل هذا VM، أنت أساسا لا يزال فقط إرسال محلل، lexer و "المترجم"، وإذا كنت مطاردة لإلقاء نظرة على الانتهاء من المشروع يمكنك الذهاب من خلال هذا الرابط .
جميع التعليمات البرمجية من المقالة متاحة في هذا المستودع.
حظاً طيباً يا هبر!