2011-03-26 8 views
15

विभिन्न प्रोग्रामिंग भाषाओं को मिलाकर ऐसा कुछ रहा है जो मुझे समझ में नहीं आता है। this Wikipedia article, एक विदेशी समारोह इंटरफेस (या FFI) के अनुसार कई तरह से किया जा सकता है:विदेशी फ़ंक्शन इंटरफ़ेस (एफएफआई) और भाषा बाध्यकारी को समझें

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

मेरे सवालों का:

  1. क्या , 1 2 और 3 तरीके के बीच मतभेद रहे हैं? ऐसा लगता है कि मुझे वे कोड को कुछ लाइब्रेरी में ऑब्जेक्ट फाइलों और हेडर फ़ाइलों के साथ संकलित करने के लिए हैं, जिन्हें कॉलिंग भाषा द्वारा बुलाया जाता है।
  2. One source it links कहते हैं, एक FFI को लागू करने कई तरह से किया जा सकता है:

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

    मैं सोच रहा था अगर जुड़ा हुआ स्रोत में पहला तरीका विकिपीडिया में पहला रास्ता के रूप में ही है?

    इस स्रोत का तीसरा तरीका क्या है? क्या यह विकिपीडिया में चौथे रास्ते से मेल खाता है?

  3. the same source में, जब तीन तरीकों में सूचीबद्ध करता है तुलना करते समय, कहना दो भाषाओं के बीच की खाई को भरने का काम धीरे-धीरे बुलाया भाषा बुला भाषा के लिए से स्थानांतरित है लगता है। मैं सोच रहा था कि उसे कैसे समझें? विकिपीडिया में चार तरीकों से यह स्थानांतरण भी सच है?
  4. Language binding और एफएफआई समकक्ष अवधारणाएं हैं? वे संबंधित और भिन्न कैसे हैं?

    एक लाइब्रेरी या ओएस सेवा करने के लिए एक प्रोग्रामिंग भाषा से बाध्यकारी एक API भाषा में है कि सेवा प्रदान कर रहा है।

  5. मैं सोच रहा था कि विकिपीडिया से उद्धरण में या स्रोत से निम्नलिखित में से प्रत्येक उदाहरण किस प्रकार से संबंधित है?

    • Common Object Request Broker Architecture (CORBA)
    • C++ सी, निर्वासन 'सी' सी में अक्षम नाम mangling को घोषणा ++ द्वारा कॉलिंग।
    • , मैटलैब में सी कॉलिंग MATLAB Interface to Shared Libraries से, यानी, पहले, सामान्य सी के माध्यम से साझा लाइब्रेरी में सी कोड संकलन इस तरह जीसीसी के रूप में संकलक, और फिर लोड हो रहा है से एक समारोह बुला और Matlab कार्यों LoadLibrary के माध्यम से साझा पुस्तकालय उतारने(), कॉललिब() और unloadlibrary()।
    • JNI
    • अन्य भाषाओं में कॉलिंग C/C++ द्वारा, मैटलैब में सी कॉलिंग, Creating C/C++ Language MEX-Files
    • सी में मैटलैब कॉलिंग द्वारा, mcc compiler
    • सी ++ जावा में कॉलिंग द्वारा JNI द्वारा, और सी में जावा कॉलिंग ++ भी
    • पाइथन में कॉलिंग सी Ctypes module का उपयोग करना।
    • Cython
    • अजगर में आर कॉलिंग, RPy
    • Programming Language Bindings to OpenGL from various languages, इस तरह के अजगर, फोरट्रान और जावा एक सी पुस्तकालय के लिए
    • बाइंडिंग के रूप में से, इस तरह के रूप Cairo, विभिन्न भाषाओं से, जैसे C++ पायथन के रूप में, जावा, आम लिस्प

अपने enlightment के लिए धन्यवाद! सबसे अच्छा संबंध!

उत्तर

