سؤال

اللغات المفضلة:C/C++، جافا، وروبي.

أنا أبحث عن بعض الكتب/البرامج التعليمية المفيدة حول كيفية كتابة المترجم الخاص بك للأغراض التعليمية فقط.أنا أكثر دراية بـ C/C++، وJava، وRuby، لذا أفضل الموارد التي تتضمن واحدًا من هؤلاء الثلاثة، ولكن أي مورد جيد مقبول.

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

المحلول

قائمة كبيرة من الموارد:

أسطورة:

  • ¶ رابط إلى ملف PDF
  • $ رابط لكتاب مطبوع

نصائح أخرى

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

ومع ذلك، هناك فكرة واحدة لطريقة سهلة للتعامل مع هذا الموضوع (التي استخدمناها في صف المترجمين الخاص بي، على الأقل) وهي بناء المترجم في القطعتين الموضحتين أعلاه.على وجه التحديد، سوف تحصل على فكرة جيدة عن العملية برمتها بمجرد بناء النصف العلوي.

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

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

أظن تنفيذ المترجم الحديث في ML هو أفضل نص كتابة مترجم تمهيدي.هناك نسخة جافا و أ النسخة ج أيضًا، قد يكون الوصول إلى أي منهما أكثر سهولة نظرًا لخلفية لغتك.يحتوي الكتاب على الكثير من المواد الأساسية المفيدة (المسح والتحليل، والتحليل الدلالي، وسجلات التنشيط، واختيار التعليمات، وتوليد التعليمات البرمجية الأصلية لـ RISC وx86) ومواضيع "متقدمة" متنوعة (تجميع OO واللغات الوظيفية، وتعدد الأشكال، وجمع البيانات المهملة، والتحسين و نموذج مهمة ثابتة واحدة) في مساحة صغيرة نسبيًا (حوالي 500 صفحة).

أفضّل تطبيق Modern Compiler على كتاب Dragon لأن تطبيق Modern Compiler يستطلع مساحة أقل من المجال - بدلاً من ذلك فهو يحتوي على تغطية قوية لجميع المواضيع التي قد تحتاجها لكتابة مترجم جاد ولائق.بعد الانتهاء من قراءة هذا الكتاب، ستكون جاهزًا للتعامل مع الأوراق البحثية مباشرةً لمزيد من التعمق إذا كنت في حاجة إليها.

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

أنا أتفق مع مرجع كتاب التنين.IMO، هو الدليل النهائي لبناء المترجم.استعد لبعض النظريات المتشددة.

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

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

"دعونا نبني مترجم" رائع، لكنه قديم بعض الشيء.(أنا لا أقول أن هذا يجعلها أقل صلاحية قليلاً.)

أو تحقق دارجة.هذا مشابه لـ "Let's Build a Compiler" ولكنه مصدر أفضل بكثير خاصة للمبتدئين.يأتي هذا مع برنامج تعليمي بتنسيق pdf والذي يتبع نهجًا مكونًا من 7 خطوات لتعليمك المترجم.إضافة رابط quora لأنه يحتوي على روابط لجميع منافذ لغة SLANG المتنوعة، في C++ وJava وJS، وأيضًا مترجمين فوريين في python وjava، تمت كتابتهم في الأصل باستخدام C# ومنصة .NET.

إذا كنت تتطلع إلى استخدام أدوات قوية وعالية المستوى بدلاً من البناء كل شئ نفسك، من خلال المشاريع والقراءات ل هذه الدورة هو خيار جيد جدا.إنها دورة لغات من تأليف مؤلف محرك محلل Java ANTLR.يمكنك الحصول على الكتاب الخاص بالدورة بصيغة PDF من المبرمجون البراغماتيون.

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

بالمناسبة، LLVM رائع بكل بساطة.في العديد من المواقف التي قد تقوم فيها عادةً بالتحويل إلى التجميع، سيكون من الأفضل لك التحويل إليها التمثيل المتوسط ​​لـ LLVM بدلاً من.إنه مستوى أعلى، ومتعدد المنصات، وLLVM جيد جدًا في إنشاء التجميع الأمثل منه.

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

