سؤال

هل من الممكن تصميم شيء مثل Ruby أو Clojure دون فقدان الأداء الكبير في العديد من المواقف مقارنة بـ C/Java؟ هل يلعب تصميم الأجهزة دورًا؟

تحرير: مع الأهمية أعني بترتيب أحجام ، وليس فقط عشرة

تحرير: أظن أن Delnan على صواب معي وهذا يعني اللغات الديناميكية لذلك قمت بتغيير العنوان

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

المحلول

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

أفترض ، من خلال "المستوى العالي" ، تقصد "ديناميكي"؟ Haskell و OCAML عالية المستوى للغاية ، ومع ذلك يتم تجميعها أصليًا ويمكن أن تتفوق على الأداء C# أو Java ، وحتى C و C ++ في بعض حالات الزاوية - خاصةً إذا ظهر التوازي. وبالتأكيد لم يتم تصميمها مع الأداء كهدف رقم 1. لكن كتاب المترجم ، وخاصة أولئك الذين يركزون على اللغات الوظيفية ، هم قوم ذكي للغاية. إذا بدأت أنت أو لغة عالية المستوى ، حتى لو استخدمنا على سبيل المثال LLVM كواجهة خلفية للتجميع الأصلي ، فلن نحصل على أي مكان بالقرب من هذا الأداء.

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

انظر أيضا اللغات الديناميكية لستيف إيغج تعود إلى الوراء.

وبالطبع ، ما هي خسارة الأداء المهمة؟ 100 مرة أبطأ من C يقرأ مثل الكثير ، ولكن كما نعلم جميعًا ، يتم إنفاق 80 ٪ من وقت التنفيذ في 20 ٪ من الكود = 80 ٪ من الكود لن يكون له تأثير ملحوظ على الأداء المثير للبرنامج بأكمله. بالنسبة إلى 20 ٪ المتبقية ، يمكنك دائمًا إعادة كتابته في C أو C ++ والاتصال به من اللغة الديناميكية. بالنسبة للعديد من التطبيقات ، هذا يكفي (بالنسبة للبعض ، لا تحتاج حتى إلى تحسين). بالنسبة للباقي ... حسنًا ، إذا كان الأداء أمرًا بالغ الأهمية ، فيجب عليك كتابته بلغة مصممة للأداء.

نصائح أخرى

لا تخلط بين تصميم اللغة والنظام الأساسي الذي يعمل عليه.

على سبيل المثال ، Java هي لغة عالية المستوى. يعمل على JVM (كما يفعل Clojure - تم تحديده أعلاه ، و jruby - نسخة Java من Ruby). سيقوم JVM بإجراء تحليل رمز البايت ويحسن كيفية تشغيل الكود (استخدام تحليل الهروب ، وتجميع فقط في الوقت المناسب ، وما إلى ذلك). وبالتالي فإن المنصة لها تأثير على الأداء المستقل إلى حد كبير عن اللغة نفسها (انظر هنا لمزيد من المعلومات حول أداء Java والمقارنات بـ C/C ++)

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

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

قد تكون هناك تطبيقات لغوية تقدم بطء دون سبب وجيه ، ولكن لا يجب استخدامها.

قد ترغب في إلقاء نظرة على ما هو DARPA HPCS لقد توصلت المبادرة. كانت هناك 3 لغات برمجة مقترحة: قلعة صن ، و IBM's X10 و Cray's Chapel. آخران لا يزالان قيد التطوير. ما إذا كان أي من هؤلاء يفي بتعريفك مستوى عال لا أعلم.

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

من الممكن بالتأكيد. على سبيل المثال ، يعد Objective-C لغة مملوءة بشكل ديناميكي يمكن للأداء مماثل لـ C ++ (على الرغم من أنه أبطأ قليلاً ، بشكل عام ، ولكنه لا يزال مكافئًا تقريبًا).

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