# توليد الشيفرة

في علم الحاسوب، يطلق مصطلح توليد الشفرة (بالإنجليزية code generation) على العملية التي يقوم بها المترجم لتحويل الشفرة المصدرية المكتوبة بلغة وسيطة إلى شكل جاهز للتنفيذ من قبل الآلة.
عادةً ما يقوم المترجمون المتطورون بتمريرات متعددة عبر أشكال وسيطة متنوعة.يتم استخدام هذه العملية متعددة المراحل لأن العديد من خوارزميات تحسين التعليمات البرمجية (بالإنجليزية Program optimization )يسهل تطبيقها في وقت واحد، ولأن الإدخال إلى تحسين واحد يعتمد على المعالجة المكتملة التي تم إجراؤها بواسطة تحسين آخر. كما تسهل هذه المنظمة إنشاء مترجم واحد يمكنه استهداف أبنية متعددة، حيث تحتاج آخر مراحل توليد الشفرة (the backend) إلى التغيير من هدف إلى هدف.(لمزيد من المعلومات حول تصميم المترجم، انظر إلى المترجم .)
يتكون الإدخال إلى مولد الشفرة عادةً من شجرة تحليل(بالإنجليزية parse tree) أو شجرة بناء مجردة(بالإنجليزية abstract syntax tree) . يتم تحويل الشجرة إلى تسلسل خطي من التعليمات، عادة في لغة وسيطة مثل شفرة الثلاثة عناوين ( بالإنجليزية Three-address code). مراحل أخرى من التجميع قد أو قد لا يشار إليها باسم «توليد الشفرة»،اعتمادًا على ما إذا كانت تنطوي على تغيير كبير في تمثيل البرنامج.

## المهام الرئيسية في مجال توليد الشفرة

الإضافة إلى التحويل الأساسي من التمثيل الوسيط إلى تسلسل خطي لتعليمات الآلة، يحاول مولد الشفرة تحسين الشفرة التي تم إنشاؤها بطريقة ما.
المهام التي عادة ما تكون جزءًا من مرحلة «توليد الشفرة» تشمل :
* اختيار التعليمات : أي امر يستخدم
* جدولة التعليمات: في أي ترتيب توضع هذه الأوامر. الجدولة هي تحسين السرعة التي يمكن أن يكون لها تأثير حاسم على خط أنابيب الآلات .
* التوزيع للمسجل :توزيع المتغيرات لسجلات المعالج.
* تنقيح البيانات: إذا لزم الأمر حتى تكون الشفرة صحيحة و منقحة.
يتم اختيار التعليمات من خلال الاستدعاء الذاتي العبور العكسي على شجرة بناء الجملة المجردة، ومطابقة تكوينات شجرة معينة مقابل القوالب ؛ على سبيل المثال، الشجرة $W:=ADD(X,MUL(Y,Z))$
د يتم تحويلها إلى تسلسل خطي من التعليمات عن طريق توليد متواليات بشكل متكرر لـ $t1:=X$ و $t2:=MUL(Y,Z)$ و ثم ابنعاث التعليمات $ADDW,t1,t2$ .
في المترجم الذي يستخدم لغة وسيطة، قد يكون هناك مرحلتان لاختيار التعليمات— الأولى لتحويل شجرة التحليل إلى شفرة وسيطة، والمرحلة ثانية في وقت لاحق بكثير لتحويل الشفرة الوسيطة إلى تعليمات من مجموعة تعليمات الآلة المستهدفة.المرحلة الثانية لا تتطلب عبور الشجرة ؛يمكن القيام بها خطيا، وعادة ما ينطوي على استبدال بسيط لعمليات اللغة الوسيطة مع ما يقابلها من عمليات الشفرة(بالإنجليزية: opcodes).
إذا كان المترجم هو في الواقع مترجم لغوي, (على سبيل المثال التحويل من لغة Eiffel إلى C) عندئذ، قد تتضمن المرحلة الثانية لتوليد الشفرات بناء شجرة من الشفرة المتوسطة الخطية.

## وقت تنفيذ توليد الشفرة

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

## المفاهيم ذات الصلة

يمكن فهم المهمة الأساسية المتمثلة في أخذ المدخلات في لغة واحدة وإنتاج المخرجات بلغة غير مختلفة تمامًا من حيث عمليات النحو التوليدي التحليلي لنظرية اللغة الشكلية. وبالتالي، فإن بعض التقنيات التي تم تطويرها في الأصل للاستخدام في المترجمات أصبحت تستخدم بطرق أخرى أيضًا.على سبيل المثال، يأخذ ياك (بالإنجليزية: YACC) المدخلات بصيغة باكوس نور( بالإنجليزية:Backus-Naur form) ويقوم بتحويله إلى محلل في C.على الرغم من أنه تم إنشاؤه في الأصل للحصول على جيل تلقائي من محلل للمترجم، وكثيرا ما يستخدم ياك(yacc) لأتمتة كتابة التعليمات البرمجية التي تحتاج إلى تعديل في كل مرة يتم تغيير المواصفات.

### انعكاس

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