سؤال

Q1) لماذا يتم تجميع C # في البداية إلى IL ثم في وقت التشغيل JIT امتثالها وتشغيلها فوق جهاز افتراضي (؟). أم أنها JIT الامتثال لرمز الجهاز الأصلي؟

q2) إذا كان الثاني صحيحا (تمتثل JIT إلى رمز الجهاز الأصلي)، فأين يتم تشغيل الرمز .NET Sandbox.

Q3) بالإضافة إلى ذلك، لماذا تم تجميع التعليمات البرمجية ل IL في المقام الأول. لماذا لا تعبر ببساطة على رمز الجهاز الأصلي في كل وقت؟ هناك أداة من MS من هذا يسمى Ngen ولكن لماذا هذا اختياري؟

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

المحلول

IL هو Jit'd (JIT = في الوقت المناسب) تم تجميعها إلى رمز الجهاز الأصلي مع تشغيل العملية.

يسمح باستخدام طبقة الماكينات الافتراضية .NET بالتصرف بطريقة متسقة عبر المنصات (مثل INT INT هو دائما 32 بت بغض النظر عما إذا كنت تعمل على جهاز 32 أو 64 بت، فهذا ليس هو الحال مع C ++ ).

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

نصائح أخرى

A1) جيت يجمع إلى رمز الجهاز الأصلي

A2) في .NET لا يوجد مثل هذا المصطلح مثل Sandbox. هناك appdomains بدلا من ذلك. وهم يعملون كجزء من CLR (أي كجزء من العملية القابلة للتنفيذ)

A3) عيوب Ngen من جيفري ريختر:

  • يمكن أن تخرج ملفات ngen'd من المزامنة. عندما يحمل CLR ملف Ngen'd، فإنه يقارن عددا من الخصائص حول التعليمات البرمجية المترجمة مسبقا وبيئة التنفيذ الحالية. إذا لم تتطابق أي من الخصائص، فلا يمكن استخدام ملف Ngen'd، وتستخدم عملية مترجم JIT العادي بدلا من ذلك.

  • أداء وقت التحميل السفلي (Rebasing / Binding). ملفات التجميع هي ملفات Windows PE قياسية، وعلى هذا النحو، يحتوي كل منها على عنوان أساسي مفضل. العديد من مطوري النوافذ هم على دراية بالقضايا المحيطة بالعناوين الأساسية و Rebasing. عندما تقوم JIT بتجميع التعليمات البرمجية، فإن هذه القضايا ليست مصدر قلق لأن مراجع عناوين الذاكرة الصحيحة محسوبة في وقت التشغيل.

  • أداء وقت التنفيذ السفلي. عند تجميع التعليمات البرمجية، لا يمكن ل Ngen جعل العديد من الافتراضات حول بيئة التنفيذ حيث يمكن لمجموعة التحويل البرمجي JIT. هذا يؤدي ngen.exe لإنتاج رمز أدنى. على سبيل المثال، لن يتحسن Ngen استخدام تعليمات معينة معينة؛ ويضيف إحصاءات الوصول إلى الحقل الثابت لأن العنوان الفعلي للحقول الثابتة غير معروف حتى وقت التشغيل. يقوم Ngen بإدراج رمز لاستدعاء منشئين الفئة في كل مكان لأنه لا يعرف الترتيب الذي سينفذ فيه الرمز وإذا تم بالفعل استدعاء منشئ الفئة.

يمكنك استخدام ngen. لإنشاء إصدارات أصلية من مجموعات .NET الخاصة بك. القيام بذلك يعني أن JIT لا يجب أن تفعل هذا في وقت التشغيل.

يتم تجميع .NET ل IL أولا ثم إلى الأصل نظرا لأن JIT تم تصميمه لتحسين رمز IL لمعالجة وحدة المعالجة المركزية الحالية قيد التشغيل.

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

لست متأكدا من سؤال Sandbox، أفضل تخميني هو أن تطبيق .NET يعمل مع 3 مجالات تطبيقات. يحتوي مجال واحد على أوقات التشغيل .NET (mscorlib، system.dll، إلخ)، يحتوي مجال آخر على كود .NET الخاص بك، ولا أستطيع أن أذكر ما هو المجال الآخر ل. الدفع http://my.safaribooksonline.com/9780321584090.

1. يتم تجميع C # في Cil (أو IL) لأنه يشارك منصة مع بقية لغات .NET (وهذا هو السبب في أنه يمكنك كتابة DLL في C # واستخدامه في VB.NET أو F # بدون مشاحنات). ال Cler. سيتم بعد ذلك جايد تجميع التعليمات البرمجية في رمز الجهاز الأصلي.

يمكن أيضا تشغيل .NET أيضا على منصات متعددة (أحادية على * NIX و OS X). إذا تم تجميع C # إلى التعليمات البرمجية الأصلية، فلن يكون هذا سهلا تقريبا.

2. لا يوجد مربع الرمل.

3. مغطاة في الجواب على رقم 1

a1) بهذه الطريقة أنها منصة غير مرحة (Windows، Linux، Mac) ويمكنها أيضا استخدام تحسينات محددة لأجهزةك الحالية. عندما يحصل على جيت جمعت من كود الجهاز.

A2) الإطار بأكمله (إطار .NET Framework) هو كل Sandbox بحيث تكون جميع المكالمات التي قد تقوم بها من خلال تطبيقك ستذهب عبر Sandbox .NET Framework.

a3) كما هو الحال في الإجابة 1، فإنه يسمح .NET ثنائي للعمل في منصات مختلفة وأداء تحسينات محددة في جهاز العميل على الطاير.

تصبح Code Code Code il لغة وسيطة بنفس الطريقة بالضبط مثل رمز كائن كائن Javas. نعم، من الممكن توليد رمز الجهاز الأصلي باستخدام ngen. أداة. يرتبط Ngen بالصورة الأصلية الناتجة عن الجهاز، لذلك فإن نسخ Ngen'd Binary لنظام مختلف لن تنتج نتائج متوقعة. يسمح بتجميع التعليمات البرمجية المتوسطة لقرارات وقت التشغيل التي يمكن إجراؤها على خلاف ذلك "لا يمكن" إجراء (بسهولة) بلغة مكتوبة ثابتة مثل C ++، كما أنها تسمح أيضا بأداء التعليمات البرمجية على أجهزة تعريفات الأجهزة المختلفة لأن الرمز يصبح وصفي في بمعنى أنه يصف أيضا نية ما يجب أن يحدث في بعض الشيء (على سبيل المثال 32 أو 64) بطريقة غير منتظمة، بدلا من التعليمات البرمجية الخاصة بالآلة تعمل فقط على أنظمة 32 بت أو أنظمة 64 بت ولكن ليس كلاهما.

أيضا، ngen اختياري لأنني قلت أنها تربط الثنائي للنظام، فقد تكون مفيدة عندما تحتاج إلى أداء رمز الجهاز المترجمة مرونة لغة مكتوبة ديناميكيا وأنت تعرف أن الثنائي لن تتحرك إلى نظام لا يلزم به.

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