2010-05-02 29 views
11

काफी-शायद एक मूर्खतापूर्ण सवाल है, मैं जावा/Jython/JRuby/बाईटकोड के बारे में ज्यादा पता नहीं है के रूप में है, लेकिन ..रूबी/पायथन इंटरऑपरेबिलिटी के लिए जेआरबी/जेथन का उपयोग करना?

मैं _why's unholy भर में ठोकर खाई आज फिर .. यह आप रूबी कोड से उत्पादन अजगर बाईटकोड लिए अनुमति देता है .. मूल रूप से उन्हें एक ही बाइटकोड का उत्पादन करने की इजाजत देता है ..

जेथॉन जावा बाइटकोड आउटपुट करता है, जैसा कि जेआरबीई करता है .. चूंकि ये दोनों एक ही बाइटकोड से संकलित होते हैं, इसका मतलब यह है कि आप संभावित रूप से रूबी और रूबी से किसी भी पायथन लाइब्रेरी का उपयोग कर सकते हैं पायथन से पुस्तकालय?

+0

+1 एक दिलचस्प प्रश्न के लिए +1 ... – ChristopheD

+1

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

उत्तर

7

नहीं, यह काम नहीं करेगा। कम से कम जिस तरह से आपको लगता है कि यह नहीं होगा।

जेथन और जेआरबी के बीच इंटरऑपरेबिलिटी उसी तरह काम करती है जैसे सीपीथन और याएआरवी: वे दोनों एक ही मंच पर चलते हैं, इसलिए वे उस प्लेटफ़ॉर्म का उपयोग करके एक दूसरे के साथ संवाद कर सकते हैं।

सीपीथॉन और याएआरवी के मामले में, वह मंच सी/पॉज़िक्स है, इसलिए वे सी structs, int एस, char* एस और सी फ़ंक्शन कॉल का उपयोग करके एक दूसरे के साथ संवाद कर सकते हैं। ज्योथन और जेआरबी के मामले में, वह मंच जेवीएम है, इसलिए वे एक दूसरे के साथ जेवीएम ऑब्जेक्ट्स, जेवीएम कक्षाएं, जेवीएम इंटरफेस, जेवीएम प्रकार और जेवीएम विधियों का उपयोग कर संवाद कर सकते हैं।

दोनों मामलों में, उन प्लेटफ़ॉर्म प्राइमेटिव्स कुछ भी जैसे पायथन या रूबी ऑब्जेक्ट्स को देखते हैं।

जेआरबी के लिए, ज्योथन अभी तक एक और जावा प्रोग्राम है। ज्योथन के लिए, जेआरबीई सिर्फ एक और जावा प्रोग्राम है।

उदाहरण के लिए: रुबी में, आप किसी भी समय गतिशील रूप से विधियों को जोड़, हटा और फिर से परिभाषित कर सकते हैं। जेवीएम पर, कोड की सबसे छोटी इकाई जिसे गतिशील रूप से जोड़ा और हटाया जा सकता है वह एक वर्ग है। इसलिए, रूबी विधि वास्तव में जावा विधि के रूप में प्रदर्शित नहीं होती है।इसे जावा वर्ग के रूप में दर्शाया गया है। और तार्किक रूप से, कुछ विधियों के साथ रूबी ऑब्जेक्ट को किसी भी विधि के साथ जावा ऑब्जेक्ट के रूप में दर्शाया जाता है, केवल Dictionary<String, RubyMethod> फ़ील्ड। IOW: यह जावा से पूरी तरह से अनुपयोगी है, और, JRuby के दृष्टिकोण से Jython सिर्फ जावा है, यह भी ज्योथन से अनुपयोगी है।

अब, हैं जो इसे थोड़ा बेहतर बनाने के तरीके हैं। आप दो   – दोनों के बीच संवाद करने के लिए वास्तविक जावा प्रकारों का उपयोग कर सकते हैं दोनों कार्यान्वयन जावा के साथ बहुत इंटरऑपरेबिलिटी है। तो, रूबी हैश को पाइथन या रूबी के लिए पाइथन शब्दकोश से गुजरने के बजाय, आप रुबी और पायथन दोनों से जावा Map का उपयोग करेंगे। लेकिन ध्यान दें कि दोनों आपके रूबी और पायथन कोड विशेष रूप से JVM पर काम करने के लिए लिखे गए हैं। IOW: आप वेब पर मिलने वाली किसी भी पायथन या रूबी लाइब्रेरी का उपयोग नहीं कर सकते हैं, जो आप पूछ रहे हैं।

एक अन्य संभावना है जिसका उल्लेख @ डंकन द्वारा उनके उत्तर में किया गया है: अपने रूबी या पायथन एप्लिकेशन में एक स्क्रिप्टिंग इंजन के रूप में ज्योथन या जेआरबी को एम्बेड करें। लेकिन फिर, यह वास्तव में रूबी से मनमाने ढंग से पाइथन पुस्तकालयों या इसके विपरीत उपयोग करने के बारे में आपके प्रश्न का उत्तर नहीं देता है।

तो, यहां समस्या क्या है?

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