13

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

  1. पहला विकल्प सी पुस्तकालय को किसी विशेष तरीके से लिखना है। पायथन के मामले में मानक तरीके से अन्य परिस्थितियों में Py_Object * के पहले पैरामीटर के साथ सी फ़ंक्शन लिखा जाना चाहिए। उदाहरण (from here) के लिए:

    static PyObject * 
    spam_system(PyObject *self, PyObject *args) 
    { 
        const char *command; 
        int sts; 
    
        if (!PyArg_ParseTuple(args, "s", &command)) 
         return NULL; 
        sts = system(command); 
        return Py_BuildValue("i", sts); 
    } 
    

    एक सी समारोह अजगर से प्रतिदेय है। इसके लिए पुस्तकालय को काम करने के लिए पाइथन संगतता के साथ लिखा जाना चाहिए।

  2. यदि आप पहले से मौजूद सी पुस्तकालय का उपयोग करना चाहते हैं, तो आपको एक और विकल्प चाहिए। एक ऐसा उपकरण है जो मेजबान भाषा द्वारा खपत के लिए उपयुक्त प्रारूप में इस मौजूदा लाइब्रेरी को लपेटता है। Swig लें जिसका उपयोग कई भाषाओं को जोड़ने के लिए किया जा सकता है।मौजूदा सी लाइब्रेरी को देखते हुए आप प्रभावी रूप से सी कोड उत्पन्न करने के लिए स्विग का उपयोग कर सकते हैं जो पाइथन सम्मेलनों के अनुरूप आपकी मौजूदा लाइब्रेरी को कॉल करता है। पाइथन मॉड्यूल के निर्माण के लिए the example देखें।

  3. हमारे लिए पहले से मौजूद सी लाइब्रेरी का एक और विकल्प इसे एक पायथन पुस्तकालय से कॉल करना है जो ctypes जैसे रन टाइम पर कॉल को प्रभावी रूप से लपेटता है। जबकि विकल्प 2 संकलन आवश्यक था, यह इस समय नहीं है।

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

अपनी सूची में एक जाना के बाद, मैं निम्नलिखित राय उद्यम होगा:

  • आम वस्तु अनुरोध ब्रोकर वास्तुकला: आईपीसी, नहीं FFI
  • , C++ सी कॉलिंग सी में extern "C" घोषणा द्वारा ++ नाम उलझन अक्षम करने के लिए। ****
  • मैटलैब में सी, कॉलिंग साझा पुस्तकालय विकल्प 3 (ctypes की तरह)
  • मैटलैब में सी कॉलिंग, सी बनाना द्वारा/सी ++ भाषा MEX-फ़ाइलें विकल्प 2 (swig- को MATLAB इंटरफ़ेस द्वारा की तरह)
  • सी में मैटलैब, कॉलिंग एमसीसी संकलक द्वारा विकल्प 2 (बड़ा घूँट की तरह)
  • C++ कॉलिंग जावा में, JNI से, और C++ में जावा कॉलिंग JNI द्वारा विकल्प 3 (ctypes की तरह)
  • अन्य भाषा में सी/सी ++ को कॉल करना रों, का उपयोग करना बड़ा घूँट विकल्प 2 (बड़ा घूँट) पायथन में
  • कॉलिंग सी, ctypes द्वारा विकल्प 3 (ctypes)
  • Cython विकल्प 2 (बड़ा घूँट की तरह) पायथन में
  • कॉलिंग आर, द्वारा RPy विकल्प 3 (ctypes की तरह) भाग में, और आंशिक रूप से डेटा विनिमय (नहीं FFI)

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

  • भाषा बाइंडिंग प्रोग्रामिंग विभिन्न भाषाओं
+0

+1 अच्छा जवाब से विभिन्न भाषाओं से एक सी पुस्तकालय के लिए

  • बाइंडिंग ओपन करने के लिए। एक नोट: "मैक्सबैक बनाने में MATLAB में कॉलिंग सी" "विकल्प 1" की तरह है, यह अपने सी एपीआई का उपयोग करके एक पायथन एक्सटेंशन लिखने के बराबर है। आप एक विशेष गेटवे दिनचर्या के साथ एक नियमित साझा लाइब्रेरी बनाते हैं जो 'mxArray * 'पैरामीटर प्राप्त करता है। "एमसीसी कंपाइलर का उपयोग कर सी में MATLAB को कॉल करने" के लिए, यह वास्तव में एफएफआई नहीं है क्योंकि यह केवल सी कोड को अन्य सी कोड कॉल कर रहा है (एमसीसी कंपाइलर नियमित साझा पुस्तकालय उत्पन्न करता है)। – Amro

  • +0

    एक अन्य विकल्प जिसका उल्लेख नहीं किया गया था "MATLAB इंजन का उपयोग कर सी में MATLAB को कॉल करना" है, जो जारी रखने के लिए ["पायथन एम्बेडिंग"] (http://docs.python.org/2/extending/embedding.html) के समान है समानता (जेएनआई इंटरफ़ेस का उपयोग कर जावा में सी को कॉल करने के समान) – Amro

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