2010-08-22 22 views
30

यदि आपके पास ऐसा एप्लिकेशन होने की संभावना है जो हास्केल और सी ++ दोनों का उपयोग करेगी। आप कौन सी परतों को हास्केल-प्रबंधित करने देंगे और आप कौन सी परतें सी ++ को प्रबंधित करेंगे?मिक्सिंग हास्केल और सी ++

क्या किसी ने कभी ऐसा कोई संगठन किया है, (निश्चित रूप से)?

पहले तो मुझे लगता है कि मैं सी ++ परतों में सब मैं/हे संचालन रखेंगे (हास्केल साइट यह वास्तव में आसान है क्योंकि हास्केल एक विधा है, जहां यह जीसीसी द्वारा सी में संकलित किया जा सकता है बताता है)। साथ ही जीयूआई प्रबंधन।

यह बहुत अस्पष्ट सवाल है, लेकिन जैसा कि मैं हास्केल सीखने की योजना बना रहा हूं, मैं कुछ काम को हास्केल-कोड (मैं वास्तव में कोडिंग में सीखता हूं) को सौंपने के बारे में सोच रहा था, और मैं कुछ हिस्सा चुनना चाहता हूं जहां मैं देखूंगा हास्केल लाभ।

+0

यह वर्णन करना उपयोगी होगा कि आप किस प्रकार के एप्लिकेशन को बनाने की योजना बना रहे हैं। –

+0

मेरे पास कई परियोजनाएं हैं I प्रत्येक वास्तव में अलग है। महत्वपूर्ण बात यह है कि हास्केल अच्छा है, सी ++ से बेहतर है, और उसके बाद हास्केल को सीखने और अपने आप से न्याय करने के लिए हास्केल को इस तरह से कोड करने का प्रयास करें। –

उत्तर

22

हास्केल का लाभ शक्तिशाली अबास्ट्रक्शन है जो आपको उपयोग करने की अनुमति देता है। आप लोगों और शून्यों और पतों और रजिस्टरों के संदर्भ में नहीं सोच रहे हैं लेकिन गणना और प्रकार गुण और निरंतरताएं हैं।

सी ++ का लाभ यह है कि जब आवश्यक हो तो आप इसे अनुकूलित कैसे कर सकते हैं। आप उच्च दिमागी मोनैड, तीर, आंशिक अनुप्रयोग, और शुद्ध कार्यों को लिखने के बारे में नहीं सोच रहे हैं: सी ++ के साथ, आप सीधे नंगे धातु तक पहुंच सकते हैं!

इन दो बयानों के बीच तनाव है। अपने पत्र में “Structured Programming with go to statements,” डोनाल्ड नुथ

मैं एक लंबे समय है कि प्रोग्रामिंग के लिए एक प्रतिभा चीजों की स्थूल विचारों को सूक्ष्म से आसानी से स्विच करने की क्षमता काफी हद तक होते हैं के लिए महसूस किया है, यानी ने लिखा है अमूर्त के स्तर को बदलने के लिए धाराप्रवाह।

यह जानते हुए कि हास्केल और सी ++, लेकिन यह भी कि कैसे और उपयोग करने के लिए कैसे जब गठबंधन उन्हें अच्छी तरह से समस्याओं के सभी प्रकार के नीचे दस्तक देगा।

मैंने लिखा है कि आखिरी बड़ी परियोजना मैंने FFI सी में लिखी एक इन-हाउस रडार मॉडलिंग लाइब्रेरी का उपयोग करने में शामिल किया था। यह अनुकरण करना होगा, और शेष आवेदन के उच्च स्तरीय तर्क को व्यक्त करना होगा दर्द। मैंने हास्केल में "दिमाग" रखा और जब मुझे इसकी आवश्यकता थी तो सी लाइब्रेरी कहा जाता था।

आप इसे एक अभ्यास के रूप में करना चाहते हैं, इसलिए मैं उसी दृष्टिकोण की सिफारिश करता हूं: हास्केल में स्मारक लिखें। सी ++ के दास के रूप में हास्केल को झुकाव शायद आपको निराश कर देगा या आपको महसूस होगा कि आप अपना समय बर्बाद कर चुके हैं। प्रत्येक भाषा का प्रयोग करें जहां इसकी ताकतें झूठ बोलती हैं।

+0

Thanx मेरी स्थिति को बदलने के लिए। हास्केल को सी ++ कॉल करना चाहिए। मैं कोशिश करूँगा लेकिन इसका मतलब यह भी है कि आवेदन का मूल हास्केल संचालित है। तो आप का अर्थ है कि सी ++ में उपलब्ध वस्तु, कार्यात्मक, और टेम्पलेट प्रोग्रामिंग हास्केल द्वारा प्रदान की जाने वाली संभावनाओं से कम लचीला है? हास्केल कड़ाई से उस अनुप्रयोग के प्रवाह और तर्क के साथ चिपकेगा जो मैं बना सकता हूं? क्या यही मतलब है तुम्हारा? –

