سؤال

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

هل هناك سبب يفضلون نهج واحد إلى آخر أو هو في الغالب مسألة الذوق الشخصي?

على سبيل المثال, لنفترض أن لدي if كتلة مثل

if ( some_expression ) {
    do_stuff
}

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

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

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

المحلول

في هذه الأيام, الاتجاه هو القيام الأمثل مع التمثيل الوسيط.تحقق من LLVM على سبيل المثال:

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

LLVM يمكن أن توفر مصدر مستقل محسن لأنه يؤدي الأمثل يمر على قانون إلا بعد أن يتم ممثلة في LLVM الأشعة تحت الحمراء.

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

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