سؤال

كنت أقرأ عن إيجابيات وسلبيات اللغات المترجمة، ومن أكثر السلبيات شيوعاً هو البطء، ولكن لماذا تكون البرامج باللغات المترجمة بطيئة؟

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

المحلول

يعمل البرامج الأصلية باستخدام التعليمات المكتوبة للمعالج الذي يعملون عليه.

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

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

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

لذلك، فمن غير الصحيح قليلا أن أقول أن لغة بطيء، بدلا من ذلك هو السياق الذي يعمل فيه بطيء.

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

وعلى أن تكون واضحا، عندما أقول "بطيئة"، وهذا هو بالطبع مصطلح نسبي.

نصائح أخرى

يبدو أن جميع الإجابات تفوت النقطة المهمة الحقيقية هنا. إنها التفاصيل كيف يتم تنفيذ رمز "المفسر".

لغات البرنامج النصي المفسر أبطأ لأن طريقتها ونموذج المساحة المتغيرة العالمي لها ديناميكية. في رأيي هذا هو التعريف الحقيقي لغة البرنامج النصي وليس حقيقة أنه يتم تفسيره. هذا يتطلب العديد من عمليات البحث الإضافية في الجدول في كل وصول إلى مكالمة متغيرة أو طريقة. والسبب الرئيسي الذي يجعلهم جميعا فظيعون في صيغة متعددة واستخدام GIL (قفل مترجم عالمي). هذه البحث هو المكان الذي ينفق فيه معظم الوقت. إنها بحث عن ذاكرة عشوائية مؤلمة، مما يؤلم حقا عندما تحصل على Miske L1 / L2 مخبأ.

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

يتم توضيح هذه التقنية بشكل جيد في ورقة Deutsch / Schiffman "التنفيذ الفعال لنظام Smalltalk-80".

السؤال لماذا لا تفعل PHP، Python و Ruby هذا أمر بسيط للغاية للإجابة: هذه التقنية معقدة للغاية لتنفيذها.

وفقط Google لديها المال لدفع مقابل JavaScript لأن مترجم JavaScript يستند إلى المتصفح السريع هو حاجتها الأساسية لنموذج أعمالها مليار دولار.

فكر في Interpeter كمحاكي لجهاز لا يحدث له

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

فكر في وقت التشغيل المفسر كمحاكي لجهاز لا يحدث له فعليا في الوقت الحالي.

من الواضح أن هذا معقد من الجبهة (فقط في الوقت المناسب) المجمعين الذين لديهم جافا، ج #، وغيرها. من الناحية النظرية، فهي جيدة مثل "AOT" ("AOT" ("في وقت واحد")، ولكن في الممارسة العملية، تعمل هذه اللغات بشكل أبطأ وتتعامل معها من خلال الحاجة إلى التحويل البرمجي حول استخدام الذاكرة والوقت في وقت تشغيل البرنامج. ولكن إذا قلت أي من ذلك هنا، فاستعد لجذب المدافعين JIT RABID الذين يصرون على أنه لا يوجد فرق نظري بين Jit و Aot. إذا طرحت منهم إذا كانت Java و C # بأسرع وقت ممكن C و C ++، فإنها تبدأ في صنع الأعذار ونوع الهدوء قليلا. :-)

لذلك، C ++ قواعد تماما في الألعاب حيث يمكن دائما استخدام الحد الأقصى لمبلغ الحوسبة المتاحة.

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

هذا سؤال جيد، ولكن يجب صياغته بشكل مختلف قليلا في رأيي، على سبيل المثال: "لماذا تكون لغات مفسرة أبطأ من اللغات المترجمة؟"

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

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

حلقة 100 مرة، يتم تفسير محتويات الحلقة 100 مرة في رمز مستوى منخفض.

لا تخزين مؤقتا، وليس إعادة استخدامها، غير محسنة.

بشروط بسيطة، يفسر مترجم مرة واحدة في رمز المستوى المنخفض

تحرير، بعد التعليقات:

  • جيت هو تجميع وانتاج الشفرة, ، لم يفسر. لقد تم تجميعها في وقت لاحق فقط وليس مقدما
  • أشير إلى التعريف الكلاسيكي، وليس التطبيقات العملية الحديثة

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

سؤال بسيط، دون أي إجابة بسيطة حقيقية. خلاصة القول هي أن جميع أجهزة الكمبيوتر "فهم" حقا هي التعليمات الثنائية، والتي هي ما هي لغات "سريعة" مثل C تجميعها في.

ثم هناك آلات افتراضية، والتي تفهم تعليمات ثنائية مختلفة (مثل Java و .NET) ولكن يجب ترجمة تلك الموجودة في الطيران إلى تعليمات الماكينة بواسطة مترجم فقط (JIT). هذا سريع تقريبا (حتى أسرع في بعض الحالات المحددة لأن JIT لديه معلومات أكثر من برنامج تحويل ثابت حول كيفية استخدام الكود.)

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

لكن اللغات المترجمة غالبا ما تكون سريعة بما يكفي للأغراض التي استخدمتها. تكون تطبيقات الويب ملزمة دائما عن طريق IO (عادة الوصول إلى قاعدة البيانات) وهو أمر أبطأ من حيث يكون أي مترجم.

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

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

من about.com:

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

أبطأ 5-10 مرات غير صحيح بالضرورة لغات مثل Java و C #. يتم تفسيرها، ولكن التحويل البرمجي في الوقت المناسب يمكن أن تولد تعليمات لغة الجهاز لبعض العمليات، وتسريع الأشياء بشكل كبير (بالقرب من سرعة لغة مترجمة في بعض الأحيان).

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

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

بعد أن أقول أنه، فهي أبطأ لأن وحدة المعالجة المركزية الخاصة بك تنفذ العديد من الإرشادات لكل "سطر الكود"، لأن العديد من التعليمات أمضيت فهم الكود بدلا من القيام بأي كل ما توحي فيه دلالات الخط!

اقرا هذا إيجابيات وسلبيات اللغات المترجمة

هذه هي الفكرة ذات الصلة في هذا المنشور لمشكلتك.

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

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

تحديث: لا، لم أر وجكتي هي نفسها واحدة مقبولة، إلى درجة ؛-)

نعم، لغات مفسر بطيئة ...

ومع ذلك، فكر في ما يلي. كان لدي مشكلة في حلها. استغرق الأمر مني 4 دقائق لحل المشكلة في بيثون، واستغرق البرنامج 0.15 ثانية لتشغيله. ثم حاولت أن أكتبها في ج، وحصلت على وقت تشغيل من 0.12 ثانية، واستغرق الأمر مني ساعة واحدة لكتابة ذلك. كل هذا لأن الطريقة العملية لحل المشكلة في السؤال هي استخدام hashtables، ويمطر hashtable في وقت التشغيل على أي حال.

ويكيبيديا تقول,

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

إحالة هذا IBM Doc.,

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

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

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

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