ترجمة في الوقت المناسب

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

يحلل النظام الذي ينفذ الترجمة الشيفرة البرمجية التي تُنفَّذ بشكل مستمر، ويحدد الأجزاء من الشيفرة التي تزيد سرعتها في الترجمة.

الترجمة في الوقت المناسب هي مزيج من النهجين التقليديين للترجمة إلى شيفرة الآلة، وهما الترجمة المسبقة (AOT)، والترجمة التفسيرية، ولكل منهما مزايا وعيوب. تجمع «الترجمة في الوقت المناسب» بين سرعة الشيفرة المترجمة ومرونة تفسير الترجمة، لكنها تتطلب مترجمًا وأعباء إضافية في التجميع والتحويل «وليس فقط التفسير». الترجمة في الوقت المناسب هي أحد أشكال الترجمة الديناميكية، وتتيح تطبيق التحسينات التكيفية مثل إعادة الترجمة الديناميكية وزيادة سرعات تعليمات برمجية محددة، بالتالي نظريًا يمكن أن توفر «الترجمة في الوقت المناسب» تنفيذًا أسرع من الترجمة الديناميكية.

يُعد كل من تفسير الترجمة و«الترجمة في الوقت المناسب» مناسبين للغات البرمجة الديناميكية، إذ يمكن لنظام الزمن التشغيلي أن يتعامل مع أنماط البيانات ذات الربط المتأخر ويفرض ضمانات أمنية.

التطبيقات

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

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

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

نظرة عامة

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

في المقابل، تفسر آلة تفسير افتراضية تقليدية شيفرة البايتات عمومًا بأداء أقل بكثير. تُفسر بعض المفسرات أيضًا الشيفرة المصدرية، دون ترجمتها أولًا إلى شيفرة بايتات، وأيضًا بأداء أسوأ.[3][4]

تُترجم الشيفرة البرمجية التي تترجم بشكل ثابت (Statically-compiled code) الشيفرة الأصلية قبل نشرها. يمكن استخدام المترجم في بيئة الترجمة الديناميكية في وقت التنفيذ. الهدف الشائع من استخدام تقنيات الترجمة في الوقت المناسب هو الوصول إلى أداء الترجمة الثابتة أو تجاوزه، عند الحفاظ على ميزات تفسير الشيفرة البرمجية: يتم التعامل مع معظم أعباء تحليل الشيفرة المصدرية الأصلية وتنفيذ التحسينات الأساسية غالبًا في وقت التنفيذ قبل النشر، وبذلك تكون الترجمة من شيفرة البايتات إلى شيفرة الآلة أسرع بكثير من الترجمة من المصدر. شيفرة البايتات المنشورة قابلة للنقل خلافًا للشيفرة الأصلية. نظرًا لأن فترة التشغيل تتحكم بعملية الترجمة، مثل تحكمها بشيفرة البايتات المُفسَّرة، يمكن تشغيلها في وضع حماية آمن. المترجمات من شيفرة البايتات إلى شيفرة الآلة هي الأسهل في الكتابة، لأن مترجمات شيفرة البايتات المحمولة تكون قد أنجزت مسبقًا جزءًا كبيرًا من العمل.[5]

مراجع

  1. ^ Languages, Compilers, and Runtime Systems، University of Michigan, Computer Science and Engineering، مؤرشف من الأصل في 2019-05-15، اطلع عليه بتاريخ 2018-03-15
  2. ^ Aycock 2003.
  3. ^ Croce، Louis. "Just in Time Compilation" (PDF). Columbia University. مؤرشف من الأصل (PDF) في 3 مايو 2018. اطلع عليه بتاريخ أغسطس 2020. {{استشهاد ويب}}: تحقق من التاريخ في: |تاريخ الوصول= (مساعدة)
  4. ^ "What are the advantages of JIT vs. AOT compilation". Stack Overflow. 21 يناير 2010. مؤرشف من الأصل في 2019-12-14. {{استشهاد ويب}}: |archive-date= / |archive-url= timestamp mismatch (مساعدة)
  5. ^ "javascript - Compile a JIT based lang to Webassembly". Stack Overflow. مؤرشف من الأصل في 2019-12-14. اطلع عليه بتاريخ 2018-12-04.