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

एक विदेशी प्रकार्य अंतरापृष्ठ (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 ++ नाम mangling को अक्षम करना है।
 * स्वच्छ C (प्रोग्रामिंग भाषा) या (प्रोग्रामिंग भाषा) या STDCALL कॉलिंग सम्मेलन के बाद सभी भाषाओं के साथ एक द्विदिश FFI प्रदान करता है।
 * कॉमन लिस्प
 * संकलित देशी अंतरापृष्ठ, GNU संकलनकर्ता वातावरण में उपयोग किए जाने वाले JNI का विकल्प।
 * घटक वस्तु प्रतिरूप के आधारों में से एक एक सामान्य अंतरापृष्ठ प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए दृश्य आधारिक के समान प्रकार का उपयोग करता है।
 * D (प्रोग्रामिंग भाषा) इसे वैसे ही करता है जैसे 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  नहीं माना जाता है।

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