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

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

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

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


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

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


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

भाषा से
FFI के उदाहरणों में समिलित हैं:

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

कुछ FFI रूटीन तक सीमित हैं जबकि अन्य किसी ऑब्जेक्ट या वर्ग में सन्निहित कार्यों की कॉल की भी अनुमति देते हैं (जिसे प्रायः विधि कॉल कहा जाता है); कुछ भाषा सीमा के पार जटिल डेटाटाइप्स और/या ऑब्जेक्ट के प्रवास की अनुमति देते हैं।

ज्यादातर स्थितियों में, एक FFI को "उच्च-स्तरीय" भाषा द्वारा परिभाषित किया जाता है, ताकि यह निचले स्तर की भाषा में परिभाषित और कार्यान्वित सेवाओं को नियोजित कर सके, समान्यतः एक पद्धति भाषा जैसे C या C ++। यह समान्यतः उस भाषा में OS सेवाओं तक पहुंचने के लिए किया जाता है जिसमें OS 'API को परिभाषित किया गया है।

कई FFI तथाकथित भाषा के लिए होस्ट भाषा में सेवाएं प्रदान करने के लिए साधन भी प्रदान करते हैं।

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

विशेष स्थितियाँ
कुछ विशेष स्थितियाँ हैं, जिनमें भाषाएं एक ही बाइटकोड VM में संकलित होती हैं, जैसे कि क्लोजर (प्रोग्रामिंग भाषा) और जावा (प्रोग्रामिंग भाषा), साथ ही एलिक्सिर (प्रोग्रामिंग भाषा) और एर्लांग (प्रोग्रामिंग भाषा)। चूंकि कोई अंतरापृष्ठ नहीं है, यह एक 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