مجموعة مُجمّعة في الوقت المناسب

الترجمة الفورية ( JIT ) (وتُعرف أيضًا بالترجمة الديناميكية أو الترجمة أثناء التشغيل ) [ 1 ] هي ترجمة شيفرة الحاسوب أثناء تنفيذ البرنامج، وليس قبل التنفيذ. [ 2 ] قد تتضمن هذه الترجمة ترجمة الشيفرة المصدرية ، ولكنها غالبًا ما تكون ترجمة الشيفرة الوسيطة إلى شيفرة الآلة ، والتي تُنفذ مباشرةً بعد ذلك. يقوم النظام الذي يُطبق مُترجم JIT عادةً بتحليل الشيفرة قيد التنفيذ باستمرار، ويُحدد أجزاء الشيفرة التي يُحقق فيها تسريع الأداء الناتج عن الترجمة أو إعادة الترجمة فائدةً تفوق تكلفة ترجمة تلك الشيفرة.

تُعدّ الترجمة الفورية (JIT) مزيجًا من النهجين التقليديين للترجمة إلى لغة الآلة: الترجمة المسبقة (AOT) والتفسير ، ما يجمع بين بعض مزايا وعيوب كليهما. [ 2 ] باختصار، تجمع الترجمة الفورية بين سرعة الكود المُترجم ومرونة التفسير، مع مراعاة عبء المُفسِّر والعبء الإضافي للترجمة والربط (وليس التفسير فقط). تُعتبر الترجمة الفورية شكلًا من أشكال الترجمة الديناميكية ، وتتيح تحسينًا تكيفيًا مثل إعادة الترجمة الديناميكية وتحسينات السرعة الخاصة بالبنية الدقيقة . [ ملاحظة 1 ] [ 3 ] يُعدّ كلٌّ من التفسير والترجمة الفورية مناسبين بشكل خاص للغات البرمجة الديناميكية ، حيث يمكن لنظام التشغيل التعامل مع أنواع البيانات ذات الربط المتأخر وفرض ضمانات الأمان.

تاريخ

يُنسب الفضل عمومًا إلى جون مكارثي في ​​عمله على لغة ليسب عام 1960، وذلك في أول مُترجم JIT منشور. [ 4 ] في ورقته البحثية الرائدة "الدوال التكرارية للتعبيرات الرمزية وحسابها بواسطة الآلة، الجزء الأول" ، أشار إلى الدوال التي تُترجم أثناء وقت التشغيل، مما يُغني عن الحاجة إلى حفظ مُخرجات المُترجم على بطاقات مثقبة [ 5 ] (مع أن هذا يُعرف بدقة أكبر باسم " نظام الترجمة الفورية "). ومن الأمثلة المبكرة الأخرى كين طومسون ، الذي قدم عام 1968 أحد أوائل تطبيقات التعبيرات النمطية ، وتحديدًا لمطابقة الأنماط في مُحرر النصوص QED . [ 6 ] ولتحقيق السرعة، نفّذ طومسون مطابقة التعبيرات النمطية باستخدام JIT على كود IBM 7094 في نظام المشاركة الزمنية المتوافق . [ 4 ] وقد طوّر جيمس ج. ميتشل عام 1970 تقنية مؤثرة لاستخلاص الكود المُترجم من التفسير، وطبّقها للغة التجريبية LC² . [ 7 ] [ 8 ]

