کامپایلر چندگذری

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