+2

और Knuth के लेख के लिए thanx, (मूलभूत कभी चोट नहीं)। हालांकि यह एसीएम के माध्यम से स्वतंत्र रूप से उपलब्ध नहीं है (अच्छी तरह से मेरे पास कोई खाता नहीं है), इसे CiteSeerx –

+0

पर डाउनलोड किया जा सकता है यह वास्तव में काफी गलत है। जब आवश्यक हो तो आप कसकर सी ++ को अनुकूलित कर सकते हैं- लेकिन आप सी ++ में सूचियों, कचरा संग्रह और पैटर्न मिलान के संदर्भ में बिल्कुल सोच सकते हैं। आप सी – Puppy

5

मैंने कभी भी दोनों भाषाओं को मिश्रित नहीं किया है, लेकिन आपका दृष्टिकोण मेरे लिए थोड़ा उल्टा लगता है। हास्केल उच्च स्तरीय संचालन पर अधिक उपयुक्त है जबकि सी ++ को अनुकूलित किया जा सकता है और यह तंग लूप और अन्य प्रदर्शन महत्वपूर्ण कोड के लिए सबसे अधिक फायदेमंद हो सकता है।

हास्केल के सबसे बड़े लाभों में से एक आईओओ के monads में encapsulation है। जब तक यह आईओ समय महत्वपूर्ण नहीं है, मुझे सी ++ में ऐसा करने का कोई कारण नहीं दिखता है।

जीयूआई भाग के लिए आप शायद सही हैं। हास्केल जीयूआई पुस्तकालयों की एक बड़ी संख्या है लेकिन सी ++ में क्यूटी क्रिएटर जैसे शक्तिशाली उपकरण हैं जो कठिन कार्यों को सरल बनाते हैं।

+0

नहीं, यह आपके ऊपर उल्टा प्रतीत नहीं होता है। आप स्पष्ट रूप से कह रहे हैं: सबकुछ के लिए हास्केल का प्रयोग करें। शायद जीयूआई और समय महत्वपूर्ण संचालन के अलावा। यही कारण है कि आप समझ में नहीं आ रहे हैं कि मैं दो भाषाओं को मिला सकता हूं। सी ++ द्वीप में मुझे रखने के लिए एक छोटा सा कारण है (हालांकि मैंने किसी भी तुलना करने के लिए पर्याप्त हास्केल नहीं सीखा है), सी ++ के साथ मुझे अभी भी लगता है कि हार्डवेयर ऑपरेशन के बारे में बात करने के बाद क्या हो रहा है। –

+3

मुझे नहीं लगता कि pmr यह कह रहा है। आपने पूछा कि सापेक्ष ताकत क्या हैं - और pmr का जवाब बहुत सटीक है। यदि आप एक अनिवार्य शैली के साथ अधिक आरामदायक महसूस करते हैं, तो यह ठीक है। लेकिन यह आपकी खुद की भावना है, न कि भाषाएं क्या अच्छी हैं, इसकी तुलना में, जो आपने मूल रूप से मांगी थी। – Yitz

+1

हाँ यह एक भावना है, मैं पूरी तरह से इसके साथ सहमत हूं, जितना अधिक मैं हास्केल को पर्याप्त नहीं जानता। (मैंने pmr +1 बनाया) –

7

यह उत्तर एक व्यापक उत्तर से अधिक कहानी है, लेकिन मैंने कम्प्यूटेशनल भाषाविज्ञान में अपने शोध प्रबंध के लिए हास्केल, पायथन और सी ++ का मिश्रण किया, साथ ही साथ कई सी और जावा टूल्स जिन्हें मैंने नहीं लिखा था। मुझे पास्कन का उपयोग गस्क कोड के रूप में हास्केल, सी ++ और जावा प्रोग्राम शुरू करने के लिए, एक अलग प्रक्रिया के रूप में सब कुछ चलाने के लिए सबसे आसान पाया।

सी ++ एक काफी सरल, तंग लूप था जो फीचर घटनाओं की गणना करता था। असल में यह सब गणित और सरल I/O था। मैंने वास्तव में पाइथन गोंद कोड #define एस से भरा शीर्षलेख लिखकर और पुनः संकलन करके विकल्पों को नियंत्रित किया। हैकी की तरह, लेकिन यह काम किया।