قد ترغب في البحث عن Lex/Yacc (أو Flex/Bison، أيًا كان الاسم الذي تريد تسميتهم به).Flex هو محلل معجمي، والذي سيقوم بتحليل وتحديد المكونات الدلالية ("الرموز المميزة") للغتك، وسيتم استخدام Bison لتحديد ما يحدث عند تحليل كل رمز مميز.يمكن أن يكون هذا، على سبيل المثال لا الحصر، طباعة كود C، لمترجم يمكن ترجمته إلى C، أو تشغيل التعليمات ديناميكيًا.

هذه الأسئلة الشائعة ينبغي أن تساعدك، و هذا البرنامج التعليمي تبدو مفيدة للغاية.

بشكل عام، لا يوجد برنامج تعليمي مدته خمس دقائق للمترجمين، لأنه موضوع معقد وكتابة مترجم قد يستغرق شهورًا.سيكون عليك القيام بالبحث الخاص بك.

عادة ما يتم تفسير بايثون وروبي.ربما تريد أن تبدأ مع مترجم أيضًا.إنه أسهل بشكل عام.

الخطوة الأولى هي كتابة وصف لغة رسمي، أي قواعد لغة البرمجة الخاصة بك.ثم يتعين عليك تحويل الكود المصدري الذي تريد تجميعه أو تفسيره وفقًا للقواعد إلى شجرة بناء جملة مجردة، وهو شكل داخلي من الكود المصدري الذي يفهمه الكمبيوتر ويمكنه العمل عليه.تُسمى هذه الخطوة عادةً بالتحليل ويُسمى البرنامج الذي يقوم بتحليل الكود المصدري بالمحلل اللغوي.غالبًا ما يتم إنشاء المحلل اللغوي بواسطة مولد المحلل اللغوي الذي يحول القواعد النحوية الرسمية إلى كود الآلة المصدر.للحصول على شرح جيد وغير رياضي للتحليل، أوصي بتقنيات التحليل - دليل عملي.تحتوي ويكيبيديا على مقارنة بين المولدات المحللية التي يمكنك من خلالها اختيار المولد المناسب لك.اعتمادًا على مولد المحلل اللغوي الذي اخترته، ستجد دروسًا تعليمية على الإنترنت، كما توجد كتب أيضًا لمولدات المحلل اللغوي المشهورة (مثل GNU bison).

قد تكون كتابة محلل لغتك أمرًا صعبًا للغاية، لكن هذا يعتمد على قواعدك النحوية.لذا أقترح أن تبقي قواعدك النحوية بسيطة (على عكس لغة C++)؛وخير مثال على ذلك هو LISP.

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

إذا كنت تقوم ببناء مترجم فوري، فسيتعين عليك ببساطة تفسير التمثيل الوسيط.يمكنك أيضًا تجميعها في الوقت المناسب.أوصي بـ LLVM و libjit للتجميع في الوقت المناسب.لجعل اللغة قابلة للاستخدام، سيتعين عليك أيضًا تضمين بعض وظائف الإدخال والإخراج وربما مكتبة قياسية صغيرة.

إذا كنت ستقوم بتجميع اللغة، فسيكون الأمر أكثر تعقيدًا.سيتعين عليك كتابة واجهات خلفية لبنيات كمبيوتر مختلفة وإنشاء رمز الجهاز من التمثيل الوسيط في تلك الواجهات الخلفية.أوصي بـ LLVM لهذه المهمة.

هناك عدد قليل من الكتب حول هذا الموضوع، ولكن لا أستطيع أن أوصي بأي منها للاستخدام العام.معظمهم أكاديميون جدًا أو عمليون جدًا.لا يوجد "علم نفسك الكتابة المترجمة في 21 يومًا"، وبالتالي، سيتعين عليك شراء العديد من الكتب للحصول على فهم جيد لهذا الموضوع بأكمله.إذا بحثت في الإنترنت، ستجد بعض الكتب وملاحظات المحاضرات عبر الإنترنت.ربما توجد مكتبة جامعية قريبة منك حيث يمكنك استعارة الكتب عن المترجمين.

