2012-08-02 23 views
5

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

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

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

इसलिए मैं इन तत्वों को संवाद करने की अनुमति देने के लिए एक कस्टम एपीआई के साथ स्थानीय क्लाइंट/सर्वर सिस्टम बनाने का निर्णय लेता हूं। उदाहरण के लिए, एयर एप्लिकेशन को सी एप्लिकेशन से एक संदेश प्राप्त होगा, इसे इसके यूआई को अपडेट करने के लिए कहा जाएगा। जावा में चल रहे यूएसबी एप्लिकेशन को यूएस अनुप्रयोग से ऑडियो स्ट्रीम करने के लिए सॉकेट का उपयोग सी अनुप्रयोग में किया जाएगा।

मेरा प्रश्न: इस तरह के सिस्टम को डिजाइन करने के लिए एक सामान्य तरीका स्थानीय सॉकेट का उपयोग कर रहा है? क्या प्रदर्शन वास्तव में मूल एप्लिकेशन (जैसे जावा या सी में सब कुछ एक निष्पादन योग्य में) से भी बदतर होगा? ऐसा लगता है कि ऐसा दृष्टिकोण बग के लिए प्रवण होगा, और बनाए रखना मुश्किल होगा?

मैं अक्सर अपने आप को मौजूदा सॉफ्टवेयर पुस्तकालयों (जैसे एक सुंदर, लचीला यूआई के साथ एक ग्राफिक्स लाइब्रेरी, लेकिन निम्न स्तर के हार्डवेयर तक पहुंचने का कोई तरीका नहीं, या एक मीडिया लाइब्रेरी जो कई ऑडियो धाराओं को मिश्रित कर सकता है, के खिलाफ आ रहा है, लेकिन मुझे लगता है कि, वीडियो प्लेबैक के लिए कोई समर्थन नहीं है), और इसे बहुत निराशाजनक लगता है। अगर कोई इस तरह मनमाना सॉफ्टवेयर पुस्तकालयों को गठबंधन करने का सबसे अच्छा तरीका सुझा सकता है, तो मैं वास्तव में इसकी सराहना करता हूं।

अग्रिम धन्यवाद!

उत्तर

4

आप सही तरीके से पहचान की है के रूप में मदद करता है, भिन्न भाषा या प्लेटफार्मों से पुस्तकालयों के संयोजन कठिन है। ऐसा करने के कई तरीके हैं, लेकिन कोई भी आदर्श नहीं है। उदाहरण:

  • मूल निवासी कॉल इंटरफेस (जैसे JNI/JNA) - बहुत तेजी से लेकिन मुश्किल काम सही ढंग से बनाने के लिए, और आप समस्या यह है कि आम तौर पर इस्तेमाल किया डेटा प्रकार विभिन्न प्लेटफार्मों भर में सफाई से मैप नहीं है। मूल निर्भरता जोड़ता है।
  • टेक्स्ट प्रोटोकॉल (एक्सएमएल, जेएसओएन, आदि) के साथ सॉकेट आधारित आईपीसी - ठीक काम करता है और सामान्य प्रारूप दोनों सिरों पर समर्थित होने की संभावना है, लेकिन बहुत अधिक ओवरहेड जोड़ता है। समाप्त होता है काफी कुशल, बहुत काम की जरूरत है एक कस्टम दोनों पर सही ढंग से काम प्रोटोकॉल के माध्यम से प्राप्त करने के लिए
  • संचार - हो सकता है एक दर्द कस्टम स्कीमा मैपिंग आदि
  • सॉकेट द्विआधारी प्रोटोकॉल के साथ आधारित भारतीय दंड संहिता (जैसे गूगल प्रोटोकॉल बफ़र्स) बनाए रखने के लिए एक तीसरी प्रणाली (जैसे डेटाबेस, संदेश कतार, फाइल सिस्टम) - ओवरहेड के बहुत सारे, नाजुक हो सकते हैं, एक तीसरी प्रणाली पर एक प्रमुख निर्भरता पेश करता है।

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

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

  1. एक प्राथमिक मंच
  2. उठाओ जब भी आप एक नए पुस्तकालय या सुविधा की जरूरत है, पहले अपनी प्राथमिक मंच पर कुछ के लिए देखो:

    मैं निम्नलिखित रणनीति सलाह देते हैं। उम्मीद है कि (आमतौर पर?) कुछ अच्छा उपलब्ध है - लेकिन यदि नहीं तो भी अगर आवश्यकता बहुत कम है तो यह कुछ कोडिंग के लायक हो सकता है।

  3. केवल अगर वहाँ प्राथमिक मंच पर कोई उचित विकल्प, तो आप एक नई भाषा/मंच

