سؤال

حسنا, أولا, أنا لا أريد أي نوع من flamewar هنا أو أي شيء مثل ذلك.بلدي السؤال الأكبر هو: من النظرية ، وتشمل بعض الأمثلة على ذلك.

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

يتيح العودة إلى الأيام التي لا يوجد فيها JIT المجمعين.جافا يحتوي الجهاز الظاهري الذي هو في الأساس الأجهزة.يمكنك كتابة التعليمات البرمجية ، مما جمعت إلى بايت كود أخذ على الأقل بعض الوظائف خارج الجهاز الظاهري ، هذا جيد.ولكن النظر في كيفية معقدة حتى RISC مجموعة التعليمات يمكن أن يكون في الأجهزة, لا أستطيع حتى التفكير في طريقة للقيام بذلك في برمجيات الأجهزة يحتذى.

ليس لدي خبرة في كتابة الأجهزة الظاهرية ، حتى أنا لا أعرف كيفية القيام به في أكثر كفاءة المستوى, ولكن لا أستطيع التفكير في أي شيء أكثر efifcient من اختبار كل تعليمات المباراة adn من الإجراءات المناسبة.شيء مثل: if(instruction=="something") { (do it) } else if(instruction=="something_diffrent"){ (do it) }الخ....

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

و لا يزال حتى كامل المنصات القائمة على جافا.على سبيل المثال, الروبوت.و أول verisons من الروبوت قد لا JIT compiler.كانوا تفسيرها.ولكن لا ينبغي أن يكون من الروبوت بشكل رهيب بطيئة ؟ ولكن الأمر ليس كذلك.أعلم عند استدعاء بعض API وظيفة من الروبوت المكتبة هي مكتوبة في رمز الجهاز ، لذلك فهي فعالة جدا وهذا يساعد كثيرا.

ولكن تخيل أنك تكتب الخاصة بك محرك اللعبة من sratch باستخدام API فقط لعرض الصور.سوف تحتاج إلى القيام بالعديد من مجموعة نسخ العمليات العديد من الحسابات التي قد تكون بطيئة بشكل رهيب عندما يحتذى به.

و الآن بعض الأمثلة كما وعدت.منذ أنا أساسا العمل مع ماكس ، وجدت JVM على Atmel AVR MCU.تاي الدولة التي 8MHZ MCU يمكن أن تفعل 20K جافا optcodes في الثانية.ولكن منذ AVR يمكن أن تفعل أكثر تعليمات في واحدة أو دورتين ، دعونا نقول 6000000 تعليمات المتوسط.هذا يعطينا أن JVM دون JIT هو 300 مرات أبطأ إلى رمز الجهاز.فلماذا يصبح جافا شعبية جدا دون مترجم JIT?أليس هذا أيضا سوء الأداء الخسارة ؟ أنا فقط لا يمكن أن نفهم ذلك.شكرا

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

المحلول

لقد كان رمز بايت حول لفترة طويلة.على القديم Apple II ، USCD p-نظام شعبية جدا التي جمعت باسكال إلى رمز بايت, التي من شأنها أن تفسر من قبل 8 بت 6502 التي قد تكون قيد التشغيل في 2 ميغاهرتز.تلك البرامج لم تشغيل سريع معقول.

وهو بايت كود مترجم عموما على طاولة القفز بدلا من سلسلة من if/then/else التصريحات.في C أو C++, هذا من شأنه أن ينطوي على switch البيان.في الأساس, المترجم قد ما يعادل مجموعة من معالجة التعليمات البرمجية ، واستخدام شفرة التشغيل في البايت كود تعليم فهرس الصفيف.

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

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

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

نصائح أخرى

ولكن لا ينبغي أن تكون ثم الروبوت بشكل رهيب بطيئة ؟

تعريف "بطيئة بشكل رهيب".هذا الهاتف.ذلك أن عملية "الاتصال الهاتفي الرقم الأول" قبل طلب الرقم الثاني.

في أي تطبيق تفاعلي ، العامل المحدد هو دائما الإنسان وقت رد الفعل.يمكن أن يكون أبطأ 100 مرة و لا يزال أسرع من المستخدم.

