ما هو تصميم المترجم؟ الأنواع، أدوات البناء، مثال
⚡ ملخص ذكي
تصف مراحل المترجم المراحل الست التي تحول الشفرة المصدرية إلى شفرة الآلة: التحليل المعجمي، والتحليل النحوي، والتحليل الدلالي، وتوليد الشفرة الوسيطة، وتحسين الشفرة، وتوليد الشفرة، مدعومة بإدارة جدول الرموز ومعالجة الأخطاء.
ما هي مراحل تصميم المترجم؟
A مترجم يعمل المترجم على مراحل متعددة، حيث تحوّل كل مرحلة البرنامج المصدر من تمثيل إلى آخر. تستقبل كل مرحلة مدخلات من المرحلة السابقة وتُمرّر مخرجاتها إلى المرحلة التالية من المترجم. يتكون المترجم من ست مراحل، تُسهم كل منها في تحويل لغة البرمجة عالية المستوى إلى لغة الآلة. مراحل المترجم هي:
- التحليل المعجمي
- تحليل النحو
- التحليل الدلالي
- مولد الكود الوسيط
- Code محسن
- Code مولد كهربائي
مراحل المترجم
تقوم كل هذه المراحل بتحويل الكود المصدري عن طريق تقسيمه إلى رموز، وإنشاء أشجار تحليلية، وتحسين الكود المصدري من خلال مراحل مختلفة.
المرحلة الأولى: التحليل المعجمي
التحليل المعجمي هو المرحلة الأولى، حيث يقوم المترجم بفحص شفرة المصدر. يمكن أن تتم هذه العملية من اليسار إلى اليمين، حرفًا حرفًا، ويتم تجميع هذه الأحرف في رموز.
هنا، يتم تجميع تدفق الأحرف من البرنامج المصدر في تسلسلات ذات معنى عن طريق تحديد الرموز المميزة. ويتم إدخال الرموز المميزة المقابلة في جدول الرموز، ثم يتم تمرير هذا الرمز المميز إلى المرحلة التالية.
الوظائف الأساسية لهذه المرحلة هي:
- حدد الوحدات المعجمية في شفرة المصدر.
- صنّف الوحدات المعجمية إلى فئات مثل الثوابت والكلمات المحجوزة، وأدخلها في جداول مختلفة. سيتجاهل البرنامج التعليقات الموجودة في البرنامج المصدر.
- حدد رمزًا ليس جزءًا من اللغة.
على سبيل المثال: س = ص + 10
| رمز | النوع |
|---|---|
| X | معرف |
| = | مهمة تشغيل |
| Y | معرف |
| + | عامل الإضافة |
| 10 | رقم الهاتف |
المرحلة الثانية: تحليل بناء الجملة
يرتكز تحليل بناء الجملة على اكتشاف بنية الكود، وتحديد ما إذا كان النص يتبع التنسيق المتوقع أم لا. والهدف الرئيسي من هذه المرحلة هو التأكد من صحة الكود المصدري الذي كتبه المبرمج.
يعتمد تحليل بناء الجملة على قواعد لغة البرمجة المحددة من خلال بناء شجرة التحليل باستخدام الرموز. كما يحدد بنية اللغة المصدر وقواعدها النحوية.
فيما يلي قائمة بالمهام التي يتم تنفيذها في هذه المرحلة:
- احصل على الرموز من المحلل المعجمي.
- تحقق مما إذا كان التعبير صحيحًا نحويًا أم لا.
- أبلغ عن جميع أخطاء بناء الجملة.
- قم ببناء بنية هرمية تُعرف باسم شجرة التحليل النحوي.
مثال
أي مُعرِّف/رقم هو تعبير. إذا كان x مُعرِّفًا و y+10 تعبيرًا، فإن x = y+10 عبارة. انظر إلى شجرة التحليل للمثال التالي:
(a+b)*c
في شجرة التحليل:
- العقدة الداخلية: سجل يحتوي على حقل عامل التشغيل وحقلين للأبناء.
- الورقة: سجلات تحتوي على حقلين أو أكثر؛ أحدهما للرمز المميز والآخر لمعلومات أخرى حول الرمز المميز.
- تأكد من أن مكونات البرنامج تتناسب مع بعضها البعض بشكل هادف.
- يجمع معلومات النوع ويتحقق من توافق الأنواع.
- تسمح لغة المصدر بمعاملات التحقق.
المرحلة الثالثة: التحليل الدلالي
يتحقق التحليل الدلالي من الاتساق الدلالي للكود. يستخدم شجرة بناء الجملة للمرحلة السابقة جنبًا إلى جنب مع جدول الرموز للتحقق من أن كود المصدر المحدد متسق لغويًا. كما أنه يتحقق مما إذا كان الرمز ينقل المعنى المناسب.
سيقوم المحلل الدلالي بالتحقق من عدم تطابق الأنواع، والمعاملات غير المتوافقة، ودالة يتم استدعاؤها بمعاملات غير مناسبة، ومتغير غير معلن، وما إلى ذلك.
تتمثل وظائف مرحلة التحليل الدلالي فيما يلي:
- يساعدك على تخزين معلومات النوع التي تم جمعها وحفظها في جدول الرموز أو شجرة بناء الجملة.
- يُتيح لك إجراء فحص النوع.
- في حالة عدم تطابق النوع، حيث لا توجد قواعد تصحيح نوع دقيقة تلبي العملية المطلوبة، يتم عرض خطأ دلالي.
- يجمع معلومات النوع ويتحقق من توافق الأنواع.
- يتحقق مما إذا كانت لغة المصدر تسمح بالمعاملات أم لا.
مثال
float x = 20.2; float y = x*30;
في الكود أعلاه، سيقوم المحلل الدلالي بتحويل نوع العدد الصحيح 30 إلى عدد عشري 30.0 قبل عملية الضرب.
المرحلة الرابعة: المتوسطة Code جيل
بمجرد انتهاء مرحلة التحليل الدلالي، يقوم المترجم بإنشاء رمز وسيط للجهاز المستهدف. وهو يمثل برنامجًا لـ...tracآلة تي.
يُمثل الكود الوسيط حلقة وصل بين لغة البرمجة عالية المستوى ولغة الآلة. ويجب توليد هذا الكود الوسيط بطريقة تُسهّل ترجمته إلى لغة الآلة المستهدفة.
وظائف الوسيط Code توليد:
- ينبغي توليدها من التمثيل الدلالي للبرنامج المصدر.
- يحتوي على القيم المحسوبة أثناء عملية الترجمة.
- يساعدك على ترجمة الكود الوسيط إلى اللغة المستهدفة.
- يسمح لك بالحفاظ على ترتيب الأسبقية للغة المصدر.
- يحتوي على العدد الصحيح من معاملات التعليمات.
مثال
فمثلا:
total = count + rate * 5
الكود الوسيط باستخدام طريقة رمز العنوان هو:
t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3
المرحلة 5: Code التحسين
المرحلة التالية هي تحسين الكود الوسيط. في هذه المرحلة، تُزال أسطر الكود غير الضرورية، ويُعاد ترتيب تسلسل التعليمات البرمجية لتسريع تنفيذ البرنامج دون إهدار الموارد. الهدف الرئيسي من هذه المرحلة هو تحسين الكود الوسيط لإنتاج كود يعمل بسرعة أكبر ويشغل مساحة أقل.
الوظائف الأساسية لهذه المرحلة هي:
- يساعدك ذلك على إيجاد توازن بين سرعة التنفيذ وسرعة التجميع.
- يحسن وقت تشغيل البرنامج المستهدف.
- يُنتج رمزًا مبسطًا لا يزال في تمثيل وسيط.
- إزالة التعليمات البرمجية التي لا يمكن الوصول إليها والتخلص من المتغيرات غير المستخدمة.
- إزالة العبارات التي لم يتم تغييرها من الحلقة.
على سبيل المثال: ضع في اعتبارك الكود التالي:
a = intofloat(10)
b = c * a
d = e + b
f = d
يمكن أن يصبح:
b = c * 10.0
f = e + b
المرحلة 6: Code جيل
Code تُعدّ عملية التوليد المرحلة الأخيرة والنهائية في المُترجم. تستقبل هذه المرحلة المدخلات من مرحلة تحسين الكود، وتُنتج كود الصفحة أو الكود الكائني كنتيجة. يهدف هذا الجزء من العملية إلى تخصيص مساحة التخزين وتوليد كود الآلة القابل للنقل.
كما يقوم بتخصيص مواقع الذاكرة للمتغيرات. تُحوّل التعليمات الموجودة في الكود الوسيط إلى تعليمات الآلة. في هذه المرحلة، يُحوّل الكود المُحسّن أو الوسيط إلى اللغة المستهدفة.
اللغة المستهدفة هي لغة الآلة. لذلك، يتم اختيار جميع مواقع الذاكرة والسجلات وتخصيصها خلال هذه المرحلة. يتم تنفيذ الكود الناتج في هذه المرحلة لأخذ المدخلات وإنتاج المخرجات المتوقعة.
مثال
يمكن ترجمة المعادلة a = b + 60.0 إلى السجلات على النحو التالي:
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
إدارة جدول الرموز
يحتوي جدول الرموز على سجل لكل مُعرِّف، مع حقول لخصائص هذا المُعرِّف. يُسهِّل هذا المكون على المُصرِّف البحث عن سجل المُعرِّف واسترجاعه بسرعة. كما يُساعدك جدول الرموز في إدارة نطاق المتغيرات. يتفاعل جدول الرموز ومعالج الأخطاء مع جميع المراحل، ويتم تحديث جدول الرموز تبعًا لذلك.
روتين التعامل مع الأخطاء
في عملية تصميم المترجم، قد تحدث أخطاء في جميع المراحل المذكورة أدناه:
- محلل معجمي: رموز مكتوبة بشكل خاطئ.
- محلل بناء الجملة: قوس مفقود.
- مولد الشفرة الوسيطة: معاملات غير متطابقة لعامل تشغيل.
- Code محسن: عندما يتعذر الوصول إلى البيان.
- Code Generator: عندما تكون الذاكرة ممتلئة أو لا يتم تخصيص السجلات المناسبة.
- جداول الرموز: خطأ في تعريف عدة معرّفات.
أكثر الأخطاء شيوعاً هي تسلسلات الأحرف غير الصالحة في المسح الضوئي، وتسلسلات الرموز غير الصالحة في النوع، وخطأ النطاق، والتحليل في التحليل الدلالي.
قد يظهر الخطأ في أي من المراحل المذكورة أعلاه. بعد اكتشاف الأخطاء، يجب على المرحلة معالجتها لمواصلة عملية التجميع. يجب الإبلاغ عن هذه الأخطاء إلى معالج الأخطاء، الذي يتولى معالجتها لإتمام عملية التجميع. عادةً ما يتم الإبلاغ عن الأخطاء على شكل رسالة.



