محول برمجي
المحول البرمجي مترجم الأكواد للغة الألة او لغة الأسمبلي الجامع أو المصرف أو المترجم هو برنامج حاسوبي يقوم على تحويل الملفات المصدرية إلى أوامر مباشرة يفهمها الحاسوب وينفذها مباشرة بما يناسب بنية الحاسوب الذي يستهدفه البرنامج.
على غير البدايات حين كانت البرامج تبرمج أصلاً بلغات متدنية المستوى (أي قريبة من بنية الحاسوب) يفهمها الحاسوب مباشرة، أصبحت الآن البرامج تبرمج بلغات عالية المستوى (عالية أي بعيدة عن فهم الحاسوب لها، وأقرب إلى فهم البشر). السبب في هذا أن البرامج زادت في تعقيدها وفي حساباتها، مما جعل البرمجة المباشرة للحاسوب أمرًا صعبًا، كما أن انتشار عدة بنى للحاسوب (مثل ARM وx64 وx86) جعل من اللازم كتابة البرامج عدة مرات بلغات ذات مستويات متدنية عدة لكي تعمل على عدة حواسيب مختلفة. لمواجهة هذا ظهرت لغات برمجة عالية المستوى تركز على المهم من الأمور في البرمجة وتسهل من إدارة المشاريع البرمجية، وتجعل إستهداف عدة أجهزة ممكنا بملف مصدري واحد مهما تعددت البنى (مع مراعات بعض التفاصيل الصغيرة عند ذلك وضبطها).
والأسباب الرئيسية لذلك هي:
ميزة اخري في استخدام لغات البرمجة عالية المستوى ان نفس البرنامج المكتوب بها يمكن ترجمته إلى أنواع كثيرة من لغات الآلة وبالتالي يمكن نقله إلى منصات كثيرة وأنواع كثيرة من الحواسيب.
من ناحية اخري فان البرامج المكتوبة بلغة برمجة عالية المستوى ويتم ترجمتها اوتوماتيكيا إلى لغة الآلة ربما يتم تنفيذها ببطء أكثر مما لو كتبت بلغة الآلة مباشرة. ومن هنا فان بعض البرامج التي يعتبر عامل الوقت والسرعة في التنفيذ مهم جدا بالنسبة لها ما زالت تكتب بلغة الالة
ومع ذلك فان المترجم الجيد يمكنه ان يصل بسرعة البرامج المكتوبة بلغة عالية المستوى إلى نفس سرعة تنفيذ البرامج المناظرة لها والمكتوبة بلغة الآلة إذا قام بعمل الكثير من التحسينات الجيدة وكانت البرامج المكتوبة باللغة عالية المستوى مكتوبة بشكل جيد ومنظم.
لان كتابة المترجمات عملية ليست بالسهلة علي الإطلاق فانه من الأفضل ان نقسم طريقة بناء المترجم, والوسيلة التقليدية لذلك هي في أن نقسم عملية الترجمة إلى عدة مراحل.
هذه المراحل يتم تنفيذها بشكل متسلسل وان كان ذلك لا يعني بالضرورة تنفيذا بهذا الشكل أثناء تصميم المترجم فبعض هذه المراحل تتداخل مع بعضها.
كل مرحلة(ما عدا الأولى)تأخذ مخرجات المرحلة التي تسبقها كمدخلات لها, ومن الشائع ان نجعل كل مرحلة كوحدة مستقلة فبعض هذه الوحدات يتم كتابتها باليد والبعض الاخر يتم انشائها عن طريق مواصفات أو معايير مواصفة
هناك تقسيم شائع ومعروف لهذه المراحل ولكن ترتيب هذه المراحل قد يختلف قليلا من مترجم إلى اخر, فبعض هذه المراحل قد يتم تجميعه وبعضها قد يتم تقسيمه إلى مراحل اصغر.
في هذه المرحلة يتم قراءة الكود المصدري وتقسيمه إلى مجموعة من الرموز (Tokens)، كل رمز يمثل عنصر من عناصر لغة البرمجة على سبيل المثال، (كلمة محجوزة أو اسم متغير أو عدد أو رمز...الخ).
مثلا إذا كان الكود المصدري بهذا الشكل :
وبعد مروره بهذه المرحلة يتم تحويله إلى هذا الشكل :
هذه المرحلة تأخذ مجموعة الtokens التي تم إنتاجها في مرحلة التحليل اللغوي وترتبهم في شكل شجرة (تعرف بشجرة القواعد Syntax tree) والتي تشير إلى تركيب البرامج وتسمي هذه المرحلة أيضا بمرحلة الـتجزئة.
هذه المرحلة تحلل شجرة القواعد لكي تحدد ما إذا كان البرنامج يتجاوز متطلبات سلامة معينة (مثلا متغير تم استخدامه لكن لم يتم الإعلان عنه أو تم استخدامه في سياق لا يعترف به)
يتم ترجمة البرنامج إلى لغة وسيطة مستقلة عن تركيبة الحاسب الداخلية.
أسماء المتغيرات الرمزية المستخدمة في الكود الوسيط يتم ترجمتها إلى اعداد كل من هذه الاعداد يرمز إلى مسجل في لغة الالة
اللغة الوسيطة يتم ترجمتها إلى لغة الأسمبلي (وهي شكل نصي للغة الآلة) لنوع معين من تركيبة الحاسب (X86 أو Power PC).
لغة الاسمبلي يتم ترجمتها إلى الترميز الثنائي ويتم تحديد عناوين المتغيرات، الدوال...الخ
المراحل الثلاث الأولى مجتمعة تسمي الـFront End للمترجم والمراحل الثلاث الأخرى تسمى Backend للمترجم
الجزء الوسيط فقط للمترجم في هذا السياق هو مرحلة إنتاج الكود الوسيط وهي مرحلة تشمل غالبا العديد من التحسينات والتحويلات علي الكود الوسيط.
كل مرحلة, من مراحل الفحص والتحويل تؤسس اشكال ثابتة قوية للاشياء التي تمرر للمراحل التالية لذا فان كتابة كل مرحلة علي حدا أسهل.
علي سبيل المثال فاحص النوع type checker يمكنه ان يفترض غياب الأخطاء القواعدية ومرحلة إنتاج الكود تفترض غياب اخطاء النوع
يتم التجميع والربط ببرامج يتم توفيرها من خلال نظام التشغيل وهي ليست جزء من المترجم نفسه.