توليد الشيفرة
في علم الحاسوب، يطلق مصطلح توليد الشفرة (بالإنجليزية code generation) على العملية التي يقوم بها المترجم لتحويل الشفرة المصدرية المكتوبة بلغة وسيطة إلى شكل جاهز للتنفيذ من قبل الآلة.
عادةً ما يقوم المترجمون المتطورون بتمريرات متعددة عبر أشكال وسيطة متنوعة.يتم استخدام هذه العملية متعددة المراحل لأن العديد من خوارزميات تحسين التعليمات البرمجية (بالإنجليزية )يسهل تطبيقها في وقت واحد ، و لأن الإدخال إلى تحسين واحد يعتمد على المعالجة المكتملة التي تم إجراؤها بواسطة تحسين آخر. كما تسهل هذه المنظمة إنشاء مترجم واحد يمكنه استهداف أبنية متعددة ،حيث تحتاج آخر مراحل توليد الشفرة (the "backend") إلى التغيير من هدف إلى هدف.(لمزيد من المعلومات حول تصميم المترجم ، انظر إلى المترجم .)
يتكون الإدخال إلى مولد الشفرة عادةً من شجرة تحليل(بالإنجليزية ) أو شجرة بناء مجردة(بالإنجليزية ) . يتم تحويل الشجرة إلى تسلسل خطي من التعليمات ،عادة في لغة وسيطة مثل شفرة الثلاثة عناوين ( بالإنجليزية ). مراحل أخرى من التجميع قد أو قد لا يشار إليها باسم "توليد الشفرة"،اعتمادًا على ما إذا كانت تنطوي على تغيير كبير في تمثيل البرنامج.
الإضافة إلى التحويل الأساسي من التمثيل الوسيط إلى تسلسل خطي لتعليمات الآلة ، يحاول مولد الشفرة تحسين الشفرة التي تم إنشاؤها بطريقة ما.
المهام التي عادة ما تكون جزءًا من مرحلة "توليد الشفرة" تشمل :يتم اختيار التعليمات من خلال الاستدعاء الذاتي العبور العكسي على شجرة بناء الجملة المجردة ، و مطابقة تكوينات شجرة معينة مقابل القوالب ؛ على سبيل المثال ، الشجرة formula_1
د يتم تحويلها إلى تسلسل خطي من التعليمات عن طريق توليد متواليات بشكل متكرر لـ formula_2 و formula_3 و ثم ابنعاث التعليمات formula_4 .
في المترجم الذي يستخدم لغة وسيطة ،قد يكون هناك مرحلتان لاختيار التعليمات— الأولى لتحويل شجرة التحليل إلى شفرة وسيطة ، والمرحلة ثانية في وقت لاحق بكثير لتحويل الشفرة الوسيطة إلى تعليمات من مجموعة تعليمات الآلة المستهدفة.المرحلة الثانية لا تتطلب عبور الشجرة؛يمكن القيام بها خطيا ،وعادة ما ينطوي على استبدال بسيط لعمليات اللغة الوسيطة مع ما يقابلها من عمليات الشفرة(بالإنجليزية: ).
إذا كان المترجم هو في الواقع مترجم لغوي, (على سبيل المثال التحويل من لغة إلى C) عندئذ ، قد تتضمن المرحلة الثانية لتوليد الشفرات بناء شجرة من الشفرة المتوسطة الخطية.
عندما يحدث وقت التنفيذ لتوليد الشفرة (وقت التنفيذ)، كالترجمة في الوقت المناسب (ترجمة في الوقت المناسب)،من المهم أن تكون العملية بأكملها فعالة و الأخذ بعين الاعتبار المساحة و الزمن.على سبيل المثال عند ترجمة التعبير النمطي و استخدامه لتوليد الشفرة وقت التنفيذ ،غالبا ما يتم إنشاء آلة الحالات المنتهية غير الحتمية بدلا من الحتمية،لأنه عادة ما يمكن إنشاء الأول بسرعة أكبر ويحتل مساحة ذاكرة أقل من الأخير.على الرغم من أنه يولد قانونًا أقل كفاءة بشكل عام،الترجمة في الوقت المناسب تستطيع الاستفادة من معلومات التنميط (بالإنجليزية: ) المتوفرة في وقت االتنفيذ فقط.
يمكن فهم المهمة الأساسية المتمثلة في أخذ المدخلات في لغة واحدة وإنتاج المخرجات بلغة غير مختلفة تمامًا من حيث عمليات النحو التوليدي التحليلي لنظرية اللغة الشكلية. وبالتالي ، فإن بعض التقنيات التي تم تطويرها في الأصل للاستخدام في االمترجمات أصبحت تستخدم بطرق أخرى أيضًا.على سبيل المثال ، يأخذ ياك (بالإنجليزية: YACC) المدخلات بصيغة باكوس نور( بالإنجليزية:Backus-Naur form) ويقوم بتحويله إلى محلل في C.على الرغم من أنه تم إنشاؤه في الأصل للحصول على جيل تلقائي من محلل للمترجم ،وكثيرا ما يستخدم ياك(yacc) لأتمتة كتابة التعليمات البرمجية التي تحتاج إلى تعديل في كل مرة يتم تغيير المواصفات.
بشكل عام ، يحاول محلل بناء الجملة و المحلل الدلالي استرداد هيكلة البرنامج من الشفرة المصدرية،بينما يستخدم مولد الشفرة هذه المعلومات الهيكلية (مثل نوع البيانات ) لانتاج شفرة.وبعبارة أخرى ، يضيف الأول معلومات بينما يفقد الأخير بعض المعلومات.إحدى نتائج فقدان المعلومات هذا هو أن الانعكاس يصبح صعباً أو حتى مستحيلاً.لمواجهة هذه المشكلة ، غالبًا ما يقوم مولِّد الشفرة بتضمين المعلومات النحوية والدلالية بالإضافة إلى الكود اللازم للتنفيذ.