سؤال

ما الذي يفعله مترجم JIT على وجه التحديد بدلاً من مترجم غير JIT؟هل يستطيع أحد أن يقدم وصفًا موجزًا ​​وسهل الفهم؟

هل كانت مفيدة؟

المحلول

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

وهذا على النقيض من المترجم التقليدي الذي يجمع الجميع الكود إلى لغة الآلة قبل يتم تشغيل البرنامج لأول مرة.

لإعادة الصياغة، يقوم المترجمون التقليديون ببناء البرنامج بأكمله كملف EXE قبل تشغيله لأول مرة.بالنسبة للبرامج ذات الطراز الأحدث، يتم إنشاء تجميع باستخدام الكود الكاذب (p-code).فقط بعد تنفيذ البرنامج على نظام التشغيل (على سبيل المثال، عن طريق النقر المزدوج على أيقونته) سيقوم المترجم (JIT) ببدء تشغيل كود الجهاز (m-code) وإنشاء رمز الجهاز الذي يفهمه المعالج المستند إلى Intel أو أي شيء آخر.

نصائح أخرى

في البداية، كان المترجم مسؤولاً عن تحويل لغة عالية المستوى (يتم تعريفها على أنها مستوى أعلى من المجمّع) إلى رمز كائن (تعليمات الآلة)، والتي سيتم بعد ذلك ربطها (بواسطة رابط) إلى ملف قابل للتنفيذ.

في مرحلة ما من تطور اللغات، كان المترجمون يقومون بتجميع لغة عالية المستوى إلى كود زائف، والذي سيتم بعد ذلك ترجمته (بواسطة مترجم) لتشغيل برنامجك.أدى هذا إلى إزالة كود الكائن والملفات التنفيذية، وسمح لهذه اللغات بأن تكون محمولة على أنظمة تشغيل متعددة ومنصات الأجهزة.كان باسكال (الذي تم تجميعه إلى P-Code) واحدًا من الأوائل؛تعد Java وC# من الأمثلة الأحدث.في النهاية، تم استبدال مصطلح P-Code بالرمز الثانوي، نظرًا لأن معظم العمليات الزائفة يبلغ طولها بايت.

يعد برنامج التحويل البرمجي Just-In-Time (JIT) إحدى ميزات مترجم وقت التشغيل، والذي بدلاً من تفسير الرمز الثانوي في كل مرة يتم فيها استدعاء طريقة ما، سيقوم بتجميع الرمز الثانوي في تعليمات رمز الجهاز الخاص بالجهاز قيد التشغيل، ثم استدعاء هذا رمز الكائن بدلاً من ذلك.ومن الناحية المثالية، فإن كفاءة تشغيل كود الكائن سوف تتغلب على عدم كفاءة إعادة ترجمة البرنامج في كل مرة يتم تشغيله.

JIT فقط في الوقت المناسب الكلمة نفسها تقول عندما تكون هناك حاجة (بناء على الطلب)

السيناريو النموذجي:

يتم تحويل كود المصدر بالكامل إلى كود الجهاز

سيناريو جيت:

سيتم تحويل الكود المصدري إلى لغة التجميع مثل البنية [for ex IL (لغة وسيطة) لـ C#، وByteCode لـ java].

يتم تحويل الكود الوسيط إلى لغة الآلة فقط عندما يحتاج التطبيق إلى تحويل الرموز المطلوبة إلى كود الآلة فقط.

مقارنة JIT و Non-JIT:

  • في JIT ، لا يتم تحويل كل الكود إلى رمز الجهاز أولاً ، وسيتم تحويل جزء من الرمز الضروري إلى رمز الجهاز ، ثم إذا لم تكن هناك طريقة أو وظيفة تسمى في الجهاز ، فسيتم تحويل ذلك إلى رمز الجهاز ...فهو يقلل العبء على وحدة المعالجة المركزية.

  • نظرًا لأن رمز الجهاز سيتم إنشاءه في وقت التشغيل .... سيقوم برنامج التحويل البرمجي JIT بإنتاج رمز الجهاز المحسن لعمارة وحدة المعالجة المركزية في الجهاز.

أمثلة جيت:

  1. في Java، JIT موجود في JVM (Java Virtual Machine)
  2. في C# يكون في CLR (وقت تشغيل اللغة العامة)
  3. في Android، يكون موجودًا في DVM (Dalvik Virtual Machine)، أو ART (Android RunTime) في الإصدارات الأحدث.

كما ذكر غيره

يرمز JIT إلى Just-in-Time مما يعني أنه يتم تجميع التعليمات البرمجية عند الحاجة إليها، وليس قبل وقت التشغيل.

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

أيضًا في المرة القادمة التي يتم فيها حساب هذه الوظيفة، يتم تنفيذ نفس الكود المترجم مرة أخرى على عكس التفسير العادي الذي يتم فيه تفسير الكود مرة أخرى سطرًا تلو الآخر.وهذا يجعل التنفيذ أسرع.

يقوم برنامج التحويل البرمجي JIT فقط بتجميع كود البايت إلى كود أصلي مكافئ عند التنفيذ الأول.عند كل عملية تنفيذ متتالية، يستخدم JVM فقط الكود الأصلي الذي تم تجميعه بالفعل لتحسين الأداء.

enter image description here

بدون مترجم JIT، يقوم مترجم JVM بترجمة رمز البايت سطرًا تلو الآخر لجعله يبدو كما لو كان يتم تنفيذ تطبيق أصلي.

enter image description here

مصدر

يرمز JIT إلى Just-in-Time مما يعني أنه يتم تجميع التعليمات البرمجية عند الحاجة إليها، وليس قبل وقت التشغيل.

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

بعد إنشاء كود البايت (وهو معمارية محايدة) بواسطة مترجم Java، سيتم التعامل مع التنفيذ بواسطة JVM (في Java).سيتم تحميل رمز البايت إلى JVM بواسطة أداة التحميل ثم يتم تفسير كل تعليمات بايت.

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

تعمل برامج التحويل البرمجي JIT فقط أثناء وقت التشغيل، لذلك ليس لدينا أي مخرجات ثنائية.

المترجم في الوقت المناسب (JIT):
يقوم بتجميع رموز Java الثانوية في تعليمات الجهاز الخاصة بوحدة المعالجة المركزية المحددة.

على سبيل المثال، إذا كان لدينا بيان حلقة في كود جافا الخاص بنا:

while(i<10){
    // ...
    a=a+i;
    // ...
 }

يتم تشغيل رمز الحلقة أعلاه لمدة 10 مرات إذا كانت قيمة i هي 0.

ليس من الضروري تجميع الكود الثانوي 10 مرات مرارًا وتكرارًا حيث سيتم تنفيذ نفس التعليمات لمدة 10 مرات.في هذه الحالة، من الضروري تجميع هذا الرمز مرة واحدة فقط ويمكن تغيير القيمة للعدد المطلوب من المرات.لذلك، يقوم مترجم Just In Time (JIT) بتتبع مثل هذه العبارات والأساليب (كما ذكرنا سابقًا) ويقوم بتجميع هذه القطع من كود البايت في كود الجهاز للحصول على أداء أفضل.

مثال آخر مشابه، هو البحث عن نمط باستخدام "التعبير العادي" في قائمة السلاسل/الجمل.

لا يقوم JIT Compiler بتجميع كافة التعليمات البرمجية إلى رمز الجهاز.يقوم بتجميع التعليمات البرمجية التي لها نمط مماثل في وقت التشغيل.

انظر الى هذا وثائق أوراكل حول فهم JIT لقراءة المزيد.

لديك رمز تم تجميعه في بعض لغة IL (اللغة المتوسطة).عند تشغيل البرنامج، لا يفهم الكمبيوتر هذا الرمز.إنه يفهم فقط الكود الأصلي.لذلك يقوم مترجم JIT بتجميع IL الخاص بك إلى كود أصلي بسرعة.يفعل ذلك على مستوى الأسلوب.

أعلم أن هذا موضوع قديم، ولكن تحسين وقت التشغيل هو جزء مهم آخر من تجميع JIT الذي لا يبدو أنه تمت مناقشته هنا.بشكل أساسي، يمكن لمترجم JIT مراقبة البرنامج أثناء تشغيله لتحديد طرق تحسين التنفيذ.وبعد ذلك، يمكنه إجراء هذه التغييرات بسرعة - أثناء وقت التشغيل.تحسين Google JIT (يحتوي Javaworld على ميزة جميلة مقالة جيدة حول هذا الموضوع.)

JIT تعني في الوقت المناسب برنامج التحويل البرمجي JIT هو برنامج يحول رمز بايت Java إلى تعليمات يمكن إرسالها مباشرة إلى المعالج.

يؤدي استخدام مترجم جافا في الوقت المناسب (مترجم ثانٍ حقًا) على منصة نظام معينة إلى دمج الكود الثانوي في رمز نظام معين، وبمجرد إعادة ترجمة الكود بواسطة مترجم jit، فعادةً ما يتم تشغيله بسرعة أكبر في الكمبيوتر.

يأتي المترجم في الوقت المناسب مع الجهاز الظاهري ويتم استخدامه اختياريًا.يقوم بتجميع الكود الثانوي في كود قابل للتنفيذ خاص بالنظام الأساسي والذي يتم تنفيذه على الفور.

المترجم في الوقت المناسب (JIT) هو جزء من البرنامج الذي يتلقى مدخلات غير قابلة للتنفيذ ويعيد رمز الجهاز المناسب ليتم تنفيذه.على سبيل المثال:

Intermediate representation    JIT    Native machine code for the current CPU architecture

     Java bytecode            --->        machine code
     Javascript (run with V8) --->        machine code

والنتيجة هي أنه بالنسبة لبنية معينة لوحدة المعالجة المركزية، يجب تثبيت مترجم JIT المناسب.

مترجم الفرق، مترجم، وJIT

على الرغم من إمكانية وجود استثناءات بشكل عام عندما نريد تحويل الكود المصدري إلى كود الآلة إلا أنه يمكننا استخدام:

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

يأخذ المترجم غير JIT كود المصدر ويحوله إلى كود بايت خاص بالجهاز في وقت الترجمة.يأخذ برنامج التحويل البرمجي JIT رمز البايت الحيادي للجهاز الذي تم إنشاؤه في وقت الترجمة ويحوله إلى رمز بايت خاص بالجهاز في وقت التشغيل.مترجم JIT الذي تستخدمه Java هو ما يسمح بتشغيل ثنائي واحد على العديد من الأنظمة الأساسية دون تعديل.

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

تجميع تكنولوجيا المعلومات هو مزيج من الطريقتان التقليديتان للترجمة إلى كود الآلة – التجميع المسبق (AOT), ، و تفسير – ويجمع بين بعض المزايا والعيوب لكليهما. يجمع تجميع JIT بين سرعة التعليمات البرمجية المترجمة ومرونة التفسير.

لنفكر في استخدام JIT في JVM،

على سبيل المثال، تقوم برامج التحويل البرمجي HotSpot JVM JIT بإنشاء تحسينات ديناميكية.بعبارة أخرى، يتخذون قرارات التحسين أثناء تشغيل تطبيق Java ويقومون بإنشاء تعليمات الجهاز الأصلية عالية الأداء تستهدف بنية النظام الأساسي.

عندما يتم اختيار طريقة للتجميع، يقوم JVM بتغذية كود البايت الخاص به إلى المترجم Just-In-Time (JIT).يحتاج JIT إلى فهم دلالات وصياغة الكود الثانوي قبل أن يتمكن من ترجمة الطريقة بشكل صحيح.لمساعدة مترجم JIT في تحليل الطريقة، تتم إعادة صياغة الكود الثانوي الخاص به أولاً في تمثيل داخلي يسمى أشجار التتبع، والتي تشبه كود الآلة بشكل أوثق من الكود الثانوي.يتم بعد ذلك إجراء التحليل والتحسينات على أشجار الطريقة.في النهاية، تتم ترجمة الأشجار إلى الكود الأصلي.

شجرة التتبع هي بنية بيانات يتم استخدامها في تجميع كود البرمجة في وقت التشغيل.تُستخدم أشجار التتبع في نوع من "المترجم في الوقت المناسب" الذي يتتبع تنفيذ التعليمات البرمجية أثناء النقاط الساخنة ويقوم بتجميعها.يشير إلى هذا.

يشير إلى :

يتم استخدام 20% من رمز البايت في 80% من الوقت.يحصل مترجم JIT على هذه الإحصائيات ويحسن نسبة 20% من كود البايت ليعمل بشكل أسرع عن طريق إضافة طرق مضمنة وإزالة الأقفال غير المستخدمة وما إلى ذلك وكذلك إنشاء رمز البايت الخاص بهذا الجهاز.أنا أقتبس من هذا المقال، وجدت أنه كان في متناول يدي. http://java.dzone.com/articles/just-time-compiler-jit-hotspot

يشير JIT إلى محرك التنفيذ في عدد قليل من تطبيقات JVM، وهو محرك أسرع ولكنه يتطلب ذاكرة أكبر، وهو مترجم في الوقت المناسب.في هذا المخطط، يتم تجميع الرموز الثانوية الخاصة بطريقة ما إلى كود الجهاز الأصلي في المرة الأولى التي يتم فيها استدعاء الطريقة.يتم بعد ذلك تخزين رمز الجهاز الأصلي للطريقة مؤقتًا، بحيث يمكن إعادة استخدامه في المرة التالية التي يتم فيها استدعاء نفس الطريقة.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top