हास्केल सभी इंटरमीडिएट प्रोसेसिंग था: मैंने उपयोग किए गए विभिन्न सी और जावा पार्सर्स से जटिल आउटपुट लेते हुए, बाहरी डेटा फ़िल्टर करना और सी ++ कोड की अपेक्षाकृत सरल प्रारूप को बदलना। फिर मैंने सी ++ आउटपुट लिया और इसे लाटेक्स मार्कअप में बदल दिया (अन्य प्रारूपों के बीच)।

यह एक ऐसा क्षेत्र है जहां आप पाइथन मजबूत होने की अपेक्षा करेंगे, लेकिन मुझे पता चला कि हास्केल जटिल संरचनाओं में हेरफेर बनाता है; पाइथन साधारण लाइन-टू-लाइन ट्रांसफॉर्मेशन के लिए शायद बेहतर है, लेकिन मैं पार्स पेड़ को टुकड़ा कर रहा था और मुझे लगा रहा था और मैंने पाया कि जब मैंने पायथन में कोड लिखा था तो मैं इनपुट और आउटपुट प्रकार भूल गया था।

चूंकि मैं एक और अधिक संरचित स्क्रिप्टिंग भाषा की तरह हास्केल का उपयोग कर रहा था, इसलिए मैंने कुछ फ़ाइल I/O उपयोगिताएं लिखनी समाप्त कर दीं, लेकिन इससे परे, पेड़ और सूची में हेरफेर के लिए निर्मित पुस्तकालयों में पर्याप्त मात्रा में पर्याप्तता थी।

संक्षेप में, यदि आपको मेरी तरह कोई समस्या है, तो मैं स्मृति-बाधित, गति-महत्वपूर्ण भाग, उच्च स्तरीय परिवर्तनों के लिए हास्केल और पाइथन को चलाने के लिए सी ++ का सुझाव दूंगा।

+2

मेरा प्रोग्राम बैच ऑपरेशन था, बिना जीयूआई, इसलिए सी ++ और हास्केल फाइलों के अलावा, एक-दूसरे से बात नहीं की। मैंने उन्हें दोनों पायथन के उपप्रोसेसर का उपयोग करके शुरू किया। इसलिए मैं अपनी मशीन पर कोर का उपयोग अधिकतम कर सकता था। तो पाइथन वास्तव में दूसरों से बात नहीं करता था। लेकिन मैंने पाया कि मुझे अधिक सी ++ की आवश्यकता नहीं थी - केवल केंद्रीय, सबसे मेमोरी-होगिंग एल्गोरिदम। यदि आपको बहुत सी ++ की आवश्यकता है, या आपको अपने प्रोग्राम के टुकड़ों के बीच घनिष्ठ सहयोग की आवश्यकता है, तो मेरी विधि अच्छी तरह से काम नहीं कर सकती है। –

+0

* परिवर्तन * कुंजी शब्द है। कार्यात्मक भाषाएं सही उपकरण हैं यदि केवल और यदि आप चीजों को बदल रहे हैं। –

8

