توليد الكود (المترجم)
يحتاج هذا المقدّم الخاص بإنشاء الكود إلى مصادر إضافية للتحقق . ( نوفمبر 2006 ) |
في الحوسبة ، يعد إنشاء الكود جزءًا من سلسلة عملية المترجم ويحول التمثيل الوسيط للكود المصدر إلى نموذج (على سبيل المثال، كود الآلة ) يمكن تنفيذه بسهولة بواسطة النظام المستهدف.
عادةً ما تقوم المجمِّعات المتطورة بتنفيذ عمليات تمرير متعددة عبر أشكال وسيطة مختلفة. تُستخدم هذه العملية متعددة المراحل لأن العديد من الخوارزميات لتحسين الكود أسهل في التطبيق واحدة تلو الأخرى، أو لأن المدخلات إلى أحد عمليات التحسين تعتمد على المعالجة المكتملة التي يقوم بها تحسين آخر. كما يسهل هذا التنظيم إنشاء مُجمِّع واحد يمكنه استهداف بنيات متعددة، حيث تحتاج فقط آخر مراحل إنشاء الكود (الواجهة الخلفية ) إلى التغيير من هدف إلى آخر. (لمزيد من المعلومات حول تصميم المجمِّع، راجع المجمِّع ).
تتكون المدخلات إلى مولد التعليمات البرمجية عادةً من شجرة تحليل أو شجرة بناء جملة مجردة . [1] يتم تحويل الشجرة إلى تسلسل خطي من التعليمات، عادةً بلغة وسيطة مثل التعليمات البرمجية ثلاثية العناوين . قد يُشار إلى المراحل الأخرى من التجميع باسم "إنشاء التعليمات البرمجية" أو لا يُشار إليها، اعتمادًا على ما إذا كانت تنطوي على تغيير كبير في تمثيل البرنامج. (على سبيل المثال، من غير المرجح أن يُطلق على تمريرة تحسين ثقب الباب "إنشاء التعليمات البرمجية"، على الرغم من أن مولد التعليمات البرمجية قد يتضمن تمريرة تحسين ثقب الباب.)
المهام الرئيسية
بالإضافة إلى التحويل الأساسي من تمثيل وسيط إلى تسلسل خطي من تعليمات الآلة، يحاول مولد الكود النموذجي تحسين الكود الناتج بطريقة ما.
تتضمن المهام التي تشكل عادةً جزءًا من مرحلة "إنشاء الكود" الخاصة بالمترجم المتطور ما يلي:
- اختيار التعليمات : التعليمات التي يجب استخدامها.
- جدولة التعليمات : الترتيب الذي يجب أن يتم به وضع هذه التعليمات. الجدولة هي عملية تحسين للسرعة يمكن أن يكون لها تأثير بالغ الأهمية على الآلات المتصلة .
- تخصيص السجل : تخصيص المتغيرات لسجلات المعالج [2]
- تصحيح أخطاء إنشاء البيانات إذا لزم الأمر حتى يمكن تصحيح أخطاء الكود .
يتم تنفيذ اختيار التعليمات عادةً عن طريق إجراء مسح متكرر بعد الترتيب على شجرة بناء الجملة المجردة، ومطابقة تكوينات الشجرة المحددة مع القوالب؛ على سبيل المثال، قد يتم تحويل الشجرة إلى تسلسل خطي من التعليمات عن طريق إنشاء التسلسلات بشكل متكرر لـ و ، ثم إصدار التعليمات .
W := ADD(X,MUL(Y,Z))t1 := Xt2 := MUL(Y,Z)ADD W, t1, t2
في المترجم الذي يستخدم لغة وسيطة، قد تكون هناك مرحلتان لاختيار التعليمات - واحدة لتحويل شجرة التحليل إلى كود وسيط، ومرحلة ثانية في وقت لاحق لتحويل الكود الوسيط إلى تعليمات من مجموعة تعليمات الجهاز المستهدف. لا تتطلب هذه المرحلة الثانية عبور الشجرة؛ يمكن القيام بها خطيًا، وتتضمن عادةً استبدالًا بسيطًا لعمليات اللغة الوسيطة بأكواد التشغيل المقابلة لها . ومع ذلك، إذا كان المترجم في الواقع مترجم لغة (على سبيل المثال، مترجم يحول Java إلى C++ )، فقد تتضمن مرحلة توليد الكود الثانية بناء شجرة من الكود الوسيط الخطي.
إنشاء الكود وقت التشغيل
عندما يحدث إنشاء الكود في وقت التشغيل ، كما هو الحال في التجميع في الوقت المناسب (JIT)، فمن المهم أن تكون العملية بأكملها فعالة فيما يتعلق بالمساحة والوقت. على سبيل المثال، عندما يتم تفسير التعبيرات العادية واستخدامها لإنشاء الكود في وقت التشغيل، غالبًا ما يتم إنشاء آلة حالة محدودة غير حتمية بدلاً من آلة حتمية، لأنه عادةً ما يمكن إنشاء الأولى بشكل أسرع وتشغل مساحة ذاكرة أقل من الثانية. على الرغم من أنها تولد كودًا أقل كفاءة بشكل عام، إلا أن إنشاء كود JIT يمكن أن يستفيد من معلومات ملف التعريف المتوفرة فقط في وقت التشغيل.
المفاهيم ذات الصلة
يمكن فهم المهمة الأساسية المتمثلة في أخذ المدخلات بلغة واحدة وإنتاج مخرجات بلغة مختلفة تمامًا من حيث عمليات التحويل الأساسية لنظرية اللغة الرسمية . وبالتالي، فإن بعض التقنيات التي تم تطويرها في الأصل لاستخدامها في المترجمات أصبحت تُستخدم بطرق أخرى أيضًا. على سبيل المثال، يأخذ YACC (Yet Another Compiler-Compiler ) المدخلات في شكل Backus–Naur ويحولها إلى محلل في C. على الرغم من أنه تم إنشاؤه في الأصل لتوليد محلل تلقائيًا للمترجم، إلا أن yacc يستخدم أيضًا غالبًا لأتمتة كتابة التعليمات البرمجية التي تحتاج إلى تعديل في كل مرة يتم فيها تغيير المواصفات. [3]
تدعم العديد من بيئات التطوير المتكاملة (IDEs) بعض أشكال توليد الكود المصدري التلقائي ، وغالبًا ما تستخدم خوارزميات مشتركة مع مولدات كود المترجم، على الرغم من أنها أقل تعقيدًا بشكل عام. (انظر أيضًا: تحويل البرنامج ، تحويل البيانات .)
انعكاس
بشكل عام، يحاول محلل بناء الجملة والدلالات استرجاع بنية البرنامج من الكود المصدر، بينما يستخدم مولد الكود هذه المعلومات البنيوية (مثل أنواع البيانات ) لإنتاج الكود. بعبارة أخرى، يضيف المحلل الأول معلومات بينما يفقد الأخير بعض المعلومات. إحدى عواقب فقدان هذه المعلومات هي أن الانعكاس يصبح صعبًا أو حتى مستحيلًا. لمواجهة هذه المشكلة، غالبًا ما يقوم مولدو الكود بتضمين معلومات نحوية ودلالية بالإضافة إلى الكود اللازم للتنفيذ.
انظر أيضا
- البرمجة التلقائية
- مقارنة أدوات توليد الكود
- التجميع من مصدر إلى مصدر : الترجمة الآلية لبرنامج كمبيوتر من لغة برمجة إلى أخرى
مراجع
- ^ ستيفن موشنيك؛ موشنيك وشركاؤه (15 أغسطس 1997). تنفيذ تصميم المترجم المتقدم . مورجان كوفمان. رقم ISBN 978-1-55860-320-2.
توليد الكود.
- ^ أهو، ألفريد ف.؛ رافي سيثي؛ جيفري د. أولمان (1987). المترجمون: المبادئ والتقنيات والأدوات . أديسون ويسلي. ص. 15. رقم ISBN 0-201-10088-6.
- ^ توليد الكود: الدرس الحقيقي من Rails. Artima.com (2006-03-16). تم الاسترجاع في 2013-08-10.