एकीकृत प्राथमिक मंच के संदर्भ में के बारे में सोचना शुरू कर सकते हैं, मैं आम तौर पर एक JVM भाषा सुझाव देंगे जावा, स्कैला या क्लोजर की तरह, चूंकि जेवीएम बहुत अच्छी तरह से इंजीनियर है, बहुत अच्छा प्रदर्शन प्रदान करता है, अत्यधिक पोर्टेबल है और इसमें सबसे बड़ा/सबसे समेकित लाइब्रेरी पारिस्थितिक तंत्र है (जिनमें से अधिकांश ओपन सोर्स है)। JVM जब तक आप कुछ बहुत ही विशिष्ट आवश्यकता जो JVM पर संभव हो सकता है की संभावना नहीं है, उदाहरण के लिए है इसलिए शायद सबसे अच्छा "सामान्य प्रयोजन" पसंद है:

  • आप एम्बेडेड/वास्तविक समय/प्रणालियों प्रोग्रामिंग wthat की बहुत सारी कर रहे हैं हार्डवेयर एक्सेस की आवश्यकता है जिसे आपको शायद सी/सी ++
  • पर जाना है यदि आप वेब-आधारित क्लाइंट्स के लिए पूरी तरह से कोडिंग कर रहे हैं, तो आप शायद जावास्क्रिप्ट का उपयोग करना चाहते हैं (यदि आप सर्वर पक्ष पर कोड भी लिख रहे हैं तो आप जावास्क्रिप्ट कोड जनरेशन फ्रेमवर्क पर विचार कर सकते हैं/पुस्तकालय जो JVM पर काम कर सकते हैं, उदाहरण के लिए वाडिन या क्लोजरस्क्रिप्ट)
+0

दोनों अच्छे उत्तर, लेकिन यह एक आसान है समझने के लिए Ier। मेरे अधिकांश कामों में सी/सी ++ की आवश्यकता है, मुझे लगता है कि क्यूटी पर मेरे "मंच" के रूप में शर्त लगाना सुरक्षित हो सकता है। – darasan

2

उत्तर आपके द्वारा उपयोग की जा रही तकनीकों पर काफी निर्भर करता है और इसके लिए कोई चांदी-बुलेट समाधान नहीं है।

सामान्य में, इस समाधान निम्नलिखित श्रेणियां में से एक में गिर जाएगी: कुछ interprocess संचार तकनीक

  • भाषा/मंच द्वारा प्रदान की

  • एकीकरण ही

  • डाटाबेस/कुछ सामान्य भंडारण (यहां तक ​​कि फाइलें :))

पहले का उदाहरण: सॉकेट/पाइप/जो भी आप ऑपरेटिंग सिस्टम की अनुमति देता है। कोर्बा - विभिन्न भाषाओं में वितरित कोड लिखने की अनुमति देता है। Google प्रोटोबफ - डेटा-ऑब्जेक्ट्स और इसकी भाषा अज्ञात

दूसरे के लिए क्रमशः भाषा/पारिस्थितिक तंत्र पर निर्भर करता है, जो आप उपयोग कर रहे हैं।जावा के लिए उदाहरण:

  • JNI - जावा मूल निवासी इंटरफ़ेस - JVM बाहर कोड (DLLs/तो) निष्पादित करने के लिए अनुमति देते हैं।
  • जेसीए - यदि आप एंटरप्राइज़ वातावरण में हैं - तो आप इसमें विरासत प्रणाली के साथ एकीकरण लिख सकते हैं।

भाषाओं कि मूल कोड में संकलित किया गया है के लिए अपने कम मुश्किल - आप लिख सकते हैं और कुछ कोड, पास्कल में कहते हैं कि संकलन कर सकते हैं, और फिर सी में DLL का उपयोग

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

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

आशा इस

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