विदेशी कार्य अंतराफलक

एक विदेशी प्रकार्य अंतरापृष्ठ (FFI) एक ऐसा तंत्र है जिसके द्वारा एक प्रोग्राम लिखा गया है, समान्यतः एक व्याख्या की गई (प्रोग्रामिंग भाषाएं), जो दिनचर्या को मिला सकती है या किसी अन्य में लिखी या संकलित सेवाओं का उपयोग कर सकती है। FFI का उपयोग प्रायः संदर्भ में किया जाता है जहां बाइनरी सक्रिय-लिंक लाइब्रेरी को मिलाकर गतिशील-लिंक पुस्तकालय में बनाया जाता है।

नामकरण
यह शब्द कामन लिस्प के लिए विनिर्देश से आता है, जो स्पष्ट रूप से प्रोग्रामिंग भाषा सुविधा को संदर्भित करता है जैसे कि अंतर-भाषा कॉल के लिए सक्षम होता है; इस शब्द का उपयोग प्रायः हास्केल (प्रोग्रामिंग भाषा), रस्ट (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), और लुजीत  लुआ (प्रोग्रामिंग भाषा)  दुभाषिया और संकलक प्रलेखन द्वारा अधिकारिक रूप से किया जाता हैं।। अन्य भाषाएं अन्य शब्दावली का उपयोग करती हैं: ADA प्रोग्रामिंग भाषा "भाषा बंधन" के बारे में बात करती है, जबकि जावा (प्रोग्रामिंग भाषा) अपने FFI  को JNI (जावा नेटिव इंटरफ़ेस ) या JNA (जावा नेटिव एक्सेस) के रूप में संदर्भित करता है। ऐसी सेवाएं प्रदान करने वाले तंत्रों के लिए विदेशी प्रकार्य अंतरापृष्ठ समान्य शब्दावली बन गया है।

ऑपरेशन
एक विदेशी प्रकार्य अंतरापृष्ठ का प्राथमिक कार्य एक प्रोग्रामिंग भाषा (मेजबान भाषा, या भाषा जो FFI को परिभाषित करता है) के शब्दार्थ और सम्मेलनों (अतिथि भाषा) के शब्दार्थ और सम्मेलनों के साथ शब्दार्थ और सम्मेलनों को मिलना है। इस प्रक्रिया को दोनों के रनटाइम वातावरण और/या अनुप्रयोग द्विआधारी अंतरापृष्ठ को भी ध्यान में रखना चाहिए। यह कई मायनों में किया जा सकता है:


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

FFI निम्नलिखित विचारों से जटिल हो सकता है:


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

भाषा द्वारा
FFI के उदाहरणों में शामिल हैं:

