کامپایلر چندگذری کیست؟ توضیح بده.
یک کامپایلر چند گذری یک نوع کامپایلر است که کد منبع یا درخت نحو انتزاعی از برنامه را چندین بار پردازش می‌کند. این نوع کامپایلر برخلاف کامپایلر تک گذری است که فقط یک بار از روی برنامه گذر می‌کند (برنامه را پردازش می‌کند). هر گذر نتیجهٔ گذر قبلی را به عنوان ورودیانتخاب می‌کند و یک خروجی میانی تولید می‌کند. به این ترتیب کد میانی گذر به گذر بهبود می‌یابد تا گذر نهایی، کد نهایی را منتشر کند.کامپایلرهای چند گذری گاهی اوقات به نام کامپایلرهای گسترده نام‌گذاری می‌شوند که به گذرهایی با دامنهٔ وسیع‌تر اشاره دارند: آنها به جای دیدن یک بخش کوچک از برنامه می‌توانند کل برنامهٔ در حال کامپایل را مشاهده کنند. در نتیجه دامنه گسترده‌تر به این کامپایلرها اجازه می‌دهد تا کد بهتری نسبت به خروجی کامپایلر یک گذری از لحاظ هزینهٔ زمانی و مصرف حافظه تولید کنند (به عنوان مثال کد با حجم کوچکتر، کد سریع تر). علاوه بر این، برخی از زبان‌ها را به دلیل نوع طراحیشان نمی‌توان در کامپایلرهای تک گذری کامپایل کرد.یک نوع کامپایلر چند گذری.تحلیل لغوی.این مرحله یک مرحله از یک کامپایلر چندگذری است که اطلاعات بی ربطی از برنامه منبع را که تحلیل نحوی قادر به استفاده یا تفسیر آن نخواهد بود را حذف می‌کند. اطلاعات بی ربط می‌تواند چیزهایی مانند نظرات و فضای سفید باشد. تحلیل لغوی علاوه بر از بین بردن اطلاعات بی ربط، نشانه‌های واژگانی از زبان را مشخص می‌کند. این بدان معنی است که اگر یک کامپایلر چندگذری استفاده شود Forward declaration به‌طور کلی لازم نیست.تحلیل نحوی.تحلیل نحوی مسئول دنبال کردن قوانین نحوی (معمولاً به صورت گرامرهای مستقل از متن)و ساخت یک ارائه از زبان (مثل یک درخت نحوی انتزاعی یا گراف جهت‌دار بدون دور)است.تحلیل معنایی.تحلیل معنایی قوانین معنایی را به ارائه‌ای که توسط تحلیل نحوی ساخته‌شده‌است اعمال می‍‌کند تااز این که این برنامه از قوانین معنایی زبان پیروی می‌کند اطمینان حاصل شود.برای نمونه در مثال زیر در مرحلهٔ تحلیل معنایی اگر زبان ملزم کند که "if"ها باید boolean باشند "cond" از لحاظ نوع بررسی می‌شود که حتماً boolean باشد.if(cond) {} else {در این مرحله از کامپایل علاوه بر تحلیل معنایی جدول نمادها نیز به منظور کمک به مرحلهٔ تولید کد ایجاد می‌شود.تولید کد.این مرحله از یک کامپایلر ارائه‌های میانی یک برنامه را به عنوان مجموعه‌ای از دستورالعمل‌های قابل اجرا (معمولاً زبان اسمبلی)تبدیل می‌کند. مرحلهٔ آخر کامپایل تنها مرحلهٔ وابسته به ماشین است.در این مرحله برای افزایش کارایی برنامه بهینه‌سازی نیز می‌تواند انجام گیرد.مزایای کامپایلرهای چندگذری.مستقل از ماشین : از آنجایی که چندگذری‌ها شامل یک ساختار ماژولار هستند و مرحلهٔ تولید کد از سایر مراحل جداست. گذرها برای ماشین‌ها و سخت‌افزارهای دیگر نیز قابل استفاده هستند.زبان‌های گویاتر: بسیاری از زبان‌های برنامه‌نویسی نمی‌توانند با کامپایلرهای تک گذری ارائه شوند.(مثلاً پاسکال در صورتی می‌تواند با کامپایلرهای تک گذری ارائه شود که تمام تعاریف پیش از استفاده ذکر شده‌باشند.var x:Integer;procedure inc;beginx:=x+1;end;x:=0;inc;این یک کامپایلر تک گذری است زمانی که به codice_1 اشاره شده‌است. تحلیل معنایی و تولید کد زمانی می‌توانند انجام شوند که کامپایلر هنگام اعلامcodice_1 موارد زیر را بداند:زبان‌هایی مانند جاوا به کامپایلرهای چندگذری احتیاج دارند و به اعلام codice_1 پیش از استفاده نیاز ندارند.public class Example { public static void main(String [] args) {assert(x==0); x++;assert(x==1);static int x=0;کامپایلر چندگذری فضای حافظه را به codice_1 در طول فاز تحلیل معنایی کامپایل اختصاص می‌دهد و اعلام codice_1 را پیش از استفادهٔ آن پردازش می‌کند.