من المفيد للمبرمج معرفة ما هو المترجم وتصميمه لعدة أسباب، فأي شخص يقوم بأي تطوير برمجيات يحتاج إلى استخدام مترجم، إنها لفكرة جيدة أن تفهم ما يجري داخل الأدوات التي تستخدمها، تمكّنك دراسة المترجمات من تصميم وكتابة كودك بالغة الخاصة بالمجال.
مفهوم المترجم Compiler
المترجم هو برمجية تقوم بتحويل برنامج مكتوب بلغة عالية المستوى (لغة المصدر) إلى لغة منخفضة المستوى (لغة الكائن/ الهدف/ الآلة). وهو يترجم بشكل أساسي الكود المكتوب بأحد لغات البرمجة إلى لغة أخرى دون تغيير منطق الكود.
يجعل المترجم أيضًا إخراج الكود فعالاً ومُحسّنًا لوقت التنفيذ ومساحة الذاكرة. تحتوي عملية الترجمة على آليات ترجمة أساسية واكتشاف الأخطاء، ولا يمكنها تجميع الكود إذا كان هناك خطأ. تعمل عملية المحول البرمجي من خلال التحليل اللغوي والدلالي في الواجهة الأمامية وتولد كوداً محسنًا في الواجهة الخلفية. عند التنفيذ، يقوم المترجم أولاً بتحليل جميع عبارات اللغة واحدة تلو الأخرى بشكل نحوي، وبعد ذلك، إذا كان ناجحًا (لم يحتوي على أخطاء)، يبني كود الإخراج، مع التأكد من أن العبارات التي تشير إلى عبارات أخرى يشار إليها بشكل مناسب، عادةً يسمى كود الإخراج كائن الكود.
كما يعرف تصميم المترجم بأنه هيكلة ومجموعة المبادئ التي توجه عملية الترجمة والتحليل والتحسين للمترجم.
أنواع المترجم
- المترجم المتقاطع Cross: يتيح ذلك إنشاء كود لمنصة غير النظام الذي يعمل عليه المترجم. على سبيل المثال: يتم تشغيل المترجم على جهاز “A” وينتج كود لجهاز آخر “B”.
- مترجم من المصدر إلى المصدر Source-to-source: يمكن الإشارة إليه على أنه (transcompiler) وهو مترجم يقوم بترجمة كود المصدر المكتوب بلغة برمجة واحدة إلى كود مصدر للغة برمجة أخرى.
- مترجم فردي المسار Single Pass: هذا يحول الكود المصدري مباشرة إلى كود آلة. على سبيل المثال، لغة البرمجة باسكال.
- مترجم ثنائي المسار Two-Pass: يمر هذا من خلال الكود ليتم ترجمتها مرتين؛ في التمرير الأول، يتحقق من بناء جملة العبارات ويؤسس جدولًا للرموز، بينما في التمرير الثاني يترجم فعليًا عبارات البرنامج إلى لغة الآلة.
- مترجم متعدد المسارات Multi-Pass: هذا نوع من المترجم يعالج الكود المصدري أو شجرة التركيب المجردة لبرنامج عدة مرات قبل ترجمته إلى لغة الآلة.
خطوات أنظمة معالجة اللغة (باستخدام المترجم)
نحن نعلم أن الكمبيوتر هو مجموعة منطقية من البرمجيات والأجهزة. تَعرِف الأجهزة لغة يصعب علينا فهمها، بالتالي نميل إلى كتابة البرامج بلغة عالية المستوى، وهو أمر أقل تعقيدًا بالنسبة لنا لفهم الأفكار والحفاظ عليها. تمر هذه البرامج الآن بسلسلة من التحولات بحيث يمكن استخدامها بسهولة بواسطة الآلات. هذا هو المكان الذي تكون فيه أنظمة إجراءات اللغة مفيدة.
1- لغة عالية المستوى
إذا كان البرنامج يحتوي على توجيهات مثل (include# أو define#)، فسيتم تسميته “HLL”. أي أنهم أقرب إلى البشر وبعيدون عن الآلات. تسمى هذه العلامات (#) بتوجيهات ما قبل المعالج. يوجهون المعالج المسبق حول ما يجب القيام به.
2- المعالج المسبق
يزيل المعالج المسبق جميع توجيهات (include#) من خلال تضمين الملفات والتي تسمى الملف المضمن وجميع التوجيهات (define#) باستخدام توسيع الماكرو، يقوم بإدراج الملف والتكبير والمعالجة الكلية، إلخ.
3- لغة التجميع
لغة التجميع ليست في شكل الثنائي ولا في مستوى عالٍ، إنها حالة وسيطة تتكون من مزيج من تعليمات الآلة وبعض البيانات المفيدة الأخرى اللازمة للتنفيذ.
4- المُجمِّع:
لكل منصة (أجهزة ونظام تشغيل) سيكون لدينا مُجمّع، والمخرجات من المُجمّع تسمى ملف الكائن، يترجم لغة التجميع إلى كود الآلة.
5- المترجم الفوري Interpreter
يقوم المترجم الفوري بتحويل اللغة عالية المستوى إلى لغة الآلة منخفضة المستوى، تمامًا مثل المترجم (compiler)، لكنهم مختلفون في الطريقة التي يقرؤون بها المدخلات. يقوم المترجم الفوري بقراءة المدخلات ويقوم بالمعالجة وينفذ الكود المصدري بينما يقوم المترجم الفوري بنفس الشيء سطراً بسطر. يقوم المترجم بتصفح البرنامج بأكمله ويترجمه ككل إلى كود آلة بينما يقوم المترجم الفوري بترجمة البرنامج جملة واحدة في كل مرة. عادة ما تكون البرامج المترجمة فورياً أبطأ مقارنة بالبرامج المترجمة.
6- رمز الجهاز القابل للنقل:
يمكن تحميله في أي وقت ويمكن تشغيله. سيكون العنوان داخل البرنامج يعمل مع حركة البرنامج.
7- المُحمّل والرابط
يقوم بتحويل الكود القابل للنقل إلى كود مطلق ويحاول تشغيل البرنامج مما يؤدي إلى تشغيل برنامج أو رسالة خطأ (أو في بعض الأحيان يمكن أن يحدث كلاهما). يقوم الرابط بتحميل مجموعة متنوعة من ملفات الكائنات في ملف واحد لجعله قابلاً للتنفيذ. ثم يقوم المُحمل بتحميله في الذاكرة ويقوم بتنفيذه.