इसके अलावा, कई FFI को स्वचालित रूप से उत्पन्न किया जा सकता है: उदाहरण के लिए, SWIG।हालांकि, एक एक्सटेंशन भाषा के स्थितियाँ  में अतिथि और मेजबान के रिश्ते का एक शब्दार्थ उलटा हो सकता है, जब एक्सटेंशन भाषा का एक छोटा शरीर मेजबान भाषा के बड़े शरीर में अतिथि आमंत्रित सेवाएं हैं, जैसे कि एक छोटा प्लगइन लिखना जिम्प के लिए। कुछ FFI मुक्त खड़े सबरूटीनों तक सीमित हैं, जबकि अन्य किसी वस्तु या वर्ग में एम्बेडेड कार्यों की कॉल की भी अनुमति देते हैं (जिसे प्रायः  विधि कॉल कहा जाता है);कुछ भी जटिल डेटाटाइप्स और/या वस्तुओं की भाषा सीमा के पार की अनुमति देते हैं।
 * एडीए (प्रोग्रामिंग भाषा) भाषा बाइंडिंग, न केवल विदेशी कार्यों को कॉल करने की अनुमति देता है, बल्कि गैर-पीएडी कोड से इसके कार्यों और तरीकों को निर्यात करने के लिए भी निर्यात करता है।
 * C ++ में C (प्रोग्रामिंग भाषा) के साथ एक तुच्छ FFI है, क्योंकि भाषाएं एक महत्वपूर्ण सामान्य सबसेट साझा करती हैं।का प्राथमिक प्रभाव extern "C" C ++ में घोषणा C ++ नाम mangling को अक्षम करना है।
 * स्वच्छ (प्रोग्रामिंग भाषा) C (प्रोग्रामिंग लैंग्वेज) या STDCALL कॉलिंग कन्वेंशन के बाद सभी भाषाओं के साथ एक द्विदिश FFI प्रदान करता है।
 * कॉमन लिस्प
 * संकलित देशी अंतरापृष्ठ, GNU कंपाइलर वातावरण में उपयोग किए जाने वाले JNI का विकल्प।
 * घटक वस्तु मॉडल के आधारों में से एक एक सामान्य अंतरापृष्ठ प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए विजुअल बेसिक के समान प्रकार का उपयोग करता है।
 * डी (प्रोग्रामिंग भाषा) इसे उसी तरह करता है जैसे कि C ++ करता है, बाहरी C के साथ बाहरी (C ++) के माध्यम से
 * डार्ट (प्रोग्रामिंग भाषा) में DART: FFI शामिल है मोबाइल, कमांड-लाइन और सर्वर एप्लिकेशन के लिए देशी सी (प्रोग्रामिंग भाषा) कोड को कॉल करने के लिए लाइब्रेरी
 * गतिशील भाषा, जैसे कि पायथन (प्रोग्रामिंग लैंग्वेज), पर्ल, आविष्कार, और  रूबी प्रोग्रामिंग भाषा , सभी सी/सी ++ (या किसी अन्य भाषा में सी/सी ++ कॉलिंग कन्वेंशन) में लिखे गए देशी कोड तक आसान पहुंच प्रदान करते हैं।
 * कारक (प्रोग्रामिंग भाषा) के लिए ffis है, Fortran, उद्देश्य-c, और windows com;ये सभी आयात करने और मनमानी साझा पुस्तकालयों को गतिशील रूप से कॉल करने में सक्षम बनाते हैं।
 * Fortran 2003 में एक मॉड्यूल ISO_C_BINDING है जो इंटरऑपरेबल डेटा प्रकार (आंतरिक प्रकार और POD संरचनाएं दोनों), इंटरऑपरेबल पॉइंटर्स, इंटरऑपरेबल पॉइंटर्स, इंटरऑपरेबल ग्लोबल डेटा स्टोर, और फोरट्रान से C को कॉल करने के लिए और C. Fortran को कॉल करने के लिए प्रदान करता है। इसे फोरट्रान 2018 मानक में सुधार किया गया है।
 * गो (प्रोग्रामिंग भाषा) सीधे सी कोड को कॉल कर सकता है  छद्म-पैकेज।
 * Google वेब टूलकिट, जिसमें जावा को जावास्क्रिप्ट में संकलित किया गया है, में एक FFI है जिसे जेएसएनआई कहा जाता है जो जावा स्रोत को मनमाने ढंग से जावास्क्रिप्ट कार्यों को कॉल करने की अनुमति देता है, और जावास्क्रिप्ट के लिए जावा में वापस कॉल करने के लिए।
 * हास्केल (प्रोग्रामिंग भाषा)
 * जावा देशी अंतरापृष्ठ, जो जावा (प्रोग्रामिंग भाषा) और C/C ++ के बीच एक अंतरापृष्ठ प्रदान करता है, अधिकांश प्रणालियों पर पसंदीदा सिस्टम भाषाएँ जहां जावा तैनात हैं।जावा देशी एक्सेस गोंद कोड लिखने के बिना देशी पुस्तकालयों के साथ एक अंतरापृष्ठ  प्रदान करता है।एक अन्य उदाहरण है jnr
 * Luajit, एक जस्ट-इन-टाइम संकलन | Lua (प्रोग्रामिंग भाषा) का सिर्फ-इन-टाइम कार्यान्वयन, एक FFI है जो बाहरी C प्रकार्य को कॉल करने और शुद्ध Lua कोड से C डेटा संरचनाओं का उपयोग करने की अनुमति देता है।
 * NIM (प्रोग्रामिंग लैंग्वेज) में एक FFI है जो इसे C (प्रोग्रामिंग लैंग्वेज), C ++ (प्रोग्रामिंग लैंग्वेज) से स्रोत का उपयोग करने में सक्षम बनाता है। C ++, और ऑब्जेक्टिव-C (प्रोग्रामिंग लैंग्वेज) | ऑब्जेक्टिव-सी।यह जावास्क्रिप्ट के साथ अंतरापृष्ठ भी कर सकता है।
 * जावास्क्रिप्ट: जावास्क्रिप्ट समान्यतः वेब ब्राउज़र के अंदर चलाया जाता है
 * Node.js पूर्व -खोलने के लिए कार्य प्रदान करता है .node बदले में मॉड्यूल गैर-बिल्टिन संसाधनों तक पहुंच प्रदान कर सकते हैं।
 * डेनो (सॉफ्टवेयर), के माध्यम से FFI अंतरापृष्ठ  की तरह प्रदान करता है dlopen(...) कार्य।
 * जूलिया (प्रोग्रामिंग भाषा) है  C (और अन्य भाषाओं, उदा। Fortran) को कॉल करने के लिए कीवर्ड; जबकि पैकेज, समान नो-बोइलरप्लेट समर्थन प्रदान करते हैं, कुछ भाषाओं के लिए उपलब्ध हैं उदा।पायथन के लिए (उदा। OO समर्थन और GC समर्थन  पीएचपी ्रदान करने के लिए), जावा (और अन्य JDK-Languages, जैसे SCALA का समर्थन करता है) और C ++ के साथ R. इंटरएक्टिव उपयोग CXX.JL पैकेज के साथ भी संभव है।
 * PhoneGap (अपाचे कॉलबैक नाम से कहा गया था, लेकिन अब अपाचे कॉर्डोवा) HTML, CSS और जावास्क्रिप्ट का उपयोग करके देशी मोबाइल एप्लिकेशन बनाने के लिए एक मंच है।इसके अतिरिक्त FFI एस के माध्यम से जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए प्रकार्य है, जिसमें एक्सेलेरोमीटर, कैमरा (साथ ही फोटोलिब्ररी और सेवफोटोबम), कम्पास, स्टोरेज (एसक्यूएल डेटाबेस और लोकलस्टोरेज), अधिसूचना, मीडिया और कैप्चर (रिकॉर्डिंग और रिकॉर्डिंग या ऑडियो भी शामिल हैं।और वीडियो), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी।
 * PHP FFI को C को प्रदान करता है।
 * पायथन (प्रोग्रामिंग भाषा) ctypes और cffi मॉड्यूल प्रदान करता है।उदाहरण के लिए, CTYPES मॉड्यूल साझा लाइब्रेरी/डायनेमिक-लिंक लाइब्रेरी से सी फ़ंक्शंस को लोड कर सकता है और पायथन और सी शब्दार्थ के बीच स्वचालित रूप से सरल डेटा प्रकारों का अनुवाद कर सकता है:
 * P/invoke, जो Microsoft सामान्य भाषा रनटाइम  और देशी कोड के बीच एक अंतरापृष्ठ  प्रदान करता है।
 * रैकेट भाषा (प्रोग्रामिंग भाषा) में मैक्रोज़ पर एक देशी FFI  आधारित है जो मनमानी साझा पुस्तकालयों को गतिशील रूप से आयात करने में सक्षम बनाता है।
 * RAKU (प्रोग्रामिंग लैंग्वेज) रूबी (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग लैंग्वेज),  पर्ल (प्रोग्रामिंग भाषा) , ब्रेनफक (प्रोग्रामिंग लैंग्वेज), लुआ (प्रोग्रामिंग लैंग्वेज), सी (प्रोग्रामिंग लैंग्वेज), C ++, GO (प्रोग्रामिंग लैंग्वेज (प्रोग्रामिंग लैंग्वेज), C (प्रोग्रामिंग लैंग्वेज), C (प्रोग्रामिंग लैंग्वेज), C (प्रोग्रामिंग लैंग्वेज), C (प्रोग्रामिंग भाषा),), योजना GNU GUILE/GAMBIT (स्कीम कार्यान्वयन) और जंग (प्रोग्रामिंग भाषा)
 * रूबी (प्रोग्रामिंग लैंग्वेज) या तो ffi जेम, या स्टैंडर्ड लाइब्रेरी fiddle।
 * जंग (प्रोग्रामिंग भाषा) विभिन्न मानक अनुप्रयोग_बिनरी_इंटरफेस के साथ कार्यों के लिए एक विदेशी प्रकार्य अंतरापृष्ठ  को परिभाषित करता है। एलिक्सिर (प्रोग्रामिंग भाषा), rustler के साथ इंटरफेसिंग के लिए एक पुस्तकालय भी है।
 * मूल दृश्य में एक घोषणात्मक वाक्यविन्यास होता है जो इसे गैर-यूनिकोड सी फ़ंक्शंस को कॉल करने की अनुमति देता है।
 * वोल्फ्राम भाषा WSTP (वोल्फ्राम प्रतीकात्मक स्थानांतरण प्रोटोकॉल) नामक एक तकनीक प्रदान करता है जो C ++, जावा, .NET और अमृत भाषा के लिए बाइंडिंग के साथ अन्य भाषाओं के बीच कोड की द्विदिशीय कॉलिंग को सक्षम बनाता है।
 * ZIG (प्रोग्रामिंग भाषा) बिलिन का उपयोग करके C को FFI प्रदान करता है cImport समारोह।
 * वोल्फ्राम भाषा WSTP (वोल्फ्राम प्रतीकात्मक स्थानांतरण प्रोटोकॉल) नामक एक तकनीक प्रदान करता है जो C ++, जावा, .NET और अमृत भाषा के लिए बाइंडिंग के साथ अन्य भाषाओं के बीच कोड की द्विदिशीय कॉलिंग को सक्षम बनाता है।
 * ZIG (प्रोग्रामिंग भाषा) बिलिन का उपयोग करके C को FFI प्रदान करता है cImport समारोह।

