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

یک **کامپایلر چند گذری** یک نوع کامپایلر است که کد منبع یا درخت نحو انتزاعی از برنامه را چندین بار پردازش می‌کند. این نوع کامپایلر برخلاف کامپایلر تک گذری است که فقط یک بار از روی برنامه گذر می‌کند (برنامه را پردازش می‌کند). هر گذر نتیجهٔ گذر قبلی را به عنوان ورودی
انتخاب می‌کند و یک خروجی میانی تولید می‌کند. به این ترتیب کد میانی گذر به گذر بهبود می‌یابد تا گذر نهایی، کد نهایی را منتشر کند.

کامپایلرهای چند گذری گاهی اوقات به نام **کامپایلرهای گسترده** نام‌گذاری می‌شوند که به گذرهایی با دامنهٔ وسیع‌تر اشاره دارند: آنها به جای دیدن یک بخش کوچک از برنامه می‌توانند کل برنامهٔ در حال کامپایل را مشاهده کنند. در نتیجه دامنه گسترده‌تر به این کامپایلرها اجازه می‌دهد تا کد بهتری نسبت به خروجی کامپایلر یک گذری از لحاظ هزینهٔ زمانی و مصرف حافظه تولید کنند (به عنوان مثال کد با حجم کوچکتر، کد سریع تر). علاوه بر این، برخی از زبان‌ها را به دلیل نوع طراحیشان نمی‌توان در کامپایلرهای تک گذری کامپایل کرد.

بندانگشتی|300px

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

### تحلیل لغوی

این مرحله یک مرحله از یک کامپایلر چندگذری است که اطلاعات بی ربطی از برنامه منبع را که تحلیل نحوی قادر به استفاده یا تفسیر آن نخواهد بود را حذف می‌کند. اطلاعات بی ربط می‌تواند چیزهایی مانند نظرات و فضای سفید باشد. تحلیل لغوی علاوه بر از بین بردن اطلاعات بی ربط، نشانه‌های واژگانی از زبان را مشخص می‌کند. این بدان معنی است که اگر یک کامپایلر چندگذری استفاده شود Forward declaration به‌طور کلی لازم نیست.

### تحلیل نحوی

تحلیل نحوی مسئول دنبال کردن قوانین نحوی (معمولاً به صورت گرامرهای مستقل از متن)و ساخت یک ارائه از زبان (مثل یک درخت نحوی انتزاعی یا گراف جهت‌دار بدون دور)است.

### تحلیل معنایی

تحلیل معنایی قوانین معنایی را به ارائه‌ای که توسط تحلیل نحوی ساخته‌شده‌است اعمال می‍‌کند تااز این که این برنامه از قوانین معنایی زبان پیروی می‌کند اطمینان حاصل شود.

برای نمونه در مثال زیر در مرحلهٔ تحلیل معنایی اگر زبان ملزم کند که *if*ها باید boolean باشند *cond* از لحاظ نوع بررسی می‌شود که حتماً boolean باشد.


```c
if(cond) {
 ...
} else {
 ...
}
```


در این مرحله از کامپایل علاوه بر تحلیل معنایی جدول نمادها نیز به منظور کمک به مرحلهٔ تولید کد ایجاد می‌شود.

### تولید کد

این مرحله از یک کامپایلر ارائه‌های میانی یک برنامه را به عنوان مجموعه‌ای از دستورالعمل‌های قابل اجرا (معمولاً زبان اسمبلی)تبدیل می‌کند. مرحلهٔ آخر کامپایل تنها مرحلهٔ وابسته به ماشین است.
در این مرحله برای افزایش کارایی برنامه بهینه‌سازی نیز می‌تواند انجام گیرد.

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

**مستقل از ماشین **: از آنجایی که چندگذری‌ها شامل یک ساختار ماژولار هستند و مرحلهٔ تولید کد از سایر مراحل جداست. گذرها برای ماشین‌ها و سخت‌افزارهای دیگر نیز قابل استفاده هستند.

**زبان‌های گویاتر**: بسیاری از زبان‌های برنامه‌نویسی نمی‌توانند با کامپایلرهای تک گذری ارائه شوند.(مثلاً پاسکال در صورتی می‌تواند با کامپایلرهای تک گذری ارائه شود که تمام تعاریف پیش از استفاده ذکر شده‌باشند.


```pascal
var x:Integer;
procedure inc;
begin
x:=x+1;
end;
x:=0;
inc;
```


این یک کامپایلر تک گذری است زمانی که به `x` اشاره شده‌است. تحلیل معنایی و تولید کد زمانی می‌توانند انجام شوند که کامپایلر هنگام اعلام`x` موارد زیر را بداند:
# محل ذخیرهٔ مقدار `x`
# نوع `x`

زبان‌هایی مانند جاوا به کامپایلرهای چندگذری احتیاج دارند و به اعلام `x` پیش از استفاده نیاز ندارند.


```java
public class Example {	
public static void main(String [] args) {
assert(x==0);			
x++;
assert(x==1);
}
static int x=0;
}
```


کامپایلر چندگذری فضای حافظه را به `x` در طول فاز تحلیل معنایی کامپایل اختصاص می‌دهد و اعلام `x` را پیش از استفادهٔ آن پردازش می‌کند.

## جستارهای وابسته
* کامپایلر

## منابع

* Bornat, Richard, ''Understanding and Writing Compilers: A Do It Yourself Guide'' , Macmillan Publishing, 1979. 
* Professeur Jean-Pierre FOURNIER, ''Introduction to compiler design''
* Bent Thomsen, *Languages and Compilers SProg og Overseattere*, Department of Computer Science, Aalborg University

رده:کامپایلرها
رده:کامپایلرسازی
رده:پیاده‌سازی زبان برنامه‌نویسی
رده:مقاله‌های ایجادشده توسط ایجادگر