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

एक विदेशी फ़ंक्शन इंटरफ़ेस (FFI) एक ऐसा तंत्र है जिसके द्वारा एक कार्यक्रम एक में लिखा गया है, आमतौर पर एक व्याख्या की गई (प्रोग्रामिंग भाषाएं) (स्क्रिप्टेड), प्रोग्रामिंग भाषा जो रूटीन को कॉल कर सकती है या किसी अन्य में लिखी या संकलित सेवाओं का उपयोग कर सकती है।एफएफआई का उपयोग अक्सर संदर्भ में किया जाता है जहां कॉल को गतिशील-लिंक पुस्तकालय में बनाया जाता है। बाइनरी डायनेमिक-लिंक लाइब्रेरी।

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

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


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

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


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

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

इसके अलावा, कई एफएफआई को स्वचालित रूप से उत्पन्न किया जा सकता है: उदाहरण के लिए, SWIG।हालांकि, एक एक्सटेंशन भाषा के मामले में अतिथि और मेजबान के रिश्ते का एक शब्दार्थ उलटा हो सकता है, जब एक्सटेंशन भाषा का एक छोटा शरीर मेजबान भाषा के बड़े शरीर में अतिथि आमंत्रित सेवाएं हैं, जैसे कि एक छोटा प्लगइन लिखना जिम्प के लिए। कुछ एफएफआई मुक्त खड़े सबरूटीनों तक सीमित हैं, जबकि अन्य किसी वस्तु या वर्ग में एम्बेडेड कार्यों की कॉल की भी अनुमति देते हैं (जिसे अक्सर विधि कॉल कहा जाता है);कुछ भी जटिल डेटाटाइप्स और/या वस्तुओं की भाषा सीमा के पार की अनुमति देते हैं।
 * एडीए (प्रोग्रामिंग भाषा) भाषा बाइंडिंग, न केवल विदेशी कार्यों को कॉल करने की अनुमति देता है, बल्कि गैर-पीएडी कोड से इसके कार्यों और तरीकों को निर्यात करने के लिए भी निर्यात करता है।
 * 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 वेब टूलकिट, जिसमें जावा को जावास्क्रिप्ट में संकलित किया गया है, में एक एफएफआई है जिसे जेएसएनआई कहा जाता है जो जावा स्रोत को मनमाने ढंग से जावास्क्रिप्ट कार्यों को कॉल करने की अनुमति देता है, और जावास्क्रिप्ट के लिए जावा में वापस कॉल करने के लिए।
 * हास्केल (प्रोग्रामिंग भाषा)
 * जावा देशी इंटरफ़ेस, जो जावा (प्रोग्रामिंग भाषा) और C/C ++ के बीच एक इंटरफ़ेस प्रदान करता है, अधिकांश प्रणालियों पर पसंदीदा सिस्टम भाषाएँ जहां जावा तैनात हैं।जावा देशी एक्सेस गोंद कोड लिखने के बिना देशी पुस्तकालयों के साथ एक इंटरफ़ेस प्रदान करता है।एक अन्य उदाहरण है jnr
 * Luajit, एक जस्ट-इन-टाइम संकलन | Lua (प्रोग्रामिंग भाषा) का सिर्फ-इन-टाइम कार्यान्वयन, एक FFI है जो बाहरी C फ़ंक्शन को कॉल करने और शुद्ध Lua कोड से C डेटा संरचनाओं का उपयोग करने की अनुमति देता है।
 * NIM (प्रोग्रामिंग लैंग्वेज) में एक FFI है जो इसे C (प्रोग्रामिंग लैंग्वेज), C ++ (प्रोग्रामिंग लैंग्वेज) से स्रोत का उपयोग करने में सक्षम बनाता है। C ++, और ऑब्जेक्टिव-C (प्रोग्रामिंग लैंग्वेज) | ऑब्जेक्टिव-सी।यह जावास्क्रिप्ट के साथ इंटरफ़ेस भी कर सकता है।
 * जावास्क्रिप्ट: जावास्क्रिप्ट आमतौर पर वेब ब्राउज़र के अंदर चलाया जाता है
 * Node.js पूर्व -खोलने के लिए कार्य प्रदान करता है .node बदले में मॉड्यूल गैर-बिल्टिन संसाधनों तक पहुंच प्रदान कर सकते हैं।
 * डेनो (सॉफ्टवेयर), के माध्यम से एफएफआई इंटरफ़ेस की तरह प्रदान करता है dlopen(...) कार्य।
 * जूलिया (प्रोग्रामिंग भाषा) है  C (और अन्य भाषाओं, उदा। Fortran) को कॉल करने के लिए कीवर्ड; जबकि पैकेज, समान नो-बोइलरप्लेट समर्थन प्रदान करते हैं, कुछ भाषाओं के लिए उपलब्ध हैं उदा।पायथन के लिए (उदा। OO समर्थन और GC समर्थन  पीएचपी ्रदान करने के लिए), जावा (और अन्य JDK-Languages, जैसे SCALA का समर्थन करता है) और C ++ के साथ R. इंटरएक्टिव उपयोग CXX.JL पैकेज के साथ भी संभव है।
 * PhoneGap (अपाचे कॉलबैक नाम से कहा गया था, लेकिन अब अपाचे कॉर्डोवा) HTML, CSS और जावास्क्रिप्ट का उपयोग करके देशी मोबाइल एप्लिकेशन बनाने के लिए एक मंच है।इसके अतिरिक्त एफएफआईएस के माध्यम से जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए फ़ंक्शन है, जिसमें एक्सेलेरोमीटर, कैमरा (साथ ही फोटोलिब्ररी और सेवफोटोबम), कम्पास, स्टोरेज (एसक्यूएल डेटाबेस और लोकलस्टोरेज), अधिसूचना, मीडिया और कैप्चर (रिकॉर्डिंग और रिकॉर्डिंग या ऑडियो भी शामिल हैं।और वीडियो), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी।
 * PHP FFI को C को प्रदान करता है।
 * पायथन (प्रोग्रामिंग भाषा) ctypes और cffi मॉड्यूल प्रदान करता है।उदाहरण के लिए, CTYPES मॉड्यूल साझा लाइब्रेरी/डायनेमिक-लिंक लाइब्रेरी से सी फ़ंक्शंस को लोड कर सकता है और पायथन और सी शब्दार्थ के बीच स्वचालित रूप से सरल डेटा प्रकारों का अनुवाद कर सकता है:
 * P/invoke, जो Microsoft सामान्य भाषा रनटाइम  और देशी कोड के बीच एक इंटरफ़ेस प्रदान करता है।
 * रैकेट भाषा (प्रोग्रामिंग भाषा) में मैक्रोज़ पर एक देशी एफएफआई आधारित है जो मनमानी साझा पुस्तकालयों को गतिशील रूप से आयात करने में सक्षम बनाता है।
 * 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 समारोह।

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

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

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

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

यह भी देखें

 * भाषा इंटरऑपरेबिलिटी
 * इंटरफ़ेस परिभाषा भाषा
 * कॉलिंग कन्वेंशन
 * नाम मंग्लिंग
 * अप्लिकेशन प्रोग्रामिंग अंतरफलक
 * एप्लिकेशन बाइनरी इंटरफ़ेस
 * एप्लिकेशन वर्चुअल मशीनों की तुलना
 * 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