کامپایل جلوتر از زمان

از ویکی‌پدیا، دانشنامهٔ آزاد

کامپایل جلوتر از زمان (به انگلیسی Ahead-of-time compilation) مانند یک کامپایلر عادی کد بهینه شده برای ماشین را تولید می‌کند با این تفاوت که در کامپایل جلوتر از زمان بایت‌کد که مجموعه‌ای از دستورالعمل‌ها برای اجرای مفسر است از ماشین مجازی به کد ماشین تبدیل می‌شود که باعث می‌شود بخش قابل توجهی از محیط زمان اجرا کم شود.

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

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

در کامپایل جلوتر از زمان می‌توان بهینه‌سازی‌های پیچیده تری را اجرا کرد در حالی که در در بعضی بهینه‌سازی‌ها مانند کامپایل پویا نمی‌تواند به خوبی عمل کند.

مقایسه با کامپایل پویا

کامپایل پویا یا کامپایل درجا روشی برای اجرای کد است که کامپایل را به جای قبل از اجرا در حین اجرای یک برنامه انجام می‌دهد.

از برتری‌های این روش نسبت به کامپایل جلوتر از زمان می‌توان به برخی بهینه‌سازی‌ها در زمان اجرا اشاره کرد که نمی‌تواند زودتر از زمان اجرا انجام شود.

پیاده‌سازی‌هایی از جاوا موجود است که کامپایل جلوتر از زمان و کامپایل پویا را ترکیب می‌کنند.

پیاده‌سازی کامپایل پویا شامل کامپایل کد منبع یا کد بایت به کد ماشین و اجرای آن است که به صورت مستقیم در حافظه معمولاً انجام می‌شود - کامپایلر پویا به‌طور مستقیم کد را به حافظه منتقل می‌کند و بلافاصله آن را اجرا می‌کند، برخلاف کامپایل جلوتر از زمان که کد ماشین را به صورت خروجی به دیسک منتقل می‌کند و سپس به صورت برنامهٔ جداگانه آن را فراخوانی می‌کند.

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

اما برخی بهینه‌سازی‌ها در کامپایل جلوتر از زمان وجود دارند که در کامپایل پویا بسیار هزینه بر هستند.

در کامپایلرهای پویا برخی بهینه‌سازی‌ها را با تخمین زدن انجام می‌دهد که ممکن است بعداً با غلط بودن تخمین زده شده مجبور به برگرداندن تغییرات داده شده شود و باعث شود که زمان زیادی هزینه شود ولی در کامپایل جلوتر از زمان چنین تخمین‌هایی زده نمی‌شود پس امکان خطا در آن نیز وجود ندارد.

کاهش هزینه زمان اجرا

در بیشتر مواقع با کامپایل جلوتر از زمان می‌توان قسمت بزرگی از محیط اجرا را کاهش داد و فضای دیسک، حافظه، باتری و زمان آغاز را کاهش داد و کامپایل کد میانی به کد ماشین برای اجرای محلی وقتی که کد میانی در حال انجام است را در کامپایل جلوتر از زمان نیز نداریم که باعث می‌شود سریعتر بشود.

مثال از کامپایل جلوتر از زمان

در angular2 کامپایل جلوتر از زمان وجود دارد که نسبت به کامپایلر پویا که باید کامپایلر را منتقل کند و سپس کامپایل شروع می‌شود بسته‌های انتقالی کوچکتر می‌شوند و زمان بارگیری سریع تر می‌شود.

با این کامپایلر مرورگر کد قابل اجرا را بلافاصله بارگذاری می‌کند بدون این که لازم باشد به کامپایل برنامه نیاز داشته باشد. درخواست‌های ناهم‌زمان را کمتر می‌کند و اگر برنامه از قبل کامپایل شده باشد نیازی به دانلود کامپایلر angular وجود ندارد. خطاهای الگو زودتر تشخیص و گزارش داده می‌شوند و امکان حمله به برنامه کمتر می‌شود.

منابع