التمهيد (المترجمات)
في علوم الحاسوب ، تُعرف تقنية التمهيد الذاتي بأنها أسلوب لإنتاج مُترجم ذاتي التجميع ، أي مُترجم (أو مُجمِّع ) مكتوب بلغة البرمجة المصدرية التي يُراد ترجمتها. يتم توليد نسخة أساسية أولية من المُترجم ( مُترجم التمهيد الذاتي ) بلغة مختلفة (قد تكون لغة التجميع)؛ ثم تُطوَّر نسخ مُوسَّعة لاحقة من المُترجم باستخدام هذه المجموعة الفرعية الدنيا من اللغة. تُعرف مشكلة ترجمة المُترجم ذاتي التجميع بمشكلة البيضة والدجاجة في تصميم المُترجمات، ويُعد التمهيد الذاتي حلاً لهذه المشكلة. [ 1 ] [ 2 ]
يُعدّ التمهيد الذاتي ممارسة شائعة إلى حد ما عند إنشاء لغة برمجة . يتم التمهيد الذاتي للعديد من المترجمات للعديد من لغات البرمجة، بما في ذلك مترجمات ALGOL و BASIC و C و Common Lisp و D و Eiffel و Elixir و Factor و Go و Haskell و Java و Modula-2 و Nim و Oberon و OCaml و Pascal و PL/I و Python و Rust و Scala و Scheme و TypeScript و Vala و Zig وغيرها.
عملية
تتكون عملية التمهيد النموذجية من ثلاث أو أربع مراحل: [ 3 ] [ 4 ] [ 5 ]
- المرحلة صفر: تهيئة بيئة عمل لمترجم التمهيد . في هذه المرحلة، يتم اختيار لغة المصدر ولغة الإخراج لمترجم التمهيد. في حالة " الجهاز الأساسي " (الذي لا يحتوي على مترجم لأي لغة)، تُكتب لغة المصدر والإخراج كلغة آلة ثنائية ، أو يمكن إنشاؤها عن طريق الترجمة المتقاطعة على جهاز آخر غير الجهاز المستهدف. أما في حالة "الجهاز الأساسي"، فيُكتب مترجم التمهيد بإحدى لغات البرمجة الموجودة على الجهاز المستهدف، وسيقوم هذا المترجم بتوليد برنامج قابل للتنفيذ على الجهاز المستهدف، بما في ذلك لغة برمجة عالية المستوى ، أو لغة تجميع ، أو ملف كائن ، أو حتى لغة الآلة.
- المرحلة الأولى: يتم إنشاء مُترجم التمهيد. هذا المُترجم كافٍ لترجمة شفرته المصدرية إلى برنامج قابل للتنفيذ على الجهاز المستهدف. عند هذه النقطة، يتم إجراء جميع عمليات التطوير اللاحقة باستخدام اللغة المُعرَّفة بواسطة مُترجم التمهيد، وتبدأ المرحلة الثانية.
- المرحلة الثانية: يُنتج مُترجم التمهيد مُترجمًا كاملًا. ويتم ذلك عادةً على مراحل حسب الحاجة، فمثلًا، سيكون مُترجم الإصدار X من اللغة قادرًا على ترجمة ميزات الإصدار X+1، لكنه لا يستخدم هذه الميزات فعليًا. وبمجرد اختبار هذا المُترجم وقدرته على ترجمة نفسه، يُمكن استخدام ميزات الإصدار X+1 في الإصدارات اللاحقة منه.
- المرحلة الثالثة: يتم إنتاج مُترجم كامل بواسطة المُترجم الكامل للمرحلة الثانية. في حال إضافة المزيد من الميزات، يُستأنف العمل في المرحلة الثانية، حيث يحل المُترجم الكامل الحالي للمرحلة الثالثة محل مُترجم التمهيد.
يتم بناء المترجم الكامل مرتين لمقارنة مخرجات المرحلتين. إذا كانت المخرجات مختلفة، فإما أن يكون هناك خطأ في عملية التمهيد أو في المترجم الكامل. [ 3 ]
طُرق
إذا احتاج المرء إلى تجميع مُترجم للغة X مكتوبة بلغة X، فإن المسألة تكمن في كيفية تجميع المُترجم الأول. وتشمل الطرق المختلفة المستخدمة عمليًا ما يلي:
- تنفيذ مترجم أو مترجم للغة X في اللغة Y. أفاد نيكلاوس ويرث أنه كتب أول مترجم باسكال في فورتران . [ 6 ]
- تمت كتابة مترجم أو مُجمِّع آخر لـ X بالفعل بلغة أخرى Y؛ هذه هي الطريقة التي يتم بها غالبًا تهيئة Scheme .
- تمت كتابة الإصدارات السابقة من المترجم في مجموعة فرعية من X والتي كان يوجد لها مترجم آخر؛ هذه هي الطريقة التي يتم بها تهيئة بعض المجموعات الفائقة من Java و Haskell والمترجم الأولي Free Pascal .
- يمكن كتابة مُصرّف يدعم امتدادات لغوية غير قياسية أو ميزات لغوية اختيارية دون استخدام تلك الامتدادات والميزات، وذلك لتمكينه من التجميع باستخدام مُصرّف آخر يدعم نفس اللغة الأساسية ولكن بمجموعة مختلفة من الامتدادات والميزات. كُتبت الأجزاء الرئيسية من مُصرّف C++، clang، باستخدام مجموعة فرعية من لغة C++ يمكن تجميعها بواسطة كل من g++ و Microsoft Visual C++ . أما الميزات المتقدمة، فقد كُتبت باستخدام بعض امتدادات GCC.
- يتم تجميع مترجم لغة X من بنية أخرى يتوفر فيها مترجم للغة X؛ وهذه هي الطريقة المعتادة لنقل مترجمات لغة C إلى منصات أخرى. كما تُستخدم هذه الطريقة في لغة Free Pascal بعد عملية التمهيد الأولية.
- كتابة المُترجم بلغة X، ثم ترجمته يدويًا من المصدر (على الأرجح بطريقة غير مُحسّنة)، وتشغيله على الكود للحصول على مُترجم مُحسّن. استخدم دونالد كنوث هذه الطريقة في نظام برمجة الويب الخاص به .
تشمل طرق توزيع المترجمات في شفرة المصدر توفير نسخة محمولة من المترجم على شكل بايت كود ، وذلك لتهيئة عملية ترجمة المترجم مع نفسه. يُستخدم مخطط T لشرح تقنيات تهيئة المترجم هذه. [ 7 ] في بعض الحالات، تكون الطريقة الأنسب لتشغيل مترجم معقد على نظام يحتوي على القليل من البرامج أو لا يحتوي على أي برامج على الإطلاق، هي استخدام سلسلة من المجمعات والمترجمات المتطورة باستمرار. [ 8 ]
تاريخ
كانت برامج التجميع أول أدوات لغوية تقوم بتشغيل نفسها بنفسها.
كانت لغة NELIAC أول لغة برمجة عالية المستوى توفر مثل هذه الآلية التمهيدية في عام 1958. وكانت أول اللغات المستخدمة على نطاق واسع للقيام بذلك هي Burroughs B5000 Algol في عام 1961 و LISP في عام 1962.
قام هارت وليفين بكتابة مُترجم لغة ليسب بلغة ليسب نفسها في معهد ماساتشوستس للتكنولوجيا عام 1962، واختبراه داخل مُفسِّر ليسب موجود. وبمجرد أن حسّنا المُترجم إلى الحد الذي مكّنه من ترجمة شفرته المصدرية بنفسه، أصبح مُستضافًا ذاتيًا. [ 9 ]
إن المترجم كما هو موجود على شريط المترجم القياسي هو برنامج لغة الآلة الذي تم الحصول عليه من خلال جعل تعريف التعبير S للمترجم يعمل على نفسه من خلال المفسر.
— مذكرة الذكاء الاصطناعي رقم 39 [ 9 ]
لا يمكن تطبيق هذه التقنية إلا بوجود مترجم فوري للغة نفسها التي سيتم ترجمتها. وهي تستعير مباشرةً من فكرة تشغيل البرنامج على نفسه كمدخل، وهي فكرة تُستخدم أيضاً في العديد من البراهين في علوم الحاسوب النظرية ، مثل صيغة البرهان على أن مشكلة التوقف غير قابلة للحل والتي تستخدم نظرية رايس .
الجهود الحالية
نظراً للمخاوف الأمنية المتعلقة بهجوم الثقة الخفية (الذي يتضمن تعديل المُصرّف بشكل خبيث لإدخال ثغرات خفية في البرامج التي يُصرّفها، أو حتى تكرار التعديل الخبيث في إصدارات لاحقة من المُصرّف نفسه، مما يُنشئ حلقة مفرغة من انعدام الثقة)، والهجمات المختلفة على موثوقية الملفات الثنائية، تعمل مشاريع متعددة على تقليل الجهد المبذول ليس فقط في عملية التمهيد من المصدر، بل أيضاً في تمكين الجميع من التحقق من تطابق المصدر مع الملف التنفيذي. تشمل هذه المشاريع مشروع Bootstrappable builds [ 10 ] ومشروع Reproducible builds [ 11 ] .
انظر أيضاً
مراجع
- ↑ رينولدز، جون هـ. (ديسمبر 2003). "إنشاء مُترجم ذاتي التجميع من الجهاز X إلى الجهاز Y" . مؤتمر CCSC الشرقي. مجلة علوم الحاسوب في الكليات . 19 (2): 175-181 .
إن فكرة المُترجم المكتوب باللغة التي يُترجمها تُثير معضلة "البيضة أم الدجاجة" القديمة: من أين يأتي الأول؟
- ↑ غلوك، روبرت (2012). "بناء مولدات المترجمات من المُقيِّمات الجزئية". في: كلارك، إدموند؛ فيربيتسكايت، إيرينا؛ فورونكوف، أندريه (محررون). آفاق معلوماتية النظم: المؤتمر الدولي الثامن لإحياء ذكرى أندريه إرشوف، PSI 2011، نوفوسيبيرسك، روسيا، 27 يونيو - 1 يوليو 2011، أوراق مختارة منقحة . سلسلة محاضرات في علوم الحاسوب. المجلد 7162. سبرينغر. الصفحات 125-141 . doi : 10.1007/978-3-642-29709-0_13 . ISBN 978-3-642-29708-3.
إن البدء يطرح مشكلة البيضة والدجاجة المألوفة من بناء المترجمات: يحتاج المرء إلى مترجم لتهيئة مترجم آخر، وتهيئة مولدات المترجمات ليست استثناءً.
- 1 2 "تثبيت GCC: البناء" . مشروع جنو - مؤسسة البرمجيات الحرة (FSF) .
- ↑ "rust-lang/rust: bootstrap" . GitHub .
- ↑ "تكوينات البناء المتقدمة - وثائق LLVM 10" . llvm.org .
- ↑ ويرث، نيكلاوس (22 فبراير 2021). "خمسون عامًا على باسكال". مجلة اتصالات رابطة آلات الحوسبة . 64 (3). رابطة آلات الحوسبة (ACM): 39-41 . doi : 10.1145/3447525 . ISSN 0001-0782 . S2CID 231991096 .
- ↑ باتريك د. تيري (1997). "3. بناء المترجمات وتهيئتها" . المترجمات ومولدات المترجمات: مقدمة باستخدام لغة C++ . دار نشر طومسون الدولية للحاسوب. ISBN 1-85032-298-8تمت أرشفة النسخة الأصلية بتاريخ 23-11-2009.
- ↑ إدموند غريملي-إيفانز (23 أبريل 2003). "إنشاء مُترجم بسيط من الصفر" . homepage.ntlworld.com . مؤرشف من الأصل بتاريخ 3 مارس 2010.
- 1 2 تيم هارت ومايك ليفين. "مذكرة الذكاء الاصطناعي رقم 39 - المترجم الجديد" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 2017-07-06 . تم الاطلاع عليه بتاريخ 2008-05-23 .
- ↑ "بناءات قابلة للتشغيل الذاتي" . bootstrapable.org .
- ↑ "البناءات القابلة للتكرار - مجموعة من ممارسات تطوير البرمجيات التي تُنشئ مسارًا يمكن التحقق منه بشكل مستقل من المصدر إلى الكود الثنائي" . reproducible-builds.org .
- المترجمون
- بناء المترجم
- نظرية المترجمات
