2009-03-11 12 views
44

मैं एक युवा हूं इसलिए मुझे सीखने के लिए बहुत कुछ है :)
एक प्रश्न जो मेरे दिमाग पर फंस गया है: मैंने कुछ परियोजनाओं को एक परियोजना में कई भाषाओं में सुना है। मैं कल्पना नहीं कर सकता कि भाषाएं एक दूसरे के साथ कैसे बातचीत करती हैं ।एक परियोजना में एकाधिक-भाषाएं कैसे बातचीत करती हैं?

मैं वहाँ मतलब

myProgram.callCfunction(parameters); 

कभी नहीं होता है जैसे कोई जावा तरीका है .. या मैं गलत हूँ? :)

उत्तर

21

एक परियोजना में कई भाषाओं को वास्तव में काफी आम है, हालांकि पीछे के सिद्धांत हमेशा सरल नहीं होते हैं।

साधारण मामले में, अलग-अलग भाषाओं को एक ही कोड में संकलित किया जाता है। उदाहरण के लिए, सी और सी ++ कोड आमतौर पर मशीन असेंबलर या सी # और वीबी.Net में संकलित किया जाता है आईएल (एनईटी रनटाइम द्वारा समझा जाने वाली भाषा) में संकलित किया जाता है।

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

विभिन्न कार्यक्रम भाषाओं के बीच अंतर की क्लासिक उदाहरण हैं (ज्यादातर विंडोज दुनिया से):

  • विभिन्न भाषाओं नेट platfrom के लिए उपलब्ध। इसमें सी #, वीबी नेट, जे #, आयरन रूबी, एफ #, एक्सएसएलटी और कई अन्य कम लोकप्रिय भाषाएं शामिल हैं।
  • मूल निवासी COM घटकों सी में लिखे ++ या VB भाषाओं की एक विशाल विविधता के साथ प्रयोग किया जा सकता है: VBScript, वीबी, सभी नेट भाषाओं, जावा
  • Win32 एपीआई कार्यों नेट या VB
  • आईपीसी से कहा जा सकता है (इंटर प्रक्रिया संचार)
  • Corba, शायद सबसे व्यापक (और सबसे जटिल) दृष्टिकोण
  • वेब सेवाओं और अन्य सेवा उन्मुख आर्किटेक्चर, शायद सबसे आधुनिक दृष्टिकोण
+1

क्या मैं पूछ सकता हूं कि 'मूल COM घटक' क्या हैं? – Dan

+0

क्या यह बड़ी परियोजना में सी # कोड से पायथन स्क्रिप्ट को कॉल करने का एक अच्छा अभ्यास है? – amrit

+0

@amrit: यह पूरी तरह से निर्भर करता है। बेशक, एक परियोजना में प्रौद्योगिकियों को मिलाकर हमेशा एक निश्चित लागत के साथ आता है, लेकिन मौजूदा लागत को कार्यान्वित करने की लागत (फिर से) की लागत से यह लागत आसानी से अधिक हो सकती है। इसलिए मौजूदा पायथन पुस्तकालयों को सी # कोडबेस में एकीकृत करना पूरी तरह से उचित हो सकता है। –

0

यह परियोजना के प्रकार पर निर्भर करता है। यदि आप प्रयोग करना चाहते हैं, तो आप .NET में एक वेब प्रोजेक्ट सेट अप कर सकते हैं और पृष्ठ के आधार पर पृष्ठ को भाषा में बदल सकते हैं। यह आपके छद्म कोड में दिखाए जाने पर काम नहीं करता है, लेकिन यह कई भाषाओं में है। बेशक, वास्तविक कोड निर्देशिका एक एकल भाषा होना चाहिए।

6

उपयोग में कई भाषाओं को संक्षिप्त रूप से "इंटरऑपरेबिलिटी" या "इंटरऑप" कहा जाता है।

आपका उदाहरण गलत है। जावा सी कार्यों को कॉल कर सकते हैं।

भाषा इंटरऑपरेबिलिटी के लिए एक तंत्र प्रदान करती है।

.NET के मामले में, सीएलआई के हिस्से के रूप में भाषाओं को आईएल में संकलित किया जाता है। इस प्रकार किसी भी .NET भाषा किसी अन्य .NET भाषा में परिभाषित मॉड्यूल को इंटरऑप (परिभाषित कॉल विधियों) द्वारा मॉड्यूल कर सकती है।

एक उदाहरण के रूप:

मैं सी #

static void Hello(){ Console.WriteLine("Hello World");} 

में एक विधि को परिभाषित कर सकते और मैं यह अजगर (IronPython) से कॉल कर सकते हैं

Hello() 

और उम्मीद उत्पादन मिलता है।

आम तौर पर, कुछ भाषाएं दूसरों की तुलना में बेहतर होती हैं, खासकर यदि भाषा लेखकों ने विशेष रूप से भाषा की एक विशेषता को इंटरऑप किया है।

1

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

+0

