سؤال

لقد سمعت من فكرة إلباس الحذاء اللغة ، أي أن الكتابة مترجم/مترجم للغة في حد ذاته.كنت أتساءل كيف أن هذا يمكن أن يتحقق ونظرت حولها قليلا و رأيت أحدهم يقول أنه يمكن فقط أن يتم ذلك إما عن طريق

  • كتابة أولية المترجم في لغة مختلفة.
  • من ناحية الترميز أولية مترجم في الجمعية ، والذي يبدو وكأنه حالة خاصة من أول

لي أيا من هذه يبدو أن يكون في الواقع إلباس الحذاء لغة بمعنى أن كلا منهما يتطلب الدعم الخارجي.هل هناك طريقة لكتابة الواقع مترجم في اللغة ؟

هل كانت مفيدة؟

المحلول

هل هناك طريقة لكتابة الواقع مترجم في اللغة ؟

لك لديك أن يكون بعض الحالية اللغة إلى كتابة جديدة مترجم في.إذا كنت كتابة جديدة, يقول, C++ compiler, عليك فقط كتابة في C++ و تجميع مع القائمة مترجم الأولى.من ناحية أخرى, إذا كنت خلق مترجم لغة جديدة ، دعنا نسميها Yazzleof, سوف تحتاج إلى كتابة جديدة المترجم في لغة أخرى أولا.عموما سيكون هذا آخر لغة البرمجة, ولكن لا يجب أن يكون.يمكن للجمعية ، أو إذا لزم الأمر ، رمز الجهاز.

إذا كنت كانت سوف التمهيد مترجم Yazzleof, عموما لن يكتب مترجم كامل للغة في البداية.بدلا من ذلك يمكنك كتابة مترجم Yazzle-lite, أصغر ممكن فرعية من Yazzleof (حسنا ، صغيرة جدا فرعية على الأقل).ثم في Yazzle-lite, كنت أكتب مترجم كامل للغة.(ومن الواضح أن هذا يمكن أن يحدث تكرارا بدلا من القفز.) لأن Yazzle-لايت هو الصحيح فرعية من Yazzleof, لديك الآن المترجم الذي يمكن تجميع نفسها.

هناك حقا writeup جيدة عن إلباس الحذاء مترجم من أدنى مستوى ممكن (على آلة الحديثة هو الأساس محرر عرافة) بعنوان إلباس الحذاء بسيط مترجم من لا شيء.ويمكن العثور عليها في https://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html.

نصائح أخرى

شرح كنت قد قرأت هو الصحيح.هناك مناقشة هذا في المجمعين:مبادئ تقنيات و أدوات (التنين الكتاب):

  • كتابة مترجم C1 اللغة X في اللغة Y
  • استخدام مترجم C1 لكتابة مترجم C2 اللغة X في اللغة X
  • الآن C2 بالكامل النفس استضافة البيئة.

سوبر مثيرة للاهتمام مناقشة هذا في Unix المبدع كين تومسون's جائزة تورينج محاضرة.

وقال انه يبدأ مع:

ما أنا على وشك أن تصف هي واحدة من العديد من "الدجاجة والبيضة" المشاكل التي تنشأ عند المجمعين هي مكتوبة في لغتهم الخاصة.في هذا سهولة ، وسوف تستخدم مثال محدد من برنامج التحويل البرمجي C.

وتنتقل إلى إظهار كيف كتب نسخة من Unix ج مترجم شأنه دائما تسمح له الدخول بدون كلمة مرور, لأن برنامج التحويل البرمجي C سوف يتعرف البرنامج تسجيل الدخول وإضافة رمز خاص.

النمط الثاني هو الرامية إلى برنامج التحويل البرمجي C.استبدال التعليمات البرمجية هو المرحلة الذاتي استنساخ برنامج إدراج كل من أحصنة طروادة إلى مترجم.وهذا يتطلب مرحلة التعلم في المرحلة الثانية على سبيل المثال.أولا نحن تجميع تعديل المصدر العادي المحول البرمجي C لإنتاج تنصتت الثنائية.نحن تثبيت هذه الثنائية الرسمية C.يمكننا الآن إزالة الخلل من المصدر من المترجم الجديد ثنائي أعد البق كلما جمعت.بالطبع تسجيل الدخول الأمر سيبقى تنصتت مع أي أثر في المصدر في أي مكان.

ما سمعته من كتابة محدود للغاية المترجم في لغة أخرى ، ثم استخدام هذا تجميع أكثر تعقيدا نسخة مكتوبة في لغة جديدة.هذا الإصدار الثاني ثم يمكن استخدامها لتجميع نفسها و في النسخة المقبلة.في كل مرة يتم ترجمة النسخة الأخيرة المستخدمة.

هذا هو تعريف إلباس الحذاء:

عملية بسيطة تفعيل نظام أكثر تعقيدا النظام الذي يخدم نفس الغرض.

تحرير:على مقالة ويكيبيديا عن مترجم إلباس الحذاء يغطي مفهوم أفضل مني.

تحقق من بودكاست هندسة البرمجيات إذاعة الحلقة 61 (2007-07-06) والذي يناقش مجلس التعاون الخليجي مترجم الداخلية ، وكذلك مجلس التعاون الخليجي إلباس الحذاء العملية.

دونالد E.كانوث في الواقع بنيت ويب من خلال كتابة المترجم في ذلك ، ثم اليد جمعت إلى الجمعية أو رمز الجهاز.

كما أفهم الأولى Lisp مترجم وألبس باليد-تجميع منشئ وظائف رمزية القارئ.بقية مترجم ثم اقرأ من المصدر.

يمكنك التحقق بنفسك من خلال قراءة الأصلي مكارثي الورق ، وظائف العودية من تعبيرات رمزية وعلى حساب من قبل آلة, الجزء الأول.

بديل آخر هو خلق بايت كود آلة اللغة الخاصة بك (أو استخدام قائمة واحدة إذا كان الميزات ليست عادية جدا) وكتابة مترجم إلى بايت كود إما في بايت كود أو اللغة المطلوبة باستخدام آخر المتوسطة مثل محلل أدوات التي النواتج AST كما XML ، ثم تجميع XML إلى بايت كود باستخدام XSLT (أو نمط آخر مطابقة اللغة شجرة على أساس التمثيل).فإنه لا إزالة الاعتماد على لغة أخرى ، ولكن يمكن أن يعني أن أكثر من إلباس الحذاء العمل ينتهي في النظام النهائي.

إنها علوم الكمبيوتر نسخة من الدجاج و البيض المفارقة.لا أستطيع التفكير بطريقة لا تكتب الأولي مترجم في المجمع أو بعض اللغات الأخرى.إذا كان قد تم القيام به ، يجب أن اللثغة قد فعلت ذلك.

في الواقع, أعتقد أن يسب تقريبا مؤهلا.تحقق من ويكيبيديا لها دخول.وفقا للمادة ، Lisp eval وظيفة يمكن تنفيذها على IBM 704 في رمز الجهاز مع كامل مترجم (مكتوب في اللثغة نفسها) تأتي إلى حيز الوجود في عام 1962 في معهد ماساتشوستس للتكنولوجيا.

كل مثال من إلباس الحذاء لغة أستطيع أن أفكر (ج, PyPy) تم ذلك بعد أن كان هناك عمل المترجم.عليك أن تبدأ في مكان ما ، reimplementing لغة في حد ذاته يتطلب كتابة المترجم في لغة أخرى أولا.

وإلا كيف يكون العمل ؟ أنا لا أعتقد أنه حتى من الناحية النظرية من الممكن أن تفعل خلاف ذلك.

بعض ألبس الحذاء المجمعين أو إبقاء نظم المصدر شكل النموذج الكائن في مستودع:

  • ocaml هو اللغة التي يجب بايت كود مترجم (أيمترجم إلى Ocaml بايت كود) و المترجم الأصلي (إلى x86-64 أو الذراع ، الخ...المجمع).لها إس مستودع يحتوي على شفرة المصدر (ملفات */*.{ml,mli}) و بايت كود (ملف boot/ocamlc) شكل المترجم.حتى عندما كنت بناء عليه هو أولا باستخدام بايت كود (من الإصدار السابق من المترجم) تجميع نفسها.في وقت لاحق حديثا جمعت بايت كود قادرة على ترجمة المترجم الأصلي.حتى Ocaml إس مستودع يحتوي على كل *.ml[i] الملفات المصدر ، boot/ocamlc ملف بايت كود.

  • على الصدأ مترجم تنزيل (باستخدام wget, لذا أنت تحتاج إلى اتصال إنترنت) الإصدار السابق من ثنائي إلى تجميع نفسها.

  • تذوب هو مثل اللثغة اللغة إلى تخصيص وتوسيع دول مجلس التعاون الخليجي.وتترجم إلى رمز C++ من قبل ألبس الحذاء المترجم.ولدت C++ مدونة المترجم توزيع لذا إس في مستودع يحتوي على كل *.melt الملفات المصدر ، melt/generated/*.cc "كائن" ملفات الترجمة.

  • J. Pitrat هو CAIA نظام الذكاء الاصطناعي هو تماما توليد الذاتي.هذا هو متاح في مجموعة الآلاف من [A-Z]*.c الملفات التي تم إنشاؤها (أيضا مع إنشاء dx.h ملف الرأس) مع مجموعة من آلاف _[0-9]* ملفات البيانات.

  • عدة مخطط المجمعين أيضا ألبس الحذاء.Scheme48 الدجاج المخطط ، ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top