तो, हमें एक आम भाषा खोजने की आवश्यकता है। ऐसी भाषा को परिभाषित करने का एक तरीका एक दूसरे के मेटा-ऑब्जेक्ट प्रोटोकॉल (एमओपी) को समझने के लिए रनटाइम दोनों के लिए होगा।

एक एमओपी मूल रूप से भाषा के ऑब्जेक्ट मॉडल के लिए एक ऑब्जेक्ट मॉडल है। उम, यह भ्रमित है क्योंकि हम "ऑब्जेक्ट मॉडल" शब्द का उपयोग दो अलग-अलग चीजों के लिए करते हैं। मुझे इसे दोबारा दोहराएं:

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

आम तौर पर, प्रत्येक रनटाइम अपना एमओपी निजी रखता है, और प्रत्येक रनटाइम का अपना एमओपी होता है।

तो JRuby और Jython एक दूसरे के लिए उनके मॉप अवगत कराया और एक दूसरे की मॉप समझा (या और भी बेहतर अभी तक: वे JVM करने के लिए अपने मॉप उजागर किया है और दोनों का उपयोग किया ही एमओपी), तो आप उन में से एक गुजर सकता है पाइजी जेआरबी विधि बैग ज्योथन को, और यह पता चलेगा कि उस ऑब्जेक्ट से संबंधित विधियों को कैसे ढूंढें और उन्हें कैसे कॉल करें, क्योंकि यह सिर्फ जेआरबी के एमओपी से यह कैसे पूछ सकता है।

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

यदि आप इस तरह के एक साझा एमओपी के साथ एक दुनिया की तरह दिखने के लिए एक चुपके की तलाश करना चाहते हैं, तो आप माइक्रोसॉफ्ट के डायनामिक लैंग्वेज रनटाइम (डीएलआर) पर एक नज़र डाल सकते हैं। डीएलआर में ऐसे एमओपी और सभी रनटाइम्स शामिल हैं जो डीएलआर का समर्थन करते हैं (जो, IronRuby, IronPython, IronJS और IronScheme में सामान्य संदिग्धों के अलावा अब सी # 4 और विजुअल बेसिक .NET 10 भी शामिल है) लगभग प्रत्येक के साथ सहजता से इंटरऑपरेट कर सकते हैं अन्य।

एक और समान प्लेटफ़ॉर्म Parrot Virtual Machine है, जिसे विशेष रूप से एक ही रनटाइम प्लेटफ़ॉर्म पर कई गतिशील भाषाओं को इंटरऑपरेट करने की अनुमति देने के लिए डिज़ाइन किया गया था। पाइथन (Pynie) और रूबी (Cardinal) के कार्यान्वयन उपलब्ध हैं, लेकिन विशेष रूप से कार्डिनल अभी भी एक दूरस्थ रूप से पूर्ण रूबी कार्यान्वयन होने से बहुत दूर है।

5

ऐसा करने के दो तरीके हैं। दोनों कोड को स्थिर रूप से संकलित करने और स्क्रिप्ट से वास्तविक जावा क्लास बनाने की क्षमता प्रदान करते हैं। इस मामले में ज्योथन AFAIK जावा स्रोत कोड उत्पन्न करता है और फिर jythonc स्क्रिप्ट के माध्यम से javac को कॉल करता है। लेकिन इसके लिए संकलन की आवश्यकता है।

दोनों दुभाषियों के लिए, आप जावा कोड को स्क्रिप्ट से कॉल कर सकते हैं, और आप जावा एप्लिकेशन में दुभाषिया को एम्बेड कर सकते हैं।

उदाहरण के लिए, अजगर से जावा फोन करने के लिए:

>>> from java.util import Random 
>>> r = Random() 
>>> r.nextInt() 
501203849 

जावा में JRuby दुभाषिया एम्बेड करने के लिए, आप कर सकते हैं (ध्यान दें, वहाँ एक JSR223 आधारित रास्ता भी है, इस कोर से एक है):

package vanilla; 

import org.jruby.embed.ScriptingContainer; 

public class HelloWorld { 

    private HelloWorld() { 
     ScriptingContainer container = new ScriptingContainer(); 
     container.runScriptlet("puts Hello world"); 
    } 

    public static void main(String[] args) { 
     new HelloWorld(); 
    } 

आप (मुझे लगता है कि आप JRuby पथ सही ढंग से देने के लिए की आवश्यकता होगी) Jyton से एक ही कर सकता है:

import org.jruby.embed.ScriptingContainer 
container = ScriptingContainer() 
container.runScriptlet("puts Hello world") 

वही अन्य तरीकों से किया जा सकता है।

आपको आयात करके पाइथन दुभाषिया को निर्यात किए गए पूरे रूबी स्टडीलिब को नहीं मिलेगा। आपको पहले से बाइटकोड में रूबी के stdlib precompile करने की आवश्यकता होगी।

हालांकि ऊपर वर्णित तकनीक के साथ, और कुछ सहायक स्क्रिप्ट और परिभाषित इंटरफेस जोड़ने के साथ, आप एक भाषा से दूसरे भाषा में विशिष्ट कार्यक्षमता को पुल कर सकते हैं।