لذا للإجابة على السؤال لك, نعم, المترجمين الفوريين بطيئة, ولكنها عادة ما تكون سريعة بما فيه الكفاية ، وخاصة الأجهزة التي تحافظ على الحصول على أسرع.

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

بايت كود المترجمين يمكن أن يكون أسرع خط إذا()s باستخدام طاولة القفز:

 void (*jmp_tbl)[256] = ...;  /* array of function pointers */
 byte op = *program_counter++;
 jmp_tbl[op]();

هناك نوعان من طرق مختلفة لمعالجة هذه المسألة.

(ط) "لماذا هو موافق لتشغيل بطيئة رمز"

جيمس سبق ذكره أعلاه, في بعض الأحيان سرعة التنفيذ ليس كل شيء كنت مهتما في.الكثير من التطبيقات التي تعمل في تفسير الوضع يمكن أن يكون "سريع بما فيه الكفاية".عليك أن تأخذ بعين الاعتبار كيفية رمز كنت تكتب سيتم استخدامها.

(الثاني) "لماذا يتم تفسير رمز inneficient"

هناك العديد من الطرق التي يمكنك تطبيق مترجم.في سؤالك تتحدث عن أكثر من السذاجة النهج:الأساس التحول الكبير, تفسير كل JVM التعليمات كما أنها قراءة.

ولكن يمكنك تحسين ذلك:على سبيل المثال, بدلا من البحث عن واحدة JVM التعليمات ، يمكنك إلقاء نظرة على سلسلة من لهم والبحث عن الأنماط التي لديك أكثر كفاءة التفسيرات المتاحة.الشمس JVM فعلا بعض هذه التحسينات في المترجم نفسه.في عمله السابق ، رجل استغرق بعض الوقت لتحسين المترجم أن يفسر جافا بايت كود تم تشغيل أسرع بشكل ملحوظ بعد التغييرات.

ولكن في الحديث JVMs التي تحتوي على JIT compiler, المترجم هو مجرد نقطة انطلاق حتى JIT لا وظيفة لها ، لذلك الناس لا تنفق الكثير من الوقت في تحسين مترجم.

12 ميغاهرتز سيكون ATtiny ، وهو المعالج 8 بت.يعني (على سبيل المثال) أن الأم 'إضافة" تعليمات يمكن فقط إضافة اثنين من 8 بت الأرقام معا للحصول على 9 بت النتيجة.JVM هو في الأساس الظاهري معالج 32 بت.هذا يعني إضافة التعليمات يضيف اثنين من أرقام 32 بت معا لإنتاج 33 بت النتيجة.

مثل عندما كنت مقارنة التعليمات معدلات يجب أن تتوقع 4:1 الحد في التعليم معدل الحد الأدنى المطلق.في الواقع, في حين أنه من السهل لمحاكاة 32 بت مع إضافة 4 8 بت يضيف (مع تحمل), بعض الأشياء لا مقياس تماما مثل ذلك.فقط على سبيل المثال ، وفقا اتميل الخاصة ملاحظة التطبيق, ، 16 × 16 الضرب إنتاج 32 بت نتيجة ينفذ في ~218 الساعة دورات.نفس التطبيق ملاحظة يظهر 16/16 بت شعبة (إنتاج 8 بت نتيجة) تعمل في 255 دورات.

على افتراض تلك نطاق خطيا ، يمكننا أن نتوقع إصدارات 32 بت من الضرب أن تأخذ ~425-450 ساعة دورات ، وشعبة ~510 دورات.في الواقع, ربما علينا أن نتوقع شيئا من النفقات العامة ، والتي من شأنها أن تقلل السرعة لا يزال أكثر-إضافة 10% على الأقل إلى تلك التقديرات ربما يجعلها أكثر واقعية.

خلاصة القول:عند مقارنة التفاح إلى التفاح ، يصبح من الواضح أن الكثير من الفرق سرعة تتحدث ليس حقيقيا على الإطلاق (أو لا تعزى JVM النفقات العامة على أي حال).

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