سؤال

إذا كان لديك إمكانية وجود تطبيق يستخدم كل من Haskell و C ++. ما هي الطبقات التي تسمح لها بإدارة هاسكل وما هي الطبقات التي تسمح بها C ++-تدار؟

هل قام أي شخص بعمل مثل هذه الجمعية ، (بالتأكيد)؟

(يخبر موقع Haskell أنه سهل حقًا لأن Haskell لديه وضع يمكن تجميعه في C بواسطة CCC)

في البداية ، أعتقد أنني سأحتفظ بجميع عمليات I/O في طبقات C ++. وكذلك إدارة واجهة المستخدم الرسومية.

إنه سؤال غامض إلى حد ما ، لكنني أخطط لتعلم هاسكل ، كنت أفكر في تفويض بعض الأعمال إلى Haskell-Code (أتعلم في الترميز فعليًا) ، وأريد أن أختار جزءًا من فوائد Haskell.

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

المحلول

فائدة Haskell هي التجريدات القوية التي يتيح لك استخدامها. أنت لا تفكر من حيث تلك والأصفار والعناوين والسجلات ولكن الحسابات وخصائص الكتابة والاستمرارية.

إن فائدة C ++ هي مدى إحكامك تحسينه عند الضرورة. أنت لا تفكر في أحاديات عالية التفكير ، والسهام ، والتطبيق الجزئي ، وتأليف وظائف نقية: مع C ++ ، يمكنك الوصول إلى المعدن العاري!

هناك توتر بين هذين البيانين. في ورقته "البرمجة المنظمة مع go to صياغات،" كتب دونالد نوث

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

معرفة كيفية استخدام Haskell و C ++ ولكن أيضًا كيف ومتى يجمع سيسلقون كل أنواع المشاكل.

آخر مشروع كبير كتبته المستخدم FFI تشارك في استخدام مكتبة نمذجة الرادار الداخلية المكتوبة في C. إعادة تنفيذها ، كان من الممكن أن يكون الأمر سخيفًا ، والتعبير عن المنطق رفيع المستوى لبقية التطبيق سيكون ألمًا. ظللت "أدمغة" في هاسكل ودعت مكتبة C عندما كنت بحاجة إليها.

كنت ترغب في القيام بذلك كتمرين ، لذلك أوصي بنفس النهج: اكتب الذكاء في هاسكل. من المحتمل أن ينتهي بك الأمر بتشكيل Haskell كعبد لـ C ++ مما يجعلك تشعر كما لو كنت تضيع وقتك. استخدم كل لغة حيث تكمن نقاط قوتها.

نصائح أخرى

إليكم كيف أرى الأشياء:

  • اللغات الوظيفية تتفوق في تحويل الأشياء. عندما تكتب برامج تأخذ إدخالًا وخريطة/تصفية/تقليلها ، استخدم بنيات وظيفية. يتم تقديم أمثلة رائعة في العالم الحقيقي حيث يجب أن تتفوق Haskell من خلال تطبيقات الويب (تقوم بشكل أساسي بتحويل الأشياء المخزنة في قاعدة بيانات إلى صفحات الويب).
  • اللغات الإجرائية (لغات OOP نكون الإجرائي) التفوق في الآثار الجانبية والتواصل بين الكائنات. إنها مرهقة للاستخدام لتحويل البيانات ، ولكن كلما أردت القيام برمجة النظام أو التفاعل (ثنائي الاتجاه) مع البشر (واجهات المستخدم من أي نوع ، بما في ذلك برمجة الويب من جانب العميل) ، فإنهم يقومون بالمهمة بشكل نظيف.
  • ومع ذلك ، قد يجادل البعض بأن واجهات المستخدم يجب أن يكون لها وصف وظيفي ، فأنا أجب أن الأطر الراسخة سهلة بما يكفي لاستخدامها مع لغات OOP التي يجب على المرء استخدامها بهذه الطريقة. بعد كل شيء ، من الطبيعي التفكير في مكونات واجهة المستخدم من حيث الكائنات والتواصل بين الكائنات.
  • IO ليست سوى أداة: كلما قمت بتحويل الإدخال إلى الإخراج ، يجب على Haskell (أو أي لغة FP) القيام بـ IO. كلما تحدثت إلى إنسان ، يجب على C ++ (أو أي لغة OOP) القيام بـ IO.
  • لا تهتم بالسرعة. عندما تستخدم Haskell في الوظيفة المناسبة ، فهي فعالة. عند استخدام C ++ أو Python للمهمة الصحيحة ، فهذا فعال.