ok.granted। यह एक तरीका है .. भाषाएं कैसे बातचीत कर सकती हैं। लेकिन: पाइथन प्रोग्राम कब पता चलता है, कि पार्स करने के लिए कुछ है ... और मुख्य ऐप कब जानता है, कि पार्सर अभी खत्म हो गया है? – n00ki3

+0

ठीक है, यहां एक उदाहरण है। जिस कंपनी के लिए मैंने काम किया था, उस नेटवर्क पर एक पार्सर ऐप था जिसने डेटा को पार्स करने के लिए आने वाले अनुरोधों की बात सुनी थी। पार्सर ने अभी किसी अन्य ऐप से अनुरोधों के लिए सुनी और फिर डेटा को पार्स और shoved किया। पार्सर सी में लिखा गया था, सी # में ऐप। – Carter

+0

ठीक है, समझ गया .. धन्यवाद :) – n00ki3

0

कई diffe रहे हैं आर एन टी तरीकों से आप एक परियोजना में differnt भाषाओं उपयोग कर सकते हैं दो मुख्य श्रेणियों कि

  1. मन में विभिन्न भाषाओं का एक साथ उपयोग एक आवेदन का निर्माण करने के लिए आ रहे हैं। उदाहरण के लिए जावा का उपयोग करने के लिए जीयूआई का उपयोग करना और सी एपीआई तक पहुंचने के लिए जेएनआई का उपयोग करना (इसलिए अपने प्रश्न का उत्तर देना आप जावा से सी फ़ंक्शंस को कॉल कर सकते हैं;))
  2. एक परियोजना में अलग-अलग भाषाओं का एक साथ उपयोग करना, लेकिन वे एक ही एप्लिकेशन का हिस्सा नहीं हैं । उदाहरण के लिए। मैं वर्तमान में एक आईफोन ऐप पर काम कर रहा हूं जिसने बड़ी मात्रा में टेक्स्ट का उपयोग किया है। मैं वर्तमान में तीन भाषाओं पायथन (पाठ के मूल स्रोतों के साथ काम करने के लिए) का उपयोग कर रहा हूं, एसक्यूएल (पाइथन ऐप के परिणाम को आईफोन स्क्लाइट 3 एपीआई से आसानी से एक्सेसिबल में प्रारूपित करने के लिए) और ऑब्जेक्टिव सी को वास्तविक ऐप बनाने के लिए उपयोग कर रहा हूं। हालांकि अंतिम उत्पाद केवल उद्देश्य सी होगा, मैंने अंतिम उत्पाद
0

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

इसके अलावा कई अन्य तरीके हैं जिनमें भाषाएं एक-दूसरे से बात कर सकती हैं। .NET वर्ल्ड कोड में आईएल कोड में संकलित किया गया है, जो हर भाषा के लिए समान है, इस तरह सी #, वीबी.Net हुड के नीचे समान हैं और एक दूसरे के साथ सहजता से कॉल/काम कर सकते हैं।

1

कई तरीकों से एक परियोजना में कई भाषाओं का उपयोग किया जा सकता है। कुछ उदाहरण:

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

बदसूरत। यदि कोई जरूरी आवश्यकता नहीं है, तो एक ही भाषा में रहें। आप निर्भरता और जटिलता में वृद्धि कर रहे हैं। लेकिन जब आपके पास मौजूदा कार्यक्षमता दिलचस्प कार्यक्षमता प्रदान करती है, तो इसे फिर से बनाने के बजाय इसे एक साथ चिपकाना आसान हो सकता है।

0

बस उदाहरणों की सूची में जोड़ने के लिए, सी या सी ++ में पायथन कोड को अनुकूलित करने के लिए काफी आम है या पाइथन में दूसरी लाइब्रेरी को बांधने के लिए सी लाइब्रेरी लिखें।

10

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

(यह निश्चित रूप से एचटीएमएल और सीएसएस प्रोग्रामिंग भाषाओं के रूप में गिनती है या नहीं, इस बारे में तर्क को दूर करना - मैं हूं "वे हैं, लेकिन सिर्फ ट्यूरिंग-पूर्ण भाषा नहीं" शिविर, लेकिन यह एक है पूरे अन्य धागा)

कैसे उन सभी एक साथ काम के कुछ उदाहरण:।

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

यह सब कुछ एक कदम आगे लेते हुए, उस पृष्ठ पर किसी भी जावास्क्रिप्ट स्क्रिप्ट्स मौजूद एचटीएमएल/सीएसएस को बदल सकते हैं (एचटीएमएल इकाइयों की सामग्री बदलें, एक सीएसएस वर्ग को दूसरे के लिए स्वैप करें, सीएसएस के व्यवहार को बदलें, और इसी तरह।) यह दस्तावेज़ ऑब्जेक्ट मॉडल नामक किसी चीज़ के माध्यम से करता है, जो अनिवार्य रूप से एक भाषा और मंच-स्वतंत्र एपीआई है जो एचटीएमएल पृष्ठों को ऑब्जेक्ट-जैसी तरीके से छेड़छाड़ करने के लिए है (जिस बिंदु पर मैं धीरे-धीरे वापस आऊंगा और केवल एक प्रदान करूंगा relevant wiki article से लिंक करें।)

