نكتب لغة البرمجة لدينا ، الجزء 4: تمثيل الهياكل والطبقات ، وتوليد المخصصين

الصورة

يوم جيد لأولئك الذين قرروا قراءة مقالتي القادمة.

بادئ ذي بدء ، أنشر روابط للأجزاء السابقة:
الجزء 1: كتابة لغة VM
الجزء 2: عرض متوسط ​​للبرامج
الجزء 3: هندسة المترجم. تحليل هياكل اللغة والتعبيرات الرياضية

يجدر أيضًا نشر روابط إلى المستودع ومقالة نظرة عامة صغيرة وصفت فيها بإيجاز العمل المنجز بكامله.

لذلك ، في المقالة الأخيرة وصفت إنشاء مترجم من لغة برمجة عالية المستوى إلى حد ما إلى تمثيل وسيط وتجميع إضافي للتطبيق.

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

لنبدأ في إنشاء ...


عرض الطبقة


يجدر أن نبدأ بحقيقة أن أي هيكل يمكن تمثيله كصفيف. يمكن ربط فهرس عنصر الصفيف بمتغير فئة معين أو طريقته.

فكر في مثال بسيط للرمز (بشكل طبيعي على Mash):
الصورة

فيما يلي مثال بسيط لفئة تخزن نسخًا من قيم a و b ، والتي يتم تمريرها إليها في المُنشئ. كما أن لديها destructor و summ الدالة التي ستقوم بإرجاع مجموع a و b.
ولكن في التمثيل الوسيط ، لا يوجد OOP ، بل وأكثر من ذلك على مستوى VM.
إذا نظرنا أعمق قليلاً لمعرفة ما هي MyClass فعليًا ، فسنرى عن الصورة التالية:
الصورة

عظيم المترجم ، من خلال التلاعب والتعاويذ البسيطة ، يحول هيكلنا إلى مجموعة بسيطة.

الكتابة الديناميكية للفصول


يجدر أيضًا التفكير في إعداد الكتابة الديناميكي السريع للفصول والعمل المقابل لها ، لأنه في اللغات ذات الكتابة الديناميكية هذه نقطة مهمة جدًا.

الحل الأبسط والأكثر فعالية هو جدول افتراضي للمكونات الصفية. أي في المترجم ، يمكنك تنفيذ معالجة جميع تعريفات الفصل وإعداد قائمة بالأسماء والأساليب المتغيرة للفئة. وفقا لذلك ، منذ ذلك الحين يتم تمثيل فصولنا في شكل صفائف - كل اسم من القائمة يشبه الفهرس. أثناء ملء قائمة الأسماء - يمكنك تحديد حجم الصفيف لكل فئة ، لتخصيص ذاكرة أكثر اقتصادا.

مخصصات الفئة الأساسية


لتتمكن من استخدام فئة مع جدول أساليب افتراضي ، بالإضافة إلى تخصيص ذاكرة ببساطة ، تحتاج إلى ملء هذا الجدول بمؤشرات لنقاط الإدخال لأساليب الفصل.

طريقة بسيطة وعملية هي إنشاء مخصص لكل فئة. هذه طريقة بسيطة تقوم بتخصيص ذاكرة لصفيف بنية الفصل ، وتعبئته جزئيًا ، وتقوم بإرجاع مؤشر إلى الفصل.

يتم استدعاء التخصيصات عند إنشاء مثيل للفئة ، أي في المثال أعلاه ، سيتم إجراء المكالمة على السطر 24 - "MyClass الجديد (10 ، 20)". بعد التخصيص ، يمكنك استدعاء مُنشئ الفصل. في Mash ، يتم استدعاء المُنشئ إذا كانت البنية الجديدة تحتوي على أقواس (...) بعد اسم الفئة.

التأمل


من الممكن ألا يكون الجميع على دراية بهذا التعريف ، لكن الكثيرين صادفوه.
الاستبطان - هو تعريف نوع الكائن الذي يتم به العمل أثناء تنفيذ التعليمات البرمجية. مثال على ذلك هو typeof () في نفس JavaScript.


يحتوي Mash على الاستبطان التام ، أي لأنواع البيانات البسيطة والفئات.
بدون مزيد من اللغط ، فيما يلي بعض أمثلة الكود:
الصورة

وللصف:
الصورة

يتم تطبيق الاستبطان للفئات عن طريق إضافة نوع إلى حقل كل فئة - مؤشر إلى نوعه.

الانتهاء


حاولت أن أشرح بلغة بسيطة كيف يتم تنظيم العمل مع الفصول في مترجم Mash الخاص بي. تقنية مماثلة هي أيضا متأصلة في العديد من اللغات الأخرى مع الكتابة الديناميكية.

آمل أن تجد هذا المقال مثيرًا للاهتمام. شكرا لقراءته حتى النهاية إذا فعلت. في الوقت الحالي ، ربما كان هذا مقالي الأخير حول إنشاء لغة Mash (طالما أنني لا أتقن تجميع JIT). ستنظر مقالاتي اللاحقة في جوانب أخرى من المشروع ، أو ستتعلق بمواضيع أخرى على الإطلاق.

Source: https://habr.com/ru/post/ar436224/


All Articles