لذلك ، دعنا نقول أنني بطلاقة في هاسكل ، C ، C ++ و Python ، إليك كيفية كتابة التطبيقات:

  • إذا كان الدور الرئيسي لتطبيقي هو تحويل البيانات ، فأنا أكتبها في Haskell ، مع وجود بعض الأجزاء المنخفضة المستوى المكتوبة في C (والتي قد تسمي بدورها بعض الأجزاء ذات المستوى المنخفض للغاية المكتوبة بـ C ++ ، لكنني سألتزم مع C كواجهة لأسباب قابلية النقل).
  • إذا كان الدور الرئيسي لتطبيقي هو التفاعل مع مستخدم ، فأنا أكتبه في Python (PYQT على سبيل المثال) ، والسماح لروتين Python بأداء الناقد المكتوبة بـ C ++ (Boost :: Python جيدًا كمولد ملزم). قد أضطر أيضًا إلى الاتصال بروتينات فرعية تقوم بتحويل البيانات أو جلبها ، والتي سيتم كتابتها في Haskell.
  • إذا اضطررت إلى كتابة جزء من تطبيق في Haskell ، فأنا أقوم بفصله إلى واجهة برمجة تطبيقات C-Collable.
  • في بعض الأحيان ، يعد تطبيق Haskell الذي يقرأ الأشياء على stdin والكتابة على stdout مفيدًا كوحدة فرعية (التي تتصل بها بشوكة/exec ، أو أي شيء آخر على النظام الأساسي الخاص بك). في بعض الأحيان ، يكون البرنامج النصي shell هو الغلاف المناسب لمثل هذه التطبيقات.

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

كانت C ++ حلقة بسيطة إلى حد ما ومحسب التي تحسب حوادث الميزات. في الأساس كل ما فعلته هو الرياضيات والإدخال/الإخراج البسيطة. أنا في الواقع أسيطر على الخيارات من خلال الحصول على رمز الغراء python اكتب رأسًا مليئًا به #defines و recomping. نوع من الاختراق ، لكنه نجح.

كان Haskell هو كل المعالجة المتوسطة: أخذ الإخراج المعقد من محلات C و Java المختلفة التي استخدمتها ، وتصفية البيانات الخارجية ، وتحويلها بالتنسيق البسيط الذي يتوقعه رمز C ++. ثم أخذت إخراج C ++ وحولته إلى وضع علامة على اللاتكس (من بين تنسيقات أخرى).

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

نظرًا لأنني كنت أستخدم Haskell كثيرًا مثل لغة البرمجة النصية الأكثر تنظيمًا ، فقد انتهى بي الأمر إلى كتابة بعض الأدوات المساعدة للملفات I/O ، ولكن بعد ذلك ، كانت المكتبات المدمجة للتلاعب بالأشجار والقائمة كافية.

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

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

واحدة من أكبر فوائد Haskell هي تغليف IO إلى Monads. طالما أن هذا IO ليس وقتًا بالغ الأهمية ، لا أرى أي سبب للقيام بذلك في C ++.

بالنسبة لجزء واجهة المستخدم الرسومية ، ربما تكون على حق. هناك عدد كبير من مكتبات Haskell GUI ولكن C ++ لديها أدوات قوية مثل QTCreator التي تبسط المهام المملة كثيرًا.

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