گزینش دستورالعمل

انتخاب دستورالعمل در علوم کامپیوتر یک سطح از پشت صحنه کامپایلر(کارهایی که کامپایلر دور از دید و دسترس کاربر انجام می دهد) است که ارائه سطح میانی خود را به یک IR سطح پایین تبدیل میکند. در یک کامپایلر معمولی ، انتخاب دستورالعمل مقدم بر زمانبندی دستورالعمل و تخصیص ثبات(رجیستر ) است. بنابراین  خروجی IR  دارای یک مجموعه نامحدود از ثبات های کاذب (pseudo) (غالباً به عنوان موقت شناخته می شود) است و ممکن است هنوز - و به طور معمول - منوط به بهینه سازی peephole است . در غیر این صورت ، شباهت زیادی به کد ماشین هدف ، کد بایت یا زبان اسمبلی دارد.

به عنوان مثال ، برای کد IR سطح متوسط دنباله ی زیرt1 = a
t2 = b
t3 = t1 + t2
a = t3
b = t1دستورالعمل زیر یک توالی دستورالعمل خوب برای معماری x86 استMOV EAX, a
XCHG EAX, b
ADD a, EAXبرای بررسی جامع در مورد انتخاب دستورالعمل ، به این لینک مراجعه کنید .

گسترش ماکرو 
ساده ترین روش انتخاب دستورالعمل به عنوان توسعه ماکرو یا تولید کد تفسیری شناخته می شود. یک اپراتور انتخابگر دستورالعمل گسترش ـ ماکرو با تطبیق الگوها با IR سطح متوسط کار می کند. پس از تطبیق ، ماکرو مربوط با استفاده از قسمت همسان IR به عنوان ورودی ، که دستورالعمل های هدف مناسب را (خارج میکند) منتشر می کند، اجرا می شود. گسترش ماکرو را می توان مستقیماً بر روی نمایش متنی IR سطح متوسط انجام داد و یا IR می تواند ابتدا به نمایش گرافیکی تبدیل شود و سپس در عمق اول عبور کند یا اینکه یک (template) الگو با یک یا چند گره مجاور در گراف مطابقت دارد.

مگر اینکه ماشین مورد نظر بسیار ساده نباشد ، گسترش ماکرو در حالت انزوا معمولاً کد ناکارآمد تولید می کند. برای کاهش این محدودیت، کامپایلرهایی که این روش را اعمال می کنند معمولاً آن را با بهینه سازی peephole ترکیب می کنند تا ترکیب دستورالعمل های ساده را با معادل های پیچیده تر جایگزین کنند که عملکرد را افزایش می دهد و اندازه کد را کاهش می دهد.این روش به روش Davidson-Fraser معروف است و در حال حاضر در GCC اعمال می شود .

پوشش گراف 
روش دیگر این است که ابتدا IR سطح متوسط را به نمایش گرافیکی تبدیل کرده و سپس گراف را با استفاده از الگوها پوشش دهیم . الگو یک template است که با بخشی از گراف مطابقت دارد و می تواند با یک دستورالعمل ارائه شده (آماده شده ) توسط ماشین هدف پیاده سازی شود. هدف این است که گراف را به گونه ای پوشش دهیم که هزینه کل الگوهای انتخاب شده به حداقل برسد ، که هزینه به طور معمول تعداد چرخه های اجرای دستورالعمل را نشان می دهد.برای گرافهای  شکل درخت  ، کمترین هزینه پوشش را می توان با استفاده از برنامه نویسی پویا در زمان خطی یافت ،اما برای DAG ها و گرافهای کامل مساله  NP کامل می شود و بنابراین اغلب با استفاده از الگوریتم های حریصانه یا روشهایی از بهینه سازی ترکیبی حل می شود.

استراتژی کمترین مخرج مشترک 
استراتژی کمترین مخرج مشترک ، یک روش انتخاب دستورالعمل است که در platformهایی که دستورالعمل های اضافی (مکمل)پردازنده برای ایجاد برنامه های اجرایی قابل حمل در طیف وسیعی از رایانه ها وجود دارد ، استفاده می شود. طبق استراتژی کمترین مخرج ، رفتار پیش فرض کامپایلر ایجاد کمترین معماری مشترک است. استفاده از هر  extension پردازنده موجود به طور پیش فرض خاموش است ، مگر اینکه صریحاً توسط سوئیچ های خط فرمان روشن شود.

استفاده از استراتژی کمترین مخرج مشترک به این معنی است که به طور پیش فرض از دستورالعمل ها و قابلیت های تکمیلی پردازنده استفاده نمی شود.
بهینه‌سازی کامپایلر