लेकिन फिर, सभी HTML/CSS/जावास्क्रिप्ट कहां से आते हैं? सर्वर-साइड भाषा यही है। सबसे सरल रूप में, सेरर-साइड भाषा एक ऐसा प्रोग्राम है जो एक HTML स्ट्रिंग को अपने आउटपुट के रूप में रखते हुए एक विशाल स्ट्रिंग देता है। यह स्पष्ट रूप से, अधिक जटिल हो सकता है: एचटीएमएल फॉर्म और क्वेरी स्ट्रिंग पैरामीटर हमारे सर्वर साइड प्रोग्राम के लिए इनपुट के रूप में उपयोग किए जा सकते हैं, और फिर आपके पास पूरी AJAX चीज है जहां जावास्क्रिप्ट सीधे सर्वर भाषा में डेटा भेजता है। आप कल्पना भी प्राप्त कर सकते हैं जहां सर्वर भाषा एचटीएमएल, सीएसएस, और जावास्क्रिप्ट को अनुकूलित कर सकती है जो थूक जाती है - अनिवार्य रूप से, आपके पास एक भाषा में एक प्रोग्राम है जो किसी अन्य भाषा में प्रोग्राम लिखता है।

एसक्यूएल कनेक्शन के लिए सर्वर-साइड भाषा बहुत समान काम करती है। इसे और अधिक जटिल और सुरक्षित बनाने के कई तरीके हैं, लेकिन सबसे सरल तरीका यह है कि आपकी सर्वर भाषा गतिशील रूप से एक एसक्यूएल कमांड के साथ एक स्ट्रिंग बनाने के लिए है, किसी भी प्रकार के कनेक्टर के माध्यम से डेटाबेस को सौंपें, और वापस आएं एक परिणाम सेट। (यह एक मामले में जहां आप वास्तव में एक समारोह है कि someValue = database.executeThisSQLCommand (SQLString) करने पर निर्भर करता है है।)

तो इस मामले में यह ऊपर विभिन्न भाषाओं लपेट, या तो वास्तव में एक दूसरे में कार्यक्रमों लिख कर बातचीत करने के लिए , या प्रारूपों को पार्स करने के लिए बहुत आसान आसान डेटा को सौंपकर जो सभी समझ सकते हैं। (स्ट्रिंग्स, मुख्य रूप से।)

+0

जब तक आप रत्न (ग्लास) स्मॉलटॉक पर समुद्रतट का उपयोग नहीं कर रहे हैं। यह सर्वर-साइड भाषा में सबकुछ करके परिमाण की बेहतर उत्पादकता का क्रम प्राप्त करता है। –

0

मैं एक बड़ी उद्यम परियोजना पर काम करता हूं जिसमें लगभग 8 भाषाओं (अंतिम गणना में) शामिल है। अधिकांश संचार एक एंटरप्राइज़ लेवल मैसेज बस के माध्यम से होता है जिसमें कई भाषाओं के लिए बाइंडिंग होती है ताकि डेटा को पीछे और आगे टैप किया जा सके। इसे tibco कहा जाता है।

4

एकाधिक भाषाओं बातचीत कर सकते हैं साथ:

  1. पाइप्ड इनपुट/आउटपुट (किसी भी भाषा इस कर सकते हैं क्योंकि इनपुट और आउटपुट आवश्यकता से प्रत्येक गैर-खिलौना में लागू किया जाना चाहिए भाषा)
  2. होने कोड में एक भाषा मूल पुस्तकालय पर संकलित करती है जबकि अन्य मूल कोड को कॉल करने का समर्थन करता है।
  3. लूपबैक नेटवर्क कनेक्शन पर संचार करना। आप इस तरह फ़ायरवॉल हस्तक्षेप के साथ कठिनाइयों में भाग सकते हैं।
  4. डेटाबेस। इन्हें "सार्वभौमिक" डेटा स्टोरेज प्रारूप के रूप में माना जा सकता है, और इसलिए डेटाबेस एक्सटेंशन के साथ अधिकांश भाषाओं तक पहुंचा जा सकता है। यह आमतौर पर के लिए अगले प्रोग्राम डेटाबेस तक पहुंचने से पहले एक प्रोग्राम को ऑपरेशन समाप्त करने की आवश्यकता होती है। इसके अलावा, सभी 'संचार' आमतौर पर डिस्क पर लिखे गए हैं।
  5. यदि भाषाएं एक ही रनटाइम पर चलती हैं (यानी .NET, JVM), तो आप आम तौर पर एक भाषा से वस्तु डेटा को थोड़ा बाधा के साथ पास कर सकते हैं।

लगभग हर मामले में, आप एक आम प्रारूप करने के लिए किसी भी संचार कन्वर्ट करने के लिए इससे पहले कि यह आदान-प्रदान किया जा सकता है (अपवाद एक ही क्रम पर भाषाओं है) है। यही कारण है कि कई भाषाओं का शायद ही कभी प्रोजेक्ट में उपयोग किया जाता है।

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