دروس من كتابة المترجم

دليل مجمعي النماذج الأولية هو: 600 صفحة عن نظرية التحليل النحوي. ثلاث صفحات لفحص النوع لنظام نوع من الدرجة الأولى مثل C. لا توجد صفحات لتخزين والتحقق من صحة العبارات ("جدول الرموز"). صفحات صفرية على نموذج البناء والتنفيذ الفعال للبنية المنفصلة. 450 صفحة على التحسين وإنشاء الكود.

تعد الأدبيات الأكاديمية القياسية مفيدة للغاية للواجهة الأمامية المتطرفة (التحليل) والخلفية المتطرفة (SSA واختيار التعليمات وإنشاء الكود) ، ولكن يتم تجاهل النهاية الوسطى. يعد هذا أمرًا رائعًا إذا كنت تريد تعلم كيفية إنشاء LLVM التالي ، على سبيل المثال: واجهة خلفية كبيرة بواجهة أمامية رفيعة جدًا.

ولكن ماذا لو أنشأت مترجمًا أعلى LLVM ، بحيث يكون كل شيء هو الواجهة الأمامية والمتوسطة؟ يعد التحليل الدلالي ، وفحص النوع ، وفحص قاعدة التصريح من أهم أجزاء المجمعين الحديثين لأن هذا هو المكان الذي يتم فيه إجراء جميع التشخيصات المهمة (بخلاف أخطاء بناء الجملة).

تحتوي هذه المقالة على بعض الدروس التي تعلمتها أثناء كتابة المترجم لـ Austral ، وهي لغة برمجة نظام جديدة بأنواع خطية كنت أعمل عليها منذ فترة. الأقسام الأولى عالية المستوى ، والأقسام الأخرى أكثر تحديدًا باستخدام OCaml لكتابة مترجم. استراتيجيات التنفيذ فقط استخدم OCaml فقط استخدم Menhir ما هي الاختبارات المفيدة نموذج البناء تنظيم الأكواد مشاكل التمهيد البيئة تحديد الإقرارات الأخطاء ملاحظات

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

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

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

الجانب السلبي هو الوصول إلى "Hello، world!" يستغرق وقتًا طويلاً جدًا. عند كتابة مترجم للغة موجودة ، فإن هذا لا يهم. ولكن عند إنشاء لغة جديدة ، فأنت تريد شيئًا يمكنك اللعب به في مرحلة مبكرة ، حتى تتمكن من معرفة ما يبرز في تصميم اللغة ، وما الذي يحتاج إلى التغيير والتبديل ، وما هي براغماتية اللغة.

ومع ذلك ، فإن واقع ضغوط التنمية والفرص يعني أن النتيجة النهائية أشبه بما يلي:

عادةً ما يتم استبعاد عمليات تشخيص الأخطاء والتحليل الدلالي.

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

دروس من كتابة المترجم

دليل مجمعي النماذج الأولية هو: 600 صفحة عن نظرية التحليل النحوي. ثلاث صفحات لفحص النوع لنظام نوع من الدرجة الأولى مثل C. لا توجد صفحات لتخزين والتحقق من صحة العبارات ("جدول الرموز"). صفحات صفرية على نموذج البناء والتنفيذ الفعال للبنية المنفصلة. 450 صفحة على التحسين وإنشاء الكود.

تعد الأدبيات الأكاديمية القياسية مفيدة للغاية للواجهة الأمامية المتطرفة (التحليل) والخلفية المتطرفة (SSA واختيار التعليمات وإنشاء الكود) ، ولكن يتم تجاهل النهاية الوسطى. يعد هذا أمرًا رائعًا إذا كنت تريد تعلم كيفية إنشاء LLVM التالي ، على سبيل المثال: واجهة خلفية كبيرة بواجهة أمامية رفيعة جدًا.

ولكن ماذا لو أنشأت مترجمًا أعلى LLVM ، بحيث يكون كل شيء هو الواجهة الأمامية والمتوسطة؟ يعد التحليل الدلالي ، وفحص النوع ، وفحص قاعدة التصريح من أهم أجزاء المجمعين الحديثين لأن هذا هو المكان الذي يتم فيه إجراء جميع التشخيصات المهمة (بخلاف أخطاء بناء الجملة).

تحتوي هذه المقالة على بعض الدروس التي تعلمتها أثناء كتابة المترجم لـ Austral ، وهي لغة برمجة نظام جديدة بأنواع خطية كنت أعمل عليها منذ فترة. الأقسام الأولى عالية المستوى ، والأقسام الأخرى أكثر تحديدًا باستخدام OCaml لكتابة مترجم. استراتيجيات التنفيذ فقط استخدم OCaml فقط استخدم Menhir ما هي الاختبارات المفيدة نموذج البناء تنظيم الأكواد مشاكل التمهيد البيئة تحديد الإقرارات الأخطاء ملاحظات

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

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

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

الجانب السلبي هو الوصول إلى "Hello، world!" يستغرق وقتًا طويلاً جدًا. عند كتابة مترجم للغة موجودة ، فإن هذا لا يهم. ولكن عند إنشاء لغة جديدة ، فأنت تريد شيئًا يمكنك اللعب به في مرحلة مبكرة ، حتى تتمكن من معرفة ما يبرز في تصميم اللغة ، وما الذي يحتاج إلى التغيير والتبديل ، وما هي براغماتية اللغة.

ومع ذلك ، فإن واقع ضغوط التنمية والفرص يعني أن النتيجة النهائية أشبه بما يلي:

عادةً ما يتم استبعاد عمليات تشخيص الأخطاء والتحليل الدلالي.

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

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow