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

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

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

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


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

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


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

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

इसके अलावा, कई FFI को स्वचालित रूप से उत्पन्न किया जा सकता है: उदाहरण के लिए, SWIG।हालांकि, एक एक्सटेंशन भाषाके स्थितियाँ  में अतिथि और मेजबान के रिश्ते का एक शब्दार्थ उलटा हो सकता है, जब एक्सटेंशन भाषाका एक छोटा शरीर मेजबान भाषाके बड़े शरीर में अतिथि आमंत्रित सेवाएं हैं, जैसे कि एक छोटा प्लगइन लिखना जिम्प के लिए। कुछ FFI मुक्त खड़े सबरूटीनों तक सीमित हैं, जबकि अन्य किसी वस्तु या वर्ग में एम्बेडेड कार्यों की कॉल की भी अनुमति देते हैं (जिसे प्रायः  विधि कॉल कहा जाता है);कुछ भी जटिल डेटाटाइप्स और/या वस्तुओं की भाषासीमा के पार की अनुमति देते हैं।
 * ADA (प्रोग्रामिंग भाषा) भाषा बाइंडिंग, न केवल विस्थानीय कार्यों को कॉल करने की अनुमति देता है, बल्कि गैर-ADA कोड से इसके कार्यों और विधियों को निर्यात करने के लिए भी अनुमति देता है।
 * C ++ में C (प्रोग्रामिंग भाषा) के साथ एक तुच्छ FFI है, क्योंकि भाषाएं एक महत्वपूर्ण सामान्य उपवर्ग साझा करती हैं।C ++ में  extern "C"  घोषणा का प्राथमिक प्रभाव C ++ नाम मैंगलिंग को अक्षम करना है।
 * स्वच्छ C (प्रोग्रामिंग भाषा) या STDCALL (प्रोग्रामिंग भाषा) कॉलिंग सम्मेलन के बाद सभी भाषाओं के साथ एक द्विदिश FFI प्रदान करता है।
 * कॉमन लिस्प
 * संकलित स्थानीय अंतरापृष्ठ, GNU संकलनकर्ता वातावरण में उपयोग किए जाने वाले JNI का विकल्प।
 * घटक वस्तु प्रतिरूप के आधारों में से एक एक सामान्य अंतरापृष्ठ प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए दृश्य आधारिक के समान प्रकार का उपयोग करता है।
 * D (प्रोग्रामिंग भाषा) इसे वैसे ही करता है जैसे C ++ करता है, बाहरी C के साथ बाहरी (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 और जावास्क्रिप्ट का उपयोग करके स्थानीय मोबाइल एप्लिकेशन बनाने के लिए एक मंच है। इसके अतिरिक्त FFI एस के माध्यम से जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए प्रकार्य है, जिसमें एक्सेलेरोमीटर, कैमरा (साथ ही फोटोलिब्ररी और सेवफोटोबम), कम्पास, स्टोरेज (एसक्यूएल डेटाबेस और लोकलस्टोरेज), अधिसूचना, मीडिया और कैप्चर (रिकॉर्डिंग, ऑडियो और वीडियो भी समिलित हैं ), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी।
 * PHP C को FFI प्रदान करता है।
 * पायथन (प्रोग्रामिंग भाषा) ctypes और cffi प्रमात्रक प्रदान करता है। उदाहरण के लिए, CTYPES प्रमात्रक साझा पुस्तकालय/DLL से C प्रकार्य को लोड कर सकता है और पायथन और C शब्दार्थ के बीच स्वचालित रूप से सरल डेटा प्रकारों का अनुवाद कर सकता है:
 * P/invoke, जो माइक्रोसॉफ्ट सामान्य भाषा रनटाइम  और स्थानीय कोड के बीच एक अंतरापृष्ठ  प्रदान करता है।
 * रैकेट भाषा(प्रोग्रामिंग भाषा) में मैक्रोज़ पर एक स्थानीय FFI आधारित है जो यादृच्छिक रूप से पुस्तकालयों को सक्रिय रूप से आयात करने में सक्षम बनाता है।
 * राकू, रूबी (प्रोग्रामिंग भाषा), पायथन, पर्ल (प्रोग्रामिंग भाषा) , ब्रेनफक, लुआ, सी, 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  नहीं माना जाता है।

विशेष स्थितियाँ
कुछ विशेष स्थितियाँ हैं, जिनमें भाषाएं एक ही बाइटकोड 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