کامپایل درجا
مرور

دریک سیستم کامپایل بایت کد، کد اصلی به یک ترکیب بیتهای هرکدام از کد حرف‌ها ترجمه شده‌است. بایت کد کد ماشین برای هر کامپیوتر خصوصی نیست، و شاید بین معماری‌های کامپیوتر قابل انتقال باشد. بایت کد شاید بعدازاین با ادامه دادن متن بدون توقف یک ماشین بالقوه تفسیرشود. کامپایلرJIT بایت کدها را در بسیاری از بخش‌ها (یا نسبتاً همه آن را) می‌خوانند و آن‌ها را به صورت پویا به زبان ماشین کامپایل می‌کنند تا برنامه بتواند سریعتراجرا شود. جاوا بررسی‌های زمان اجرا را در بخش‌های مختلف کد انجام می‌دهد و این دلیل آن است که تمام کد یک بار کامپایل نمی‌شود. این کار می‌تواند هردفعه برای هر تابع یا حتی هر قطعه کد اختیاری صورت گیرد؛ کد می‌تواند وقتی که اجرامیشود کامپایل شود (از این جاست که اسم به موقع یا درجا می‌آید)، و سپس آن را نهان می‌کند و بازهم ازآن بدون نیازبه کامپایل مجدد استفاده می‌کند.
برای مقایسه یک تفسیر قراردادی ماشین بالقوه با بایت کد به سادگی با اجراهایی کمتر تفسیرمیشود. برخی تفسیرها حتی برای تفسیر کد اصلی، بدون برداشت از اولین کامپایل به بایت کد، حتی با بدترین اجرا انجام می‌شوند. کد کامپایل شده‌استاتیک یا کد اصلی پیش از جایگزین شدن کامپایل می‌شود. یک محیط گردآوری پویا برای هر کامپایلر یکسان است که می‌تواند در طول اجرا استفاده شود. برای مثال، بیشتر سیستم‌های متداول زبان پردازش لیسپ یک تابع کامپایل دارند که می‌تواند یک تابع جدید ایجاد شده در طول اجرای برنامه را کامپایل کند. همچنین می‌تواند کد اختصاصی پویایی را کامپایل کند و دربسیاری از سناریوها، مزایای اجراهای قابل توجه راروی کد کامپایل شدهٔ ناپویا فراهم کند. همچنین روی بسیاری از سیستم‌های JIT این کاررا انجام دهد. یک هدف رایج از استفاده از تکنیک‌های JIT رسیدن یا پیشی گرفتن در اجرای کامپایل استاتیک است، نگهداری مزایای تفسیر بایت کد:بیشتر از"سخت بالا آمدن" تجزیهٔ سورس کد اصلی وایجاد بهینه‌سازی پایه‌ای اغلب در زمان کامپایل کنترل می‌شود، پیش از قرارگیری:کامپایل از بایت کد به کد ماشین سریعتر از کامپایل از سورس است. بایت کد قرار گرفته شده قابل انتقال است، مانند کد اولیه. چون زمان اجرا روی کامپایل کنترل می‌شود، مانند بایت کد تفسیر شده، که می‌تواند دریک فایل امن اجرا شود. کامپایلرها از بایت کد به کد ماشین برای نوشتن آسان‌تر هستند چون کامپایلر بایت کد قابل انتقال پیش از این بیشترکاررا پیش برده است. کد JIT در اصل اجرای بهتری از سایر مترجمان ارائه می‌دهد. علاوه بر این در بعضی موارد می‌تواند اجرای بهتری از کامپایل استاتیک پیشنهاد دهد، همچون بسیاری از بهینه‌سازی‌ها که فقط در زمان اجرا عملی هستند: کامپایل می‌تواند برایCPU هدفمند و فراهم کردن مدل سیستمی که برنامه کاربردی را اجرا می‌کند بهینه باشد. برای مثال JITمی‌تواند بردار 2SSE را دستورالعمل‌هایی کهCPU از آن‌ها پشتیبانی می‌کرده را آشکار کند وانتخاب کند. اگرچه اخیراً هیچJIT فعالی وجود ندارد که از آن استفاده کند. برای به دست آوردن این سطح از بهینه‌سازی منحصراً با یک کامپایلر استاتیک، یک بخش باید یک متغیر دودویی را برای هر پایگاه/معماری یا شامل نسخه‌های چندگانهٔ بخش‌هایی از کد بدون یک سیگنال دودویی انجام دهد.
سیستم درجمع آوری آمار و ارقام برای این که در واقع چگونه برنامه ران می‌شود در محیطی که در آن قرار دارد تواناست، و می‌تواند دوباره آن را ترتیب دهد و مجدداٌ آن را برای اجرای بهینه کامپایل کند. اگر چه، برخی کامپایلرهای استاتیک اطلاعات پروفایل را به عنوان ورودی می‌گیرند. سیستم می‌تواند بهره‌برداری از کد هدف را انجام دهد (برای مثال این لاین کردن تابع‌های کتابخانه) بدون ازبین بردن فواید پیوستگی پویا و بدون اینکه اصل آن را برای کامپایلرهای استاتیک وسایر بخش‌های متصل ازبین برد. به خصوص، هنگام انجام جانشین سازی‌های این لاین هدف، یک کامپایل استاتیک آنچه را که برای بررسی زمان و حتمی‌کردن آن که یک فراخوانی بالقوه اتفاق می‌افتد اگر کلاس حقیقی ابطال‌های شی روش این لاین لازم است رخ دهد، وبررسی‌های شرط حد بر دسترسی‌های آرایه ممکن است بدون حلقه‌ها به پردازش نیاز داشته باشد. با کامپایل آنی در بسیاری موارد این پردازش می‌تواند بیرون از حلقه‌ها حرکت کند، که اغلب افزایش سرعت را به همراه دارد. اگرچه ممکن است با استاتیک زبان‌های جمع‌آوری شده داده‌های ناخواسته نیز کامپایل شوند، یک سیستم بایت کد می‌تواند راحت‌تر کد اجرا را برای بهره‌برداری بهتر از حافظه نهان مجدداً مرتب کند.