ज्यादातर मामलों में, एक FFI को एक उच्च-स्तरीय भाषा द्वारा परिभाषित किया जाता है, ताकि यह निचले स्तर की भाषा में परिभाषित और कार्यान्वित सेवाओं को नियोजित कर सके, समान्यतः  एक सिस्टम भाषा जैसे सी (प्रोग्रामिंग भाषा) या सी ++।यह समान्यतः  उस भाषा में ओएस सेवाओं तक पहुंचने के लिए किया जाता है जिसमें ओएस 'एपीआई को परिभाषित किया गया है, या प्रदर्शन के विचारों के लिए।

कई FFI भी मेजबान भाषा में सेवाओं को आमंत्रित करने के लिए बुलाए गए भाषा के लिए साधन भी प्रदान करते हैं।

विदेशी प्रकार्य अंतरापृष्ठ  शब्द का उपयोग आम तौर पर Microsoft कॉमन लैंग्वेज रनटाइम जैसे बहु-भाषी रनटाइम्स का वर्णन करने के लिए नहीं किया जाता है, जहां एक सामान्य सब्सट्रेट प्रदान किया जाता है जो किसी भी अन्य में परिभाषित सेवाओं का उपयोग करने के लिए किसी भी CLR-Compliant भाषा को सक्षम बनाता है।(हालांकि, इस स्थितियाँ  में सीएलआर में रनटाइम के बाहर कॉल करने के लिए एक FFI, पी/इनवोक शामिल है।) इसके अलावा, कई वितरित कंप्यूटिंग आर्किटेक्चर जैसे कि जावा रिमोट विधि आह्वान (आरएमआई), आरपीसी, कोरबा, साबुन और डी-बस परमिट विभिन्न भाषाओं में लिखी जाने वाली विभिन्न सेवाओं;इस तरह के आर्किटेक्चर को समान्यतः  FFI  नहीं माना जाता है।

