سؤال

ما الفرق بين مترجم JIT وCLR؟إذا قمت بتجميع التعليمات البرمجية الخاصة بك إلى il وقام CLR بتشغيل هذا الرمز، فماذا يفعل JIT؟كيف تغير تجميع JIT مع إضافة الأدوية الجنيسة إلى CLR؟

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

المحلول

ووJIT هو جانب واحد من CLR.

وعلى وجه التحديد هو الجزء المسئول عن تغيير CIL / MSIL (ويشار إليها IL) التي تنتجها مترجم اللغة الأصلية ل(csc.exe لمايكروسوفت ج # على سبيل المثال) إلى الأم رمز الجهاز المعالج الحالي (والعمارة أنه يعرض في العملية الحالية، على سبيل المثال 32 / 64bit) عن. إذا كان ngen'd التجميع في السؤال ثم عملية JIT غير ضرورية تماما وسوف CLR تشغيل هذا الرمز على ما يرام دون ذلك.

وقبل أن تستخدم الطريقة التي لم يتم تحويلها من تمثيل وسيط هو مسؤولية JIT لتحويله.
بالضبط <م> عند وJIT ستبدأ في غير محددة للتنفيذ، وعرضة للتغيير. إلا أن تصميم ولايات CLR أن يحدث JIT <م> قبل تنفيذ التعليمات البرمجية ذات الصلة، وJVM على النقيض من شأنه أن يكون حرا في تفسير رمز لفترة من الوقت في حين أن موضوع منفصل يخلق تمثيل رمز الجهاز.
يستخدم CLR «طبيعية» ل<لأ href = "http://codeidol.com/csharp/net-framework/Inside-the-CLR/Just-In-Time-(JIT)-Compilation/" يختلط = "noreferrer" > ما قبل JIT نهج كعب حيث بالطرق وJIT تجميع فقط كما يتم استخدامها. وهذا ينطوي على وجود أسلوب الأصلي كعب الأولي أن يكون المراوغة لإرشاد JIT تجميع طريقة ثم تعديل المكالمة الأصلية لتخطي الماضي كعب الأولي. الطبعة المدمجة الحالية بدلا يجمع كل الطرق على نوع عند تحميله.

لمعالجة إضافة الوراثة.

وكان هذا التغيير الرئيسي الأخير لمواصفات IL وJIT من حيث معاني الكلمات بدلا من تفاصيل التنفيذ الداخلية.

أضيفت

وعدة تعليمات IL جديدة، وقدمت خيارات بيانات أكثر الفوقية لinstrumenting أنواع وأفراد. أضيفت القيود على مستوى IL كذلك.

عند برمجيا JIT الطريقة التي لديها حجج العامة (سواء صراحة أو ضمنا من خلال الطبقة التي تحتوي على) قد أنشئت مسارات مختلفة مدونة (تعليمات آلة القانون) لكل نوع المستخدمة. في الممارسة العملية يستخدم JIT التنفيذ المشترك لجميع أنواع مرجع منذ المتغيرات لهذه سوف يحمل نفس الدلالة وتحتل نفس المساحة (IntPtr.Size).

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

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

نصائح أخرى

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

يحرر, ، لتوضيح الإجابة أكثر (لا تزال مبسطة بشكل مفرط):

عندما تقوم بتجميع كود C# الخاص بك في الاستوديو المرئي، يتم تحويله إلى IL يفهمه CLR، وIL هو نفسه بالنسبة لجميع اللغات التي تعمل أعلى CLR (وهو ما يمكّن وقت تشغيل .NET من استخدام عدة لغات وعمليات تفاعلية بينهما بسهولة).

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

هذا ما سيبدو عليه الأمر بالنسبة لـ C#

كود سي# > مترجم C# > انا > وقت تشغيل .NET > مترجم JIT > كود الآلة > تنفيذ

وهذا ما سيبدو عليه الأمر بالنسبة لـ VB

كود في بي > مترجم VB > انا > وقت تشغيل .NET > مترجم JIT > كود الآلة > تنفيذ

وكما ترون فإن الخطوتين الأوليين فقط هي فريدة لكل لغة، وكل شيء بعد تحويله إلى IL هو نفسه، وهذا، كما قلت من قبل، هو السبب وراء إمكانية تشغيل عدة لغات مختلفة أعلى .NET

كما يقول جون سكيت، JIT جزء من CLR.في الأساس هذا ما يحدث تحت الغطاء:

  1. يتم تجميع كود المصدر الخاص بك في كود بايت يعرف باسم اللغة المتوسطة المشتركة (CIL).
  2. يتم تضمين البيانات الوصفية من كل فئة وكل طريقة (وكل شيء آخر :O) ​​في رأس PE للملف القابل للتنفيذ الناتج (سواء كان ملف dll أو exe).
  3. إذا كنت تنتج ملفًا قابلاً للتنفيذ، فإن PE Header يشتمل أيضًا على برنامج تشغيل تقليدي يكون مسؤولاً عن تحميل CLR (وقت تشغيل اللغة العامة) عند تنفيذ الملف القابل للتنفيذ.

الآن، عند التنفيذ:

  1. يقوم برنامج التشغيل بتهيئة CLR (بشكل أساسي عن طريق تحميل مجموعة mscorlib) ويوجهه لتنفيذ التجميع الخاص بك.
  2. ينفذ CLR إدخالك الرئيسي.
  3. الآن، تحتوي الفئات على جدول متجه يحتوي على عناوين وظائف الطريقة، لذلك عند استدعاء MyMethod، يتم البحث في هذا الجدول ثم يتم إجراء استدعاء مطابق للعنوان.عند البدء، تحتوي جميع إدخالات جميع الجداول على عنوان مترجم JIT.
  4. عند إجراء استدعاء لأحد هذه الأساليب، يتم استدعاء JIT بدلاً من الأسلوب الفعلي ويتولى التحكم.يقوم JIT بعد ذلك بتجميع كود CIL إلى كود التجميع الفعلي للبنية المناسبة.
  5. بمجرد تجميع التعليمات البرمجية، ينتقل JIT إلى جدول متجهات الطريقة ويستبدل العنوان بأحد التعليمات البرمجية المجمعة، بحيث لا تستدعي كل مكالمة لاحقة JIT.
  6. وأخيرًا، يتولى JIT تنفيذ التعليمات البرمجية المترجمة.
  7. إذا قمت باستدعاء طريقة أخرى لم يتم تجميعها بعد، فارجع إلى 4...وما إلى ذلك وهلم جرا...

ووJIT هو في الأساس <م> الجزء من CLR. جامع القمامة شيء آخر. تماما حيث كنت وضعت مسؤوليات إمكانية التشغيل المتداخل وما هو مسألة أخرى، واحد حيث أنا underqualified كبيرة التعليق:)

وأنا أعلم أن موضوع قديم جدا، لكنني أعتقد أنني قد وضعت في الصورة التي جعلتني أفهم JIT. انها من ممتاز كتاب CLR عبر C # جيفري Ritcher . في الصورة، والبيانات الوصفية التي يتحدث عنها هو التعريف المنبعثة في رأس التجميع حيث يتم تخزين جميع المعلومات حول أنواع في الجمعية:

1) أثناء ترجمة برنامج الصافية، يتم تحويل كود برنامج الصافية إلى رمز المتوسطة اللغة (IL)

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

  1. يعد Common Language Runtime (CLR) مترجمًا بينما يعد Just In Time (JIT) مترجمًا في .Net Framework.

2.JIT هو المترجم الداخلي لـ .NET الذي يأخذ كود لغة التعليمات البرمجية المتوسطة لـ MicroSoft (MSICL) من CLR وينفذه لتعليمات محددة للجهاز بينما تعمل CLR كمحرك وتتمثل مهمته الرئيسية في توفير كود MSICL إلى JIT للتأكد من أن التعليمات البرمجية صحيحة. تجميعها بالكامل وفقا لمواصفات الجهاز.

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