यहाँ है कि कैसे मैं चीजों को देखने के:

  • कार्यात्मक भाषाओं रूपांतरित होने बातें में उत्कृष्टता। जब भी आप ऐसे प्रोग्राम लिखते हैं जो इनपुट और मानचित्र/फिल्टर/इसे कम करते हैं, कार्यात्मक संरचनाओं का उपयोग करें। आश्चर्यजनक असली दुनिया के उदाहरण जहां हास्केल को एक्सेल करना चाहिए वेब अनुप्रयोगों द्वारा दिया जाता है (आप मूल रूप से डेटाबेस में संग्रहीत चीजों को वेब पृष्ठों में परिवर्तित करते हैं)।
  • प्रक्रियात्मक भाषाओं (ओओपी भाषा प्रक्रियात्मक) ऑब्जेक्ट्स के बीच साइड इफेक्ट्स और संचार पर उत्कृष्टता प्राप्त करती है। वे डेटा को बदलने के लिए उपयोग करने के लिए बोझिल हैं, लेकिन जब भी आप इंसानों के साथ सिस्टम प्रोग्रामिंग या (बिडरेक्शनल) इंटरैक्शन करना चाहते हैं (क्लाइंट-साइड वेब प्रोग्रामिंग सहित किसी भी प्रकार के उपयोगकर्ता इंटरफेस), वे साफ-सफाई करते हैं।
  • हालांकि, कुछ तर्क दे सकते हैं कि उपयोगकर्ता इंटरफेस में एक कार्यात्मक वर्णन होना चाहिए, मैं जवाब देता हूं कि अच्छी तरह से स्थापित ढांचे ओओपी भाषाओं के साथ उपयोग करने में काफी आसान हैं जिन्हें किसी को इस तरह उपयोग करना चाहिए। आखिरकार, वस्तुओं के बीच वस्तुओं और संचार के संदर्भ में यूआई घटकों के बारे में सोचना स्वाभाविक है।
  • आईओ केवल एक उपकरण है: जब भी आप आउटपुट में इनपुट बदलते हैं, हास्केल (या जो भी एफपी भाषा) आईओ करना चाहिए। जब भी आप किसी इंसान से बात करते हैं, सी ++ (या जो भी ओओपी भाषा) आईओ करना चाहिए।
  • गति की परवाह नहीं है। जब आप सही नौकरी के लिए हास्केल का उपयोग करते हैं, तो यह कुशल है। जब आप सही नौकरी के लिए सी ++ या पायथन का उपयोग करते हैं, तो यह कुशल है।

    • अपने आवेदन की मुख्य भूमिका डेटा को बदलने के लिए है, तो मैं इसे हास्केल में लिखें:

    इसलिए, मान लीजिए कि मैं हास्केल, सी, सी ++ और अजगर में धाराप्रवाह हूँ, यहाँ मैं कैसे अनुप्रयोग लिखने किए जाने पर , सी में लिखे गए कुछ निम्न-स्तरीय हिस्सों के साथ (जो बदले में, सी ++ में लिखे गए कुछ उच्च तकनीक वाले निम्न स्तर के हिस्सों को कॉल कर सकता है, लेकिन मैं पोर्टेबिलिटी कारणों के लिए इंटरफ़ेस के रूप में सी के साथ चिपकूँगा)।

  • यदि मेरे एप्लिकेशन की मुख्य भूमिका किसी उपयोगकर्ता के साथ बातचीत करना है, तो मैं इसे पायथन (उदाहरण के लिए पीईक्यूटी) में लिखता हूं, और सी ++ में लिखे गए पायथन कॉल प्रदर्शन-महत्वपूर्ण दिनचर्या (बूस्ट :: पायथन बाध्यकारी जनरेटर के रूप में बहुत अच्छा है) । मुझे उन सबराउटिन को भी कॉल करना पड़ सकता है जो डेटा को ट्रांसफॉर्म या लाते हैं, जो हास्केल में लिखा जाएगा।
  • यदि मुझे हास्केल में किसी एप्लिकेशन का एक हिस्सा लिखना है, तो मैं इसे सी-कॉल करने योग्य API में अलग करता हूं।
  • कभी-कभी, एक हास्केल एप्लिकेशन जो stdin पर चीजें पढ़ता है और stdout पर वापस लिखता है, एक सबमिशन (जिसे आप कांटा/निष्पादन कहते हैं, या जो भी आपके प्लेटफॉर्म पर कॉल करते हैं) के रूप में उपयोगी होता है। कभी-कभी, इस तरह के अनुप्रयोगों के लिए एक शेल स्क्रिप्ट सही रैपर है।
+0

सप्ताहों के साथ चल रहा है, मैं Haskell के बजाय F # पर वापस गिर गया है। कम जटिलता के लिए, और नेट संगतता के लिए। जब मैं एफ # के साथ आसानी से हूं तो मैं वापस हास्केल वापस आऊंगा। और मैं फंक्शनल प्रोग्रामिंग के साथ-साथ Fask के मुकाबले हास्केल के बारे में आपकी राय लेता हूं। –

+0

अभी भी आपकी पोस्ट के बारे में सोच रहा है। जब आप कार्यात्मक प्रोग्रामिंग को बदलने के लिए अच्छा उल्लेख करते हैं, उदा। वेब ऐप्स: डेटाबेस दिया गया है, और एक ग्राफिकल थीम -> वेबसाइट। लेकिन मैंने अभी तक हास्केल वेब साइट प्रोग्रामिंग के बारे में नहीं सुना है, क्या आप मुझे इसके बारे में बता सकते हैं? –

+0

@Stephane: यह मुख्य रूप से इसलिए है क्योंकि अधिकांश वेब प्रोग्रामर अक्सर कंप्यूटर विज्ञान का गहन ज्ञान नहीं रखते हैं ... वेब प्रोग्रामिंग मुख्य रूप से php (जो खराब है) द्वारा भरोसा किया गया है। आप एएसपी.Net के साथ एफ # का उपयोग कर सकते हैं (और मुझे संदेह है कि यह पहली जगह एफ # शुरू करने का मुख्य कारण है), जो अच्छा है। कार्यात्मक भाषाओं में वेब प्रोग्रामिंग करने की सुंदरता और सादगी को समझने के लिए http://www.haskell.org/haskellwiki/Practical_web_programming_in_Haskell पर जाएं। –

संबंधित मुद्दे