विशेष स्थितियाँ
कुछ विशेष स्थितियाँ हैं, जिनमें भाषाएं एक ही बाइटकोड वीएम में संकलित होती हैं, जैसे कि  क्लोजर (प्रोग्रामिंग भाषा)  और जावा (प्रोग्रामिंग लैंग्वेज), साथ ही एलिक्सिर (प्रोग्रामिंग लैंग्वेज) और एर्लांग (प्रोग्रामिंग लैंग्वेज)।चूंकि कोई अंतरापृष्ठ  नहीं है, यह एक FFI  नहीं है, सख्ती से बोलना, जबकि यह उपयोगकर्ता को समान कार्यक्षमता प्रदान करता है।

यह भी देखें

 * भाषा इंटरऑपरेबिलिटी
 * अंतरापृष्ठ परिभाषा भाषा
 * कॉलिंग कन्वेंशन
 * नाम मंग्लिंग
 * अप्लिकेशन प्रोग्रामिंग अंतरफलक
 * एप्लिकेशन बाइनरी अंतरापृष्ठ
 * एप्लिकेशन वर्चुअल मशीनों की तुलना
 * Swig
 * सुदूर प्रणाली संदेश
 * libffi

बाहरी संबंध

 * c2.com: Foreign function interface
 * Haskell 98 Foreign Function Interface
 * Allegro Common Lisp FFI
 * A Foreign Function Interface generator for occam-pi
 * UFFI: Lisp Universal Foreign Function Interface
 * CFFI: Common Foreign Function Interface, for Common Lisp
 * Java Native Interface: Programmer's Guide and Specification
 * JSNI (JavaScript Native Interface)
 * dyncall library using assembly call kernels for a variety of processors,OS and calling conventions
 * FFCALL
 * C/Invoke
 * libffi
 * libffi