أرست لغة Smalltalk (حوالي عام 1980) أسسًا جديدة لتقنيات الترجمة الفورية (JIT). فعلى سبيل المثال، كانت الترجمة إلى لغة الآلة تتم عند الطلب، ويتم تخزين النتيجة مؤقتًا لاستخدامها لاحقًا. وعندما تنفد الذاكرة، كان النظام يحذف جزءًا من هذا الكود ويعيد إنشائه عند الحاجة إليه مرة أخرى. [ 2 ] [ 9 ] وقد حسّنت لغة Self من شركة Sun هذه التقنيات بشكل كبير، وكانت في وقت من الأوقات أسرع نظام Smalltalk في العالم، حيث حققت سرعة تصل إلى نصف سرعة لغة C المُحسّنة [ 10 ولكن بلغة برمجة كائنية التوجه بالكامل .

تخلت شركة صن عن تقنية سيلف، لكن الأبحاث اتجهت نحو لغة جافا. استُعير مصطلح "التجميع الفوري" من مصطلح التصنيع " في الوقت المناسب " وشاع استخدامه بفضل جافا، حيث استخدمه جيمس جوسلينج منذ عام 1993. [ 11 ] حاليًا، يُستخدم التجميع الفوري في معظم تطبيقات آلة جافا الافتراضية ، إذ يعتمد برنامج هوت سبوت على هذه القاعدة البحثية ويستخدمها على نطاق واسع.

كان مشروع دينامو من إتش بي عبارة عن مُترجم JIT تجريبي، حيث كان تنسيق "الرمز البايتي" وتنسيق رمز الآلة متطابقين؛ وقد قام النظام بتحسين رمز آلة PA-8000 . [ 12 ] وعلى عكس المتوقع، أدى ذلك إلى زيادة في السرعة، وصلت في بعض الحالات إلى 30%، حيث سمح هذا بإجراء تحسينات على مستوى رمز الآلة، على سبيل المثال، تضمين التعليمات البرمجية لتحسين استخدام الذاكرة المؤقتة، وتحسين استدعاءات المكتبات الديناميكية، والعديد من التحسينات الأخرى التي تُجرى أثناء التشغيل والتي لا تستطيع المُترجمات التقليدية القيام بها. [ 13 ] [ 14 ]

في نوفمبر 2020، قدمت لغة PHP 8.0 مُترجم JIT. [ 15 ] وفي أكتوبر 2024، قدمت لغة CPython مُترجم JIT تجريبي. [ 16 ]

تصميم

في نظام مُجمَّع باستخدام رمز البايت، يُترجم الكود المصدري إلى تمثيل وسيط يُعرف باسم رمز البايت . رمز البايت ليس هو رمز الآلة لأي حاسوب مُحدد، وقد يكون قابلاً للنقل بين بنى الحواسيب المختلفة. بعد ذلك، يُمكن تفسير رمز البايت أو تشغيله على آلة افتراضية . يقرأ مُجمِّع JIT رموز البايت على أجزاء متعددة (أو كاملة، نادرًا) ويُجمِّعها ديناميكيًا إلى رمز الآلة، مما يُسرِّع تشغيل البرنامج. يُمكن القيام بذلك لكل ملف، أو لكل دالة، أو حتى لأي جزء من الكود؛ حيث يُمكن تجميع الكود عند تنفيذه (ومن هنا جاء اسم "التجميع الفوري")، ثم تخزينه مؤقتًا وإعادة استخدامه لاحقًا دون الحاجة إلى إعادة تجميعه.

على النقيض من ذلك، تقوم الآلة الافتراضية التقليدية المفسرة بتفسير الشفرة الوسيطة فقط، وعادةً ما يكون أداؤها أقل بكثير. بل إن بعض المفسرات تُفسر الشفرة المصدرية دون الحاجة إلى ترجمتها إلى شفرة وسيطة، مما يؤدي إلى أداء أسوأ. أما الشفرة المُترجمة بشكل ثابت أو الشفرة الأصلية ، فتُترجم قبل النشر. وبيئة الترجمة الديناميكية هي بيئة يُمكن فيها استخدام المُترجم أثناء التنفيذ. يتمثل أحد الأهداف الشائعة لاستخدام تقنيات الترجمة الفورية (JIT) في الوصول إلى أداء الترجمة الثابتة أو تجاوزه ، مع الحفاظ على مزايا تفسير الشفرة الوسيطة: إذ غالبًا ما تتم معالجة معظم العمليات المعقدة لتحليل الشفرة المصدرية الأصلية وإجراء التحسينات الأساسية في وقت الترجمة، قبل النشر: فالترجمة من الشفرة الوسيطة إلى شفرة الآلة أسرع بكثير من الترجمة من المصدر. الشفرة الوسيطة المنشورة قابلة للنقل، على عكس الشفرة الأصلية. وبما أن وقت التشغيل يتحكم في عملية الترجمة، كما هو الحال مع الشفرة الوسيطة المفسرة، فإنه يُمكن تشغيلها في بيئة معزولة آمنة. كتابة المترجمات من بايت كود إلى لغة الآلة أسهل، لأن مترجم بايت كود المحمول قد قام بالفعل بالكثير من العمل.

يُقدّم كود JIT عمومًا أداءً أفضل بكثير من المفسرات. إضافةً إلى ذلك، قد يُقدّم في بعض الحالات أداءً أفضل من الترجمة الثابتة، حيث أن العديد من التحسينات لا يُمكن تطبيقها إلا أثناء وقت التشغيل: [ 17 ] [ 18 ]

  1. يمكن تحسين عملية الترجمة البرمجية لتتوافق مع وحدة المعالجة المركزية المستهدفة ونظام التشغيل الذي يعمل عليه التطبيق. على سبيل المثال، يمكن للمترجم الفوري (JIT) اختيار تعليمات SSE2 المتجهة لوحدة المعالجة المركزية عند اكتشافه دعم وحدة المعالجة المركزية لها. وللحصول على هذا المستوى من الدقة في التحسين باستخدام مترجم ثابت، يجب إما تجميع ملف تنفيذي لكل منصة/بنية مستخدمة، أو تضمين نسخ متعددة من أجزاء من الكود ضمن ملف تنفيذي واحد.
  2. يستطيع النظام جمع إحصائيات حول كيفية تشغيل البرنامج فعليًا في بيئته، كما يمكنه إعادة ترتيبه وإعادة تجميعه لتحقيق الأداء الأمثل. مع ذلك، يمكن لبعض المترجمات الثابتة أيضًا استخدام معلومات الملف التعريفي كمدخلات.
  3. يُمكن للنظام إجراء تحسينات شاملة على مستوى الكود (مثل تضمين دوال المكتبة ) دون فقدان مزايا الربط الديناميكي ودون التكاليف الإضافية المصاحبة للمترجمات والروابط الثابتة. فعلى وجه التحديد، عند إجراء استبدالات مضمنة شاملة، قد تتطلب عملية الترجمة الثابتة إجراء فحوصات أثناء التشغيل والتأكد من استدعاء دالة افتراضية إذا تجاوزت الفئة الفعلية للكائن الدالة المضمنة، وقد يلزم إجراء فحوصات شروط الحدود على الوصول إلى المصفوفات داخل الحلقات. مع الترجمة الفورية، يُمكن في كثير من الحالات نقل هذه المعالجة خارج الحلقات، مما يُؤدي غالبًا إلى زيادة كبيرة في السرعة.
  4. على الرغم من أن هذا ممكن مع اللغات التي يتم تجميعها بشكل ثابت مع جمع البيانات المهملة، إلا أن نظام البايت كود يمكنه بسهولة أكبر إعادة ترتيب التعليمات البرمجية المنفذة لتحسين استخدام ذاكرة التخزين المؤقت.

نظرًا لأنّ مُترجم JIT يجب أن يُنشئ ويُنفّذ صورة ثنائية أصلية أثناء التشغيل، فإنّ مُترجمات JIT الحقيقية التي تعمل بلغة الآلة تتطلب منصات تسمح بتنفيذ البيانات أثناء التشغيل، مما يجعل استخدام هذه المُترجمات على جهاز يعتمد على بنية هارفارد أمرًا مستحيلاً؛ وينطبق الأمر نفسه على بعض أنظمة التشغيل والآلات الافتراضية. مع ذلك، قد لا يستهدف نوع خاص من مُترجمات JIT بنية وحدة المعالجة المركزية للجهاز الفعلي، بل يستهدف بايت كود مُحسّن للآلة الافتراضية حيث تسود قيود على لغة الآلة الخام، خاصةً عندما تستخدم الآلة الافتراضية لهذا البايت كود مُترجم JIT لتحويله إلى كود أصلي. [ 19 ]

أداء

تُسبب تقنية الترجمة الفورية (JIT) تأخيرًا طفيفًا إلى ملحوظ في بدء تشغيل التطبيق، نظرًا للوقت المستغرق لتحميل وتجميع كود الإدخال. يُطلق على هذا التأخير أحيانًا اسم "تأخير بدء التشغيل" أو "وقت الإحماء". عمومًا، كلما زادت عمليات التحسين التي تُجريها تقنية JIT، كان الكود الناتج أفضل، ولكن سيزداد التأخير الأولي أيضًا. لذلك، يتعين على مُجمِّع JIT الموازنة بين وقت التجميع وجودة الكود الذي يرغب في إنتاجه. قد يتضمن وقت بدء التشغيل عمليات إدخال/إخراج مُتزايدة بالإضافة إلى تجميع JIT: على سبيل المثال، يبلغ حجم ملف بيانات فئة rt.jar الخاص بآلة جافا الافتراضية (JVM) 40 ميجابايت، ويجب على JVM البحث عن كمية كبيرة من البيانات في هذا الملف الضخم. [ 20 ]

إحدى طرق التحسين الممكنة، المستخدمة في آلة جافا الافتراضية HotSpot من صن ، هي الجمع بين التفسير والترجمة الفورية (JIT). يُفسَّر كود التطبيق مبدئيًا، لكن آلة جافا الافتراضية تراقب تسلسلات البايت كود التي تُنفَّذ بشكل متكرر، ثم تُترجمها إلى كود الآلة لتنفيذها مباشرةً على الجهاز. بالنسبة للبايت كود الذي يُنفَّذ مرات قليلة فقط، يُوفِّر هذا وقت الترجمة ويُقلِّل زمن الاستجابة الأولي؛ أما بالنسبة للبايت كود الذي يُنفَّذ بشكل متكرر، فتُستخدم الترجمة الفورية (JIT) لتشغيله بسرعة عالية، بعد مرحلة أولية من التفسير البطيء. علاوة على ذلك، بما أن البرنامج يقضي معظم وقته في تنفيذ جزء صغير من كوده، فإن تقليل وقت الترجمة يُعدّ ذا أهمية كبيرة. أخيرًا، أثناء تفسير الكود الأولي، يُمكن جمع إحصائيات التنفيذ قبل الترجمة، مما يُساعد على تحسين الأداء. [ 21 ]

قد يختلف التوازن الأمثل تبعًا للظروف. على سبيل المثال، تحتوي آلة جافا الافتراضية من صن على وضعين رئيسيين: وضع العميل ووضع الخادم. في وضع العميل، يتم إجراء الحد الأدنى من التجميع والتحسين لتقليل وقت بدء التشغيل. أما في وضع الخادم، فيتم إجراء تجميع وتحسين مكثفين لزيادة الأداء إلى أقصى حد بمجرد تشغيل التطبيق على حساب وقت بدء التشغيل. وقد استخدمت مُجمِّعات جافا الأخرى التي تعمل في الوقت الفعلي قياسًا لوقت التشغيل لعدد مرات تنفيذ دالة ما، بالإضافة إلى حجم رمز البايت الخاص بها، كمعيار لتحديد وقت التجميع. [ 22 ] بينما يستخدم مُجمِّع آخر عدد مرات التنفيذ مع اكتشاف الحلقات. [ 23 ] وبشكل عام، يصعب التنبؤ بدقة بالدوال التي يجب تحسينها في التطبيقات قصيرة التشغيل مقارنةً بالتطبيقات طويلة التشغيل. [ 24 ]

يُعدّ مولد الصور الأصلي (Ngen) من مايكروسوفت نهجًا آخر لتقليل التأخير الأولي. [ 25 ] يقوم Ngen بالتجميع المسبق (أو "التجميع المسبق في وقت التشغيل") لرمز البايت في صورة لغة وسيطة مشتركة إلى رمز أصلي للجهاز. ونتيجةً لذلك، لا حاجة إلى تجميع وقت التشغيل. يقوم إطار عمل .NET 2.0 المُضمّن مع Visual Studio 2005 بتشغيل Ngen على جميع ملفات مكتبة الارتباط الديناميكي (DLL) الخاصة بمايكروسوفت مباشرةً بعد التثبيت. يوفر التجميع المسبق في وقت التشغيل طريقةً لتقليل وقت بدء التشغيل. ومع ذلك، قد تكون جودة الكود الناتج عنه أقل من جودة الكود المُجمّع في وقت التشغيل، للأسباب نفسها التي تجعل الكود المُجمّع بشكل ثابت، دون تحسين مُوجّه بالملف التعريفي ، لا يُمكن أن يكون بجودة الكود المُجمّع في وقت التشغيل في الحالة القصوى: نقص بيانات التنميط لتشغيل، على سبيل المثال، التخزين المؤقت المضمن. [ 26 ]

توجد أيضًا تطبيقات جافا التي تجمع بين مترجم AOT (مترجم مسبق) إما مع مترجم JIT ( Excelsior JET ) أو مترجم ( GNU Compiler for Java ).

قد لا تحقق عملية الترجمة الفورية (JIT) هدفها بشكل موثوق، ألا وهو الوصول إلى حالة استقرار من الأداء المحسن بعد فترة تهيئة أولية قصيرة. [ 27 ] [ 28 ] قام باريت وآخرون (2017) بقياس ستة معايير أداء دقيقة شائعة الاستخدام ، والتي يستخدمها مطورو الآلات الافتراضية عادةً كأهداف للتحسين، وذلك عبر ثماني آلات افتراضية مختلفة، حيث قاموا بتشغيلها بشكل متكرر ضمن عملية تنفيذ واحدة. [ 29 ] على نظام لينكس ، وجدوا أن 8.7% إلى 9.6% من عمليات التنفيذ فشلت في الوصول إلى حالة استقرار من الأداء، وأن 16.7% إلى 17.9% منها دخلت في حالة استقرار من الأداء المنخفض بعد فترة تهيئة، وأن 56.5% من عمليات تشغيل آلة افتراضية محددة لمعيار أداء محدد فشلت في تحقيق استقرار في الأداء دون تدهور عبر عمليات تنفيذ متعددة (أي أن عملية تنفيذ واحدة على الأقل فشلت في الوصول إلى حالة استقرار أو شهدت انخفاضًا في الأداء في حالة الاستقرار). حتى في الحالات التي تم فيها الوصول إلى حالة استقرار محسنة، فقد استغرق الأمر في بعض الأحيان مئات التكرارات. [ 30 ] ركز تريني وآخرون (2022) بدلاً من ذلك على الآلة الافتراضية HotSpot ولكن مع مجموعة أوسع بكثير من المعايير، [ 31 ] ووجدوا أن 10.9% من عمليات تنفيذ العمليات فشلت في الوصول إلى حالة أداء مستقرة، وأن 43.5% من المعايير لم تصل باستمرار إلى حالة مستقرة عبر عمليات تنفيذ متعددة. [ 32 ]

حماية

تعتمد عملية الترجمة الفورية (JIT) بشكل أساسي على البيانات القابلة للتنفيذ، وبالتالي فهي تشكل تحديات أمنية وثغرات أمنية محتملة.

تتضمن عملية ترجمة JIT ترجمة الشفرة المصدرية أو الشفرة الثنائية إلى شفرة الآلة وتنفيذها. ويتم ذلك عادةً مباشرةً في الذاكرة: حيث يُخرج مُترجم JIT شفرة الآلة مباشرةً إلى الذاكرة ويُنفذها فورًا، بدلًا من إخراجها إلى القرص ثم استدعاء الشفرة كبرنامج منفصل، كما هو الحال في الترجمة المسبقة المعتادة. في البنى الحديثة، يُواجه هذا مشكلةً بسبب حماية مساحة التنفيذ : إذ لا يُمكن تنفيذ أي جزء من الذاكرة، وإلا سيُشكل ذلك ثغرةً أمنيةً محتملة. لذا، يجب وضع علامة "قابل للتنفيذ" على الذاكرة؛ ولأسباب أمنية، ينبغي القيام بذلك بعد كتابة الشفرة إلى الذاكرة ووضع علامة "للقراءة فقط" عليها، لأن الذاكرة القابلة للكتابة/التنفيذ تُعد ثغرةً أمنية (انظر W^X ). [ 33 ] على سبيل المثال، قدّم مُترجم JIT الخاص بمتصفح Firefox للغة JavaScript هذه الحماية في إصدار مع Firefox 46. [ 34 ]

يُعدّ JIT spraying فئة من ثغرات أمن الكمبيوتر التي تستخدم تجميع JIT لرش الذاكرة : تصبح الذاكرة الناتجة قابلة للتنفيذ، مما يسمح باستغلالها إذا أمكن نقل التنفيذ إلى الذاكرة.

الاستخدامات

يمكن تطبيق الترجمة الفورية (JIT) على بعض البرامج، أو استخدامها لبعض القدرات، لا سيما القدرات الديناميكية مثل التعابير النمطية . على سبيل المثال، قد يقوم محرر النصوص بترجمة تعبير نمطي مُقدم أثناء التشغيل إلى لغة الآلة لتسريع عملية المطابقة: لا يمكن القيام بذلك مسبقًا، لأن النمط يُقدم فقط أثناء التشغيل. تعتمد العديد من بيئات التشغيل الحديثة على الترجمة الفورية لتنفيذ التعليمات البرمجية بسرعة عالية، بما في ذلك معظم تطبيقات جافا ، بالإضافة إلى بيئة .NET من مايكروسوفت . وبالمثل، تتميز العديد من مكتبات التعابير النمطية بخاصية الترجمة الفورية للتعابير النمطية، إما إلى رمز وسيط أو إلى لغة الآلة. تُستخدم الترجمة الفورية أيضًا في بعض المحاكيات، لترجمة لغة الآلة من بنية معالج مركزي إلى أخرى.

تتمثل إحدى الطرق الشائعة لتطبيق الترجمة الفورية (JIT) في إجراء ترجمة مسبقة (AOT) إلى رمز وسيط ( رمز الآلة الافتراضية )، تُعرف بترجمة الرمز الوسيط ، ثم إجراء ترجمة فورية (JIT) إلى رمز الآلة (الترجمة الديناميكية)، بدلاً من تفسير الرمز الوسيط. يُحسّن هذا الأسلوب أداء وقت التشغيل مقارنةً بالتفسير، ولكنه يُسبب تأخيرًا ناتجًا عن الترجمة. تُترجم مُترجمات JIT باستمرار، كما هو الحال مع المُفسِّرات، ولكن تخزين الكود المُترجم مؤقتًا يُقلل من التأخير عند تنفيذ نفس الكود لاحقًا خلال نفس عملية التشغيل. وبما أنه يتم ترجمة جزء فقط من البرنامج، فإن التأخير يكون أقل بكثير مما لو تم ترجمة البرنامج بأكمله قبل التنفيذ.

انظر أيضاً

ملحوظات

  1. يمكن للمترجمات المسبقة (AOT) استهداف بنى معمارية دقيقة محددة أيضًا، لكن الفرق بين AOT وJIT في هذا الشأن يكمن في قابلية النقل. يستطيع JIT إنتاج كود مُصمم خصيصًا لوحدة المعالجة المركزية قيد التشغيل أثناء وقت التشغيل، بينما يتطلب AOT، بدلًا من التحسين لمجموعة فرعية عامة من البنى المعمارية الدقيقة، معرفة وحدة المعالجة المركزية المستهدفة مسبقًا: قد لا يكون هذا الكود فعالًا على أنواع أخرى من وحدات المعالجة المركزية فحسب، بل قد يكون غير مستقر تمامًا .

مراجع

  1. اللغات، والمترجمات، وأنظمة وقت التشغيل ، جامعة ميشيغان، قسم علوم وهندسة الحاسوب، مؤرشف من الأصل في 26 مارس 2018 ، تم استرجاعه في 15 مارس 2018
  2. 1 2 3 أيكوك 2003 .
  3. "هل يستفيد نظام الترجمة الفورية (JIT) من وحدة المعالجة المركزية الخاصة بي؟" . مدونة ديفيد نوتاريو . تم الاطلاع عليها بتاريخ 3 ديسمبر 2018 .
  4. 1 2 Aycock 2003 ، 2. تقنيات تجميع JIT ، 2.1 Genesis ، ص. 98.
  5. مكارثي، ج. (أبريل 1960). "الدوال التكرارية للتعبيرات الرمزية وحسابها آليًا، الجزء الأول". اتصالات رابطة آلات الحوسبة . 3 (4): 184-195 . CiteSeerX 10.1.1.111.8833 . doi : 10.1145/367177.367199 . S2CID 1489409 .  
  6. تومسون 1968 .
  7. أيكوك 2003 ، 2. تقنيات تجميع JIT، 2.2 LC²، ص. 98-99.
  8. ميتشل، جي جي (1970). "تصميم وبناء أنظمة برمجة تفاعلية مرنة وفعالة".{{cite journal}}يتطلب الاستشهاد بالمجلة ( مساعدة )|journal=
  9. دويتش، إل بي؛ شيفمان، إيه إم (1984). "التنفيذ الفعال لنظام سمول توك-80" (ملف PDF) . وقائع الندوة الحادية عشرة لجمعية ACM SIGACT-SIGPLAN حول مبادئ لغات البرمجة - POPL '84 . الصفحات 297-302 . doi : 10.1145/800017.800542 . ISBN  0-89791-125-3. S2CID 3045432 . مؤرشف من الأصل (PDF) بتاريخ 2004-06-18. 
  10. "97-pep.ps" . research.sun.com . مؤرشف من الأصل بتاريخ 24 نوفمبر 2006. تم الاطلاع عليه بتاريخ 15 يناير 2022 .
  11. أيكوك 2003 ، 2.14 جافا، ص. 107، الحاشية 13.
  12. "دينامو: نظام تحسين ديناميكي شفاف". فاسانث بالا، إيفلين دويستروالد، سانجيف بانيرجيا. وقائع مؤتمر ACM SIGPLAN 2000 حول تصميم لغات البرمجة وتنفيذها. الصفحات من 1 إلى 12. DOI 10.1145/349299.349303. تاريخ الاسترجاع: 28 مارس 2012
  13. جون جانوتي. "دينامو إتش بي" . آرس تكنيكا . تم الاطلاع عليه بتاريخ 5 يوليو 2013 .
  14. "مشروع HP Dynamo" . مؤرشف من الأصل في 19 أكتوبر 2002. تم الاطلاع عليه في 12 أبريل 2016 .
  15. تونغ، ليام (27 نوفمبر 2020). "لغة البرمجة PHP 8 متوفرة الآن: مُترجم JIT الجديد يُشير إلى أداء أفضل" . ZDNet . تم الاطلاع عليه بتاريخ 28 نوفمبر 2020 .
  16. "ما الجديد في بايثون 3.13" . وثائق بايثون . تم الاطلاع عليه بتاريخ 27-11-2024 .
  17. كروتشي، لويس. "مجموعة في الوقت المناسب" (ملف PDF) . جامعة كولومبيا . مؤرشف من الأصل (ملف PDF) بتاريخ 2018-05-03.
  18. "ما هي مزايا الترجمة الفورية (JIT) مقابل الترجمة المسبقة (AOT)؟" . ستاك أوفرفلو . 21 يناير 2010.
  19. "تجميع لغة تعتمد على JIT إلى WebAssembly" . Stack Overflow . تم الاسترجاع في 4 ديسمبر 2018 .
  20. هاس، تشيت (مايو 2007). "بيئة تشغيل جافا للمستهلك: تقنية جافا أكثر كفاءة وفعالية" . صن مايكروسيستمز . تم الاسترجاع في 27 يوليو 2007 .
  21. "بنية محرك أداء Java HotSpot" . Oracle.com . تم الاطلاع عليه بتاريخ 2013-07-05 .
  22. شيلينغ، جوناثان ل. (فبراير 2003). "قد تكون أبسط الطرق الاستدلالية هي الأفضل في مُجمِّعات جافا JIT" (ملف PDF) . إشعارات SIGPLAN . 38 (2): 36-46 . doi : 10.1145/772970.772975 . S2CID 15117148. مؤرشف من الأصل (ملف PDF) بتاريخ 24-09-2015. 
  23. ^ توشيو سوغانوما، توشياكي ياسو، موتوهيرو كاواهيتو، هيدياكي كوماتسو، توشيو ناكاتاني، “إطار عمل التحسين الديناميكي لمترجم جافا في الوقت المناسب”، وقائع مؤتمر ACM SIGPLAN السادس عشر حول البرمجة والأنظمة واللغات والتطبيقات الموجهة للكائنات (OOPSLA '01)، الصفحات من 180 إلى 195، من 14 إلى 18 أكتوبر، 2001.
  24. ماثيو أرنولد، مايكل هيند، باربرا جي رايدر، "دراسة تجريبية للتحسين الانتقائي"، وقائع ورشة العمل الدولية الثالثة عشرة حول اللغات والمترجمات للحوسبة المتوازية - أوراق منقحة ، ص 49-67، 10-12 أغسطس 2000.
  25. ^ "مولد الصور الأصلي (Ngen.exe)" . Msdn2.microsoft.com. 5 ديسمبر 2006 . تم الاسترجاع 2013/07/05 .
  26. سويني، أرنولد (فبراير 2005). "دراسة استقصائية حول التحسين التكيفي في الآلات الافتراضية" (ملف PDF) . وقائع معهد مهندسي الكهرباء والإلكترونيات . 92 (2): 449-466 . مؤرشف من الأصل (ملف PDF) بتاريخ 29-06-2016.
  27. باريت وآخرون 2017 ، ص. 3.
  28. ^ تريني وآخرون. 2022 ، ص. 1.
  29. باريت وآخرون 2017 ، ص 5-6.
  30. باريت وآخرون 2017 ، ص 12-13.
  31. ^ تريني وآخرون. 2022 ، ص. 17-23.
  32. ^ تريني وآخرون. 2022 ، ص. 26-29.
  33. "كيفية تطبيق نظام الإنتاج في الوقت المناسب  - مقدمة"، إيلي بيندرسكي، 5 نوفمبر 2013، الساعة 5:59 صباحًا
  34. دي مويج، يناير "تم تمكين رمز W^X JIT في Firefox" . جان دي مويج . تم الاسترجاع 11 مايو 2016 .

فهرس