لكل وظيفة حتمية, هل هناك نظير وظيفي بأداء متطابق أو حتى تعليمات?

cs.stackexchange https://cs.stackexchange.com/questions/130062

سؤال

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

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

أنا على بينة من التكافؤ بين comput-محسوب و تورينج محسوب ، ولكن ولكن لم أتمكن من العثور على إجابة على هذا السؤال على الانترنت.إذا كان هناك ، يرجى مشاركة مثال مترجم أو دليل.إذا لم يكن كذلك ، يرجى توضيح السبب وإظهار مثال مضاد.أم أن هذا سؤال مفتوح غير تافه?


التعديلات التكميلية على النحو المقترح من قبل أندريه باور:

أن تكون أكثر تحديدا, هنا 2 الأمثلة التي أدت إلى التفكير في هذا السؤال.

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

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

التعديلات التكميلية على النحو المقترح من قبل نيرو:

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

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

المحلول

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

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

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

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

  2. ما يعتبر لغة "وظيفية"?كل لغة وظيفية عملية لديها بعض التسهيلات لحالة قابلة للتغيير:أوكامل ، هاسكل ، سكالا ، ليسب ، مخطط ، الخ.يعطي تكرار الذيل شيئا مكافئا تقريبا للطفرة داخل الحلقة.ولكن عندما لا يكون هذا كافيا ، فإن اللغات الوظيفية تمنح المبرمج حق الوصول إلى حالة قابلة للتغيير.في حالة هاسكل ، يتم التحكم في هذا بواسطة نظام النوع ، لذلك لا يوجد أبدا حالة قابلة للتغيير ضمنية, ، لكن الطفرة مسموح بها إلى حد كبير وحتى يتم تشجيعها في هاسكل.نظرة على أي رمز هاسكل ، وسوف ترى إو موناد في كل مكان.وبالمثل ، تميز لغات التعلم الآلي بين الأنواع T و ref T, ، لذلك يمكنك معرفة ما إذا كان المتغير قابلا للتغيير أم لا.

  3. لا يوجد مترجم "مثالي" بفضل نظرية رايس.جميع المجمعين ، حتمية أو وظيفية ، هي "أفضل جهد:" استخدام تقريبية المحافظة لتحسين التعليمات البرمجية.

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

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

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