أوصي أيضًا بالحصول على معرفة خلفية جيدة في علوم الكمبيوتر النظرية ونظرية الرسم البياني، إذا كنت ستجعل مشروعك جادًا.الحصول على شهادة في علوم الكمبيوتر سيكون مفيدًا أيضًا.

كتاب واحد لم يقترح بعد ولكنه مهم جدا "الروابط والرافعات" بواسطة جون ليفين.إذا كنت لا تستخدم مجمعًا خارجيًا، فستحتاج إلى طريقة لإخراج ملف كائن يمكن ربطه ببرنامجك النهائي.حتى إذا كنت تستخدم مجمعًا خارجيًا، فربما تحتاج إلى فهم عمليات النقل وكيفية عمل عملية تحميل البرنامج بأكملها لإنشاء أداة عمل.يجمع هذا الكتاب الكثير من المعرفة العشوائية حول هذه العملية لأنظمة مختلفة، بما في ذلك Win32 وLinux.

كتاب التنين هو بالتأكيد كتاب "بناء المترجمين"، ولكن إذا لم تكن لغتك معقدة تمامًا مثل الجيل الحالي من اللغات، فقد ترغب في إلقاء نظرة على نمط المترجم الفوري من أنماط التصميم.

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

إذا كنت على استعداد لاستخدام LLVM، تحقق من ذلك: http://llvm.org/docs/tutorial/.فهو يعلمك كيفية كتابة مترجم من الصفر باستخدام إطار عمل LLVM، ولا يفترض أن لديك أي معرفة حول هذا الموضوع.

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

لقد وجدت أن كتاب Dragon صعب للغاية في القراءة مع التركيز بشكل كبير على نظرية اللغة التي لا تتطلب حقًا كتابة مترجم في الممارسة العملية.

أود أن أضيف أوبيرون الكتاب الذي يحتوي على المصدر الكامل لمترجم أوبيرون السريع والبسيط بشكل مذهل مشروع أوبيرون.

Alt text

أتذكر أنني طرحت هذا السؤال منذ حوالي سبع سنوات عندما كنت جديدًا في البرمجة.

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

ونعم، يقول الكثير من الناس أن قراءة هذا الكتاب أمر جنوني ولن تتعلم منه أي شيء، لكنني لا أوافق على ذلك تمامًا.

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

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

لم أكتب المترجم الخاص بي على الفور، ولكن بعد السؤال عرفت من أين أبدأ.والآن، بعد تعلم العديد من اللغات المختلفة وقراءة كتاب التنين، لم تعد الكتابة تمثل مشكلة كبيرة.(أنا أيضًا أدرس هندسة الكمبيوتر، ولكن معظم ما أعرفه عن البرمجة يتم تدريسه ذاتيًا.)

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

يعد الكتاب جيدًا أيضًا إذا كنت تريد تعلم كيفية كتابة المحللين/المترجمين الفوريين.

"...دعونا نبني مترجم ..."

سأفعل الثانية http://compilers.iecc.com/crenshaw/ بواسطة @sasb.ننسى شراء المزيد من الكتب في الوقت الراهن.

لماذا؟الأدوات واللغة.

اللغة المطلوبة هي لغة باسكال، وإذا كنت أتذكر بشكل صحيح فهي تعتمد على لغة توربو باسكال.يحدث ذلك فقط إذا ذهبت إلى http://www.freepascal.org/ وقم بتنزيل مترجم Pascal، جميع الأمثلة تعمل مباشرة من الصفحة ~ http://www.freepascal.org/download.var إن الشيء الجميل في Free Pascal هو أنه يمكنك استخدامه تقريبًا مهما كان المعالج أو نظام التشغيل الذي يمكنك الاهتمام به.

بمجرد إتقان الدروس، حاول تجربة الدروس الأكثر تقدمًا "كتاب التنين" ~ http://en.wikipedia.org/wiki/Dragon_book

أنا أبحث في نفس المفهوم، ووجدت هذا المقال الواعد لجويل بوبار،

قم بإنشاء مترجم لغة لـ .NET Framework - لست متأكدًا من أين ذهب هذا

قم بإنشاء مترجم لغة لبرنامج .NET Framework - نسخة pdf من المستند الأصلي

يناقش مفهومًا عالي المستوى للمترجم ويشرع في اختراع لغته الخاصة لإطار عمل .Net.على الرغم من أنه يستهدف .Net Framework، إلا أنه يجب أن يكون من الممكن إعادة إنتاج العديد من المفاهيم.تتناول المادة:

  1. تعريف اللغة
  2. الماسح الضوئي
  3. المحلل اللغوي (الجزء الذي أهتم به بشكل رئيسي)
  4. استهداف .Net Framework
  5. مولد الأكواد

هناك مواضيع أخرى، ولكن يمكنك الحصول على عادل.

إنه موجه للأشخاص المبتدئين، ومكتوب بلغة C# (وليس Java تمامًا)

هث

العظام

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

يعد إنشاء كود C أمرًا سهلاً مثل إنشاء HTML (فقط استخدم الطباعة أو ما يعادله)، والذي بدوره أسهل بكثير من كتابة محلل C أو محلل HTML.

من الأسئلة الشائعة حول comp.compilers:

"برمجة جهاز كمبيوتر شخصي" من قبل Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

يشرح هذا الكتاب المعنون للأسف تصميم وإنشاء بيئة برمجة مستخدم واحد للميكرو ، باستخدام لغة تشبه Pascal تسمى Edison.يعرض المؤلف جميع التعليمات البرمجية المصدرية والتفسيرات للتنفيذ خطوة بخطوة لمرجم Edison ونظام التشغيل البسيط الداعم ، وكلها مكتوبة في Edison نفسها (باستثناء نواة داعمة صغيرة مكتوبة في مجموعة رمزية لـ PDP 11/23 ؛يمكن أيضًا طلب المصدر الكامل للكمبيوتر الشخصي IBM).

الأشياء الأكثر إثارة للاهتمام حول هذا الكتاب هي:1) قدرتها على توضيح كيفية إنشاء نظام التشغيل ونظام التشغيل الكامل والمكتفي ذاتيًا ومفيدًا ومفيدًا ، و 2) المناقشة المثيرة للاهتمام لمشكلات تصميم اللغة والمقايضات في الفصل 2.

"Brinch Hansen on Pascal Compilers" بواسطة Per Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

آخر من النظرة الخفيفة الثقيلة على البراغماتية هنا هو كتاب ما هو حتى تتخلى عن الرموز.يعرض المؤلف تصميم وتنفيذ الكود المصدر والكامل لمترجم ومترجم برمجي P-Code لـ Pascal- (Pascal "Minus") ، مجموعة فرعية من Pascal مع أنواع منطقية وتكوين عدد صحيح (ولكن لا توجد أحرف ، واقعية ، أو أنواع تخضع أو مغلفة)) ، والتعريفات المستمرة والمتغيرة وأنواع الصفيف والتسجيلات (ولكن لا توجد معبأة ، متغيرة ، مجموعة ، مؤشر ، بلا اسم ، إعادة تسميتها ، أو أنواع الملفات) ، التعبيرات ، عبارات التعيين ، تعريفات الإجراء المتداخ وبدء الكتل (ولكن لا توجد تعريفات وظيفية ، والمعلمات الإجرائية ، وبيانات GOTO والعلامات ، وبيانات الحالة ، والبيانات المتكررة ، والبيانات ، والبيانات).

يتم كتابة المترجم والمترجم المترجم في Pascal* (Pascal "Star") ، مجموعة فرعية من Pascal تم تمديدها مع بعض الميزات على غرار Edison لإنشاء أنظمة تطوير البرمجيات.يتم بيع برنامج التحويل البرمجي Pascal* لجهاز الكمبيوتر IBM من قبل المؤلف ، لكن من السهل نقل المترجم في الكتاب إلى أي منصة باسكال مريحة.

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

يجب عليك مراجعة "داريوس بيكون"ichbins"، وهو مترجم لهجة Lisp صغيرة، يستهدف لغة C، في ما يزيد قليلاً عن 6 صفحات من التعليمات البرمجية.الميزة التي تتمتع بها مقارنة بمعظم مترجمي الألعاب هي أن اللغة كاملة بما يكفي لكتابة المترجم بها.(تتضمن كرة القطران أيضًا مترجمًا فوريًا لتمهيد الشيء.)

هناك المزيد من الأشياء حول ما وجدته مفيدًا في تعلم كتابة مترجم على جهازي مخطط أور صفحة على الإنترنت.

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

مترجم LCC (ويكيبيديا) (الصفحة الرئيسية للمشروع) تم وصف فريزر وهانسون في كتابهما "مترجم C Retargetable:تصميم و تنفيذ".إنه سهل القراءة تمامًا ويشرح المترجم بأكمله، وصولاً إلى إنشاء التعليمات البرمجية.

عذرًا، فهي باللغة الإسبانية، ولكن هذه هي قائمة المراجع لدورة تسمى "Compiladores e Intérpretes" (المترجمون والمترجمون الفوريون) في الأرجنتين.

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

  • تصميم المترجمين في C.
    ألين آي.هولوب

    برنتيس هول.1990.

  • كومبيلادوريس.النظرية والبناء.
    Sanchís Lorca ، FJ، غالان باسكوال، C.بارانينفو التحريرية.1988.

  • بناء المترجم.
    نيكلاوس ويرث

    أديسون ويسلي.1996.

  • اللغات والقواعد والآلات.تمرين عملي.
    Pedro Isasi Viñuela ، Paloma Martínez Fernández ، Daniel Borrajo Millán.addison-wesley iberoamericana (españa).1997.

  • فن تصميم المترجم.النظرية والتطبيق.
    توماس بيتمان ، جيمس بيترز.

    برنتيس هول.1992.

  • بناء المترجم كائني التوجه.
    جيم هولمز.
    Prentice Hall ، Englewood Cliffs ، NJ1995

  • كومبيلادوريس.أساسيات المفاهيم.
    ب.توفيل، س.شميدت، T.توفيل.

    أديسون ويسلي الأيبيرية الأمريكية.1995.

  • مقدمة في نظرية الأتمتة واللغات والحساب.

    جون إي.هوبكروفت.جيفرف د.أولمان.
    أديسون ويسلي.1979.

  • مقدمة إلى اللغات الرسمية.
    جيورجي إي.ريفيسز.

    ماك جراو هيل.1983.

  • تقنيات التحليل.دليل عملي.
    ديك جرون ، سيريل جاكوبس.
    Impreso por los autores.1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • ياك:مترجم آخر.
    ستيفن سيجونسون
    الحوسبة العلم التقرير التقني رقم 32 ، 1975.مختبرات الجرس.موراي هيل، نيو
    جيرسي.

  • ليكس:مولد محلل معجمي.
    م.ه.ليسك، إي.شميدت.تقرير الحوسبة التقنية العلم رقم 39 ، 1975.مختبرات بيل.(موراي هيل، نيوجيرسي).

  • ليكس وياك.
    جون ر.ليفين، توني ماسون، دوغ براون.
    أورايلي وشركاه.1995.

  • عناصر نظرية الحساب.
    هاري ر.لويس ، كريستوس H.باباديمتريو.الطبعة الثانية.برنتيس هول.1998.

  • خوارزمية فعالة لبناء رسم الاعتماد على التحكم.
    سلفادور ف.كافاديني.
    وظيفة التخرج النهائية للحصول على لقب مهندس في الحساب.
    كلية الرياضيات التطبيقية.جامعة كاليفورنيا.2001.

  1. هذا موضوع واسع.لا نقلل من هذه النقطة.ولا تقلل من شأن وجهة نظري حتى لا تقلل من شأنها.
  2. أسمع كتاب التنين هو (؟) مكان للبدء، إلى جانب البحث.:) تحسن في البحث، ففي النهاية ستكون هذه هي حياتك.
  3. إن بناء لغة البرمجة الخاصة بك هو بالتأكيد تمرين جيد!لكن اعلم أنه لن يتم استخدامه أبدًا لأي غرض عملي في النهاية.الاستثناءات لهذا قليلة و جداً متباعدة بين.

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

درس تعليمي:المترجمات الفوقية الجزء الأول

يعتمد كل هذا على ورقة فنية صغيرة مذهلة مكونة من 10 صفحات:

فال شور ميتا 2:لغة كتابة مترجمة موجهة نحو بناء الجملة

من صادق إلى الله 1964.لقد تعلمت كيفية بناء المترجمين من هذا في عام 1970.هناك لحظة مذهلة عندما تتذمر أخيرًا كيف يمكن للمترجم أن يجدد نفسه....

أعرف مؤلف الموقع منذ أيام دراستي الجامعية، لكن ليس لدي أي علاقة بالموقع.

هناك الكثير من الإجابات الجيدة هنا، لذا فكرت في إضافة واحدة أخرى إلى القائمة:

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

http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf

نيكلاوس ويرث، يورج جوتكنيشت

(المعالجة ليست واسعة مثل كتابه عن المجمعين)

لقد قرأت العديد من الكتب عن المترجمين، ويمكنني أن أدعم كتاب التنين، فالوقت الذي أقضيه في هذا الكتاب مفيد جدًا.

إذا كنت مهتمًا بكتابة مترجم للغة وظيفية (بدلاً من لغة إجرائية)، فإن "Simon Peyton-Jones وDavid Lester"تنفيذ اللغات الوظيفية:برنامج تعليمي" هو دليل ممتاز.

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

تم وصف عدة أنواع مختلفة من المترجمات، ولكن حتى إذا كنت تتبع فقط ما يسمى بمترجم القالب لـ Core، فسيكون لديك فهم ممتاز لما يجعل البرمجة الوظيفية مميزة.

اعجبني ال تعليم كرينشو أيضًا، لأنه يوضح تمامًا أن المترجم هو مجرد برنامج آخر يقرأ بعض المدخلات ويكتب بعضًا منها.

اقرأها.

اعمل عليه إذا أردت، ولكن بعد ذلك انظر إلى مرجع آخر حول كيفية كتابة المترجمين الأكبر حجمًا والأكثر اكتمالًا.

و أقرأ على الثقة الثقة, للحصول على فكرة عن الأشياء غير الواضحة التي يمكن القيام بها في هذا المجال.

يمكنك استخدام BCEL بواسطة مؤسسة برمجيات أباتشي.باستخدام هذه الأداة، يمكنك إنشاء تعليمات برمجية تشبه المجمّع، ولكنها Java مع BCEL API.يمكنك معرفة كيفية إنشاء رمز لغة وسيط (في هذه الحالة رمز البايت).

مثال بسيط

  1. قم بإنشاء فئة Java باستخدام هذه الوظيفة:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

الآن قم بتشغيل BCELifier مع هذه الفئة

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

يمكنك رؤية النتيجة على وحدة التحكم للفصل بأكمله (كيفية إنشاء كود البايت MyClass.java).رمز الدالة هو هذا:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

لم يتم تضمين هذا الكتاب في القائمة حتى الآن:

أساسيات تصميم المترجمات (Torben Mogensen)(من القسمعلوم الكمبيوتر، جامعة كوبنهاجن)

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

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