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

From Vigyanwiki
mNo edit summary
 
(41 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{short description|Interface to call functions from other programming languages}}
{{short description|Interface to call functions from other programming languages}}
{{external links|date=August 2016}}
'''फॉरेन फंक्शन इंटरफ़ेस''' (FFI) एक ऐसा तंत्र है जिसके द्वारा एक प्रोग्राम लिखा गया है, समान्यतः एक व्याख्या की गई ([[प्रोग्रामिंग भाषा]]एं), जो रूटीन को कॉल कर सकती है या किसी अन्य में लिखित या संकलित सेवाओं का उपयोग कर सकती है। FFI का उपयोग प्रायः उस संदर्भ में किया जाता है जहां [[बाइनरी सक्रिय लिंक लाइब्रेरी]] में कॉल की जाती हैं।  
एक विस्थानीय प्रकार्य अंतरापृष्ठ (FFI) एक ऐसा तंत्र है जिसके द्वारा एक प्रोग्राम लिखा गया है, समान्यतः एक व्याख्या की गई ([[प्रोग्रामिंग भाषा]]एं), जो रूटीन को कॉल कर सकती है या किसी अन्य में लिखित या संकलित सेवाओं का उपयोग कर सकती है। FFI का उपयोग प्रायः उस संदर्भ में किया जाता है जहां बाइनरी सक्रिय-लिंक लाइब्रेरी में कॉल की जाती हैं।  


== नामकरण ==
== नामकरण ==


यह शब्द कामन लिस्प के लिए विनिर्देश से आता है, जो स्पष्ट रूप से प्रोग्रामिंग भाषासुविधा को संदर्भित करता है जैसे कि अंतर-भाषाकॉल के लिए सक्षम होता है;{{Citation needed|reason=ANSI/X3.226 does not mention FFI|date=December 2022}} इस शब्द का उपयोग प्रायः [[हास्केल (प्रोग्रामिंग भाषा)]],<ref>{{cite web|title=FFI Introduction|url=https://wiki.haskell.org/FFI_Introduction|website=HaskellWiki|access-date=19 June 2015|quote=Haskell's FFI is used to call functions from other languages (basically C at this point), and for C to call Haskell functions.}}</ref> रस्ट (प्रोग्रामिंग भाषा),<ref>{{cite web|title=std::ffi - Rust|url=https://doc.rust-lang.org/std/ffi/index.html|access-date=1 April 2021|quote=This module provides utilities to handle data across non-Rust interfaces, like other programming languages and the underlying operating system. It is mainly of use for FFI (Foreign Function Interface) bindings and code that needs to exchange C-like strings with other languages.}}</ref> पायथन (प्रोग्रामिंग भाषा), और लुजीत [[ लुआ (प्रोग्रामिंग भाषा) |लुआ (प्रोग्रामिंग भाषा)]] <ref name=":0" /><ref name=":1">{{Cite book |last=Heintz |first=Joachim |url=https://www.worldcat.org/oclc/855505215 |title=Ways Ahead : Proceedings of the First International Csound Conference. |date=2013 |publisher=Cambridge Scholars Publishing |others=Alex Hofmann, Iain McCurdy |isbn=978-1-4438-5122-0 |location=Newcastle upon Tyne |oclc=855505215}}</ref>{{Rp|page=35}} दुभाषिया और संकलक प्रलेखन द्वारा अधिकारिक रूप से किया जाता हैं।।<ref>{{cite web|title=CFFI documentation|url=https://cffi.readthedocs.org/|access-date=19 June 2015|quote=C Foreign Function Interface for Python. The goal is to provide a convenient and reliable way to call compiled C code from Python using interface declarations written in C.}}</ref> अन्य भाषाएं अन्य शब्दावली का उपयोग करती हैं: ADA प्रोग्रामिंग भाषा "भाषा बंधन" के बारे में बात करती है, जबकि [[जावा (प्रोग्रामिंग भाषा)]] अपने FFI को JNI ([[जावा देशी इंटरफ़ेस|जावा नेटिव इंटरफ़ेस]] ) या JNA (जावा नेटिव एक्सेस) के रूप में संदर्भित करता है। ऐसी सेवाएं प्रदान करने वाले तंत्रों के लिए विस्थानीय प्रकार्य अंतरापृष्ठ समान्य शब्दावली बन गया है।  
यह शब्द कॉमन लिस्प के लिए विनिर्देश से आता है, जो स्पष्ट रूप से प्रोग्रामिंग भाषा सुविधा को संदर्भित करता है जैसे कि अंतर-भाषा कॉल के लिए यह सक्षम होता है;{{Citation needed|reason=ANSI/X3.226 does not mention FFI|date=December 2022}} इस शब्द का उपयोग प्रायः [[हास्केल (प्रोग्रामिंग भाषा)]],<ref>{{cite web|title=FFI Introduction|url=https://wiki.haskell.org/FFI_Introduction|website=HaskellWiki|access-date=19 June 2015|quote=Haskell's FFI is used to call functions from other languages (basically C at this point), and for C to call Haskell functions.}}</ref> रस्ट (प्रोग्रामिंग भाषा),<ref>{{cite web|title=std::ffi - Rust|url=https://doc.rust-lang.org/std/ffi/index.html|access-date=1 April 2021|quote=This module provides utilities to handle data across non-Rust interfaces, like other programming languages and the underlying operating system. It is mainly of use for FFI (Foreign Function Interface) bindings and code that needs to exchange C-like strings with other languages.}}</ref> पायथन (प्रोग्रामिंग भाषा), और लुजीत [[ लुआ (प्रोग्रामिंग भाषा) |लुआ (प्रोग्रामिंग भाषा)]] <ref name=":0" /><ref name=":1">{{Cite book |last=Heintz |first=Joachim |url=https://www.worldcat.org/oclc/855505215 |title=Ways Ahead : Proceedings of the First International Csound Conference. |date=2013 |publisher=Cambridge Scholars Publishing |others=Alex Hofmann, Iain McCurdy |isbn=978-1-4438-5122-0 |location=Newcastle upon Tyne |oclc=855505215}}</ref>{{Rp|page=35}} अनुवादक और संकलनकर्ता द्वारा अधिकारिक रूप से किया जाता हैं।<ref>{{cite web|title=CFFI documentation|url=https://cffi.readthedocs.org/|access-date=19 June 2015|quote=C Foreign Function Interface for Python. The goal is to provide a convenient and reliable way to call compiled C code from Python using interface declarations written in C.}}</ref> अन्य भाषाएं अन्य शब्दावली का उपयोग करती हैं: ADA प्रोग्रामिंग भाषा "भाषा बंधन" के बारे में बात करती है, जबकि [[जावा (प्रोग्रामिंग भाषा)]] अपने FFI को JNI ([[जावा देशी इंटरफ़ेस|जावा नेटिव इंटरफ़ेस]] ) या JNA ([[जावा नेटिव एक्सेस]]) के रूप में संदर्भित करता है। ऐसी सेवाएं प्रदान करने वाले तंत्रों के लिए फॉरेन फंक्शन इंटरफ़ेस समान्य शब्दावली बन गया है।  


== ऑपरेशन ==
== संचालन ==


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


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


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


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


== भाषा से ==
== भाषा से ==


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


* [[एडीए (प्रोग्रामिंग भाषा)|ADA (प्रोग्रामिंग भाषा)]] भाषा बाइंडिंग, न केवल विस्थानीय कार्यों को कॉल करने की अनुमति देता है, बल्कि गैर-ADA कोड से इसके कार्यों और विधियों को निर्यात करने के लिए भी अनुमति देता है।<ref>{{cite web|url=http://www.adaic.org/standards/05aarm/html/AA-B.html |title=Interface to Other Languages |publisher=Adaic.org |access-date=2013-09-29}}</ref>
* [[एडीए (प्रोग्रामिंग भाषा)|ADA (प्रोग्रामिंग भाषा)]] भाषा बाइंडिंग, न केवल विदेशी कार्यों को कॉल करने की अनुमति देता है, बल्कि गैर-ADA कोड से इसके कार्यों और विधियों को निर्यात करने के लिए भी अनुमति देता है।<ref>{{cite web|url=http://www.adaic.org/standards/05aarm/html/AA-B.html |title=Interface to Other Languages |publisher=Adaic.org |access-date=2013-09-29}}</ref>
* C ++ में C (प्रोग्रामिंग भाषा) के साथ एक तुच्छ FFI है, क्योंकि भाषाएं एक महत्वपूर्ण सामान्य उपवर्ग साझा करती हैं।C ++ में   {{mono|[[extern "C"]]}} घोषणा का प्राथमिक प्रभाव C ++ [[नाम]] मैंगलिंग को अक्षम करना है।
* C ++ में C के साथ एक तुच्छ FFI है, क्योंकि भाषाएं एक महत्वपूर्ण सामान्य उपवर्ग साझा करती हैं। C ++ में {{mono|[[extern "C"]]}} घोषणा का प्राथमिक प्रभाव C ++ [[नाम]] मैंगलिंग को अक्षम करना है।
* [[ स्वच्छ (प्रोग्रामिंग भाषा) | स्वच्छ C (प्रोग्रामिंग भाषा)]] या STDCALL (प्रोग्रामिंग भाषा) कॉलिंग सम्मेलन के बाद सभी भाषाओं के साथ एक द्विदिश FFI प्रदान करता है।<ref>{{cite web |url=https://cloogle.org/doc/#_11.1 | title=Foreign Export | access-date=2020-05-25 }}</ref><ref>{{cite web |url=https://svn.cs.ru.nl/repos/clean-tools/trunk/htoclean/CallingCFromClean.html |title=Calling C From Clean | access-date=2018-04-25 }}</ref>
* [[ स्वच्छ (प्रोग्रामिंग भाषा) | क्लीन C]] या STDCALL (प्रोग्रामिंग भाषा) कॉलिंग कन्वेंशन के बाद सभी भाषाओं के साथ एक द्विदिश FFI प्रदान करता है।<ref>{{cite web |url=https://cloogle.org/doc/#_11.1 | title=Foreign Export | access-date=2020-05-25 }}</ref><ref>{{cite web |url=https://svn.cs.ru.nl/repos/clean-tools/trunk/htoclean/CallingCFromClean.html |title=Calling C From Clean | access-date=2018-04-25 }}</ref>
* कॉमन लिस्प
* [[कॉमन लिस्प]]
* [[संकलित देशी इंटरफ़ेस|संकलित स्थानीय अंतरापृष्ठ]] , GNU संकलनकर्ता वातावरण में उपयोग किए जाने वाले JNI का विकल्प।
* [[संकलित देशी इंटरफ़ेस|संकलित स्थानीय अंतरापृष्ठ]] , GNU संकलनकर्ता परिवेश में उपयोग किए जाने वाले JNI का विकल्प है।
* [[घटक वस्तु मॉडल|घटक वस्तु प्रतिरूप]] के आधारों में से एक एक सामान्य अंतरापृष्ठ प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए दृश्य आधारिक के समान प्रकार का उपयोग करता है।
* [[घटक वस्तु मॉडल|कम्पोनेंट ऑब्जेक्ट प्रतिरूप]] के आधारों में से एक सामान्य अंतरापृष्ठ प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए विस्वल बेसिक के समान प्रकार का उपयोग करता है।
* [[डी (प्रोग्रामिंग भाषा)|D (प्रोग्रामिंग भाषा)]] इसे वैसे ही करता है जैसे C ++ करता है, बाहरी C के साथ बाहरी (C ++) के माध्यम से
* [[डी (प्रोग्रामिंग भाषा)|D (प्रोग्रामिंग भाषा)]] वैसे ही कार्य करता है जैसे C ++ करता है, <nowiki>[[extern "C"]]</nowiki> के साथ <nowiki>[[extern "C ++"]]</nowiki> के माध्यम से
* [[डार्ट (प्रोग्रामिंग भाषा)]] में DART: FFI समिलित है<ref>{{cite web |url=https://api.dartlang.org/stable/dart-ffi/dart-ffi-library.html | title=dart:ffi library | access-date=2020-01-01 }}</ref> मोबाइल, कमांड-लाइन और सर्वर अनुप्रयोगों के लिए C (प्रोग्रामिंग भाषा) कोड को कॉल करने के लिए  
* [[डार्ट (प्रोग्रामिंग भाषा)]] में DART: FFI समिलित है<ref>{{cite web |url=https://api.dartlang.org/stable/dart-ffi/dart-ffi-library.html | title=dart:ffi library | access-date=2020-01-01 }}</ref> मोबाइल, कमांड-लाइन और सर्वर अनुप्रयोगों के लिए C कोड को कॉल करने के लिए
* [[गतिशील भाषा|सक्रिय भाषा]], जैसे कि पायथन (प्रोग्रामिंग भाषा), [[पर्ल]], [[ आविष्कार | TCL]] , और [[ रूबी प्रोग्रामिंग भाषा | रूबी प्रोग्रामिंग भाषा]], सभी C/C ++ (या किसी अन्य भाषा में C/C ++ कॉलिंग अधिवेशन) में लिखे गए स्थानीय कोड तक आसान पहुंच प्रदान करते हैं।
* [[गतिशील भाषा|सक्रिय भाषा]], जैसे कि पायथन, [[पर्ल]], [[ आविष्कार |TCL]] , और [[ रूबी प्रोग्रामिंग भाषा |रूबी प्रोग्रामिंग भाषा]], सभी C/C ++ (या किसी अन्य भाषा में C/C ++ कॉलिंग अधिवेशन) में लिखे गए स्थानीय कोड तक आसान पहुंच प्रदान करते हैं।
* [[ कारक (प्रोग्रामिंग भाषा) | फैक्टर (प्रोग्रामिंग भाषा)]] में C के लिए FFIs है, [http://article.gmane.org/gmane.comp.lang.factor.general/2790 Fortran], [http://docs.factorcode.org/content/vocab-cocoa.html उद्देश्य-c], और [http://docs.factorcode.org/content/vocab-windows.com.html windows com]; ये सभी आयात करने और यादृच्छिक रूप से पुस्तकालयों को सक्रिय रूप से कॉल करने में सक्षम बनाते हैं।
* [[ कारक (प्रोग्रामिंग भाषा) | फैक्टर (प्रोग्रामिंग भाषा)]] में C के लिए FFIs है, [http://article.gmane.org/gmane.comp.lang.factor.general/2790 Fortran], [http://docs.factorcode.org/content/vocab-cocoa.html उद्देश्य-c], और [http://docs.factorcode.org/content/vocab-windows.com.html windows com]; ये सभी आयात करने और यादृच्छिक रूप से लाइब्रेरी को सक्रिय रूप से कॉल करने में सक्षम बनाते हैं।
* [[Fortran|फॉरटन]] 2003 में एक मापांक ISO_C_BINDING है जो अंतर-संचालित डेटा प्रकार (आंतरिक प्रकार और POD संरचनाएं दोनों), अंतर-संचालित संकेत, अंतर-संचालित वैश्विक डेटा संचय, और [[फोरट्रान]] से C को कॉल करने के लिए और C से Fortran को कॉल करने के लिए तंत्र प्रदान करता है।<ref>{{cite web|url=https://stackoverflow.com/tags/fortran-iso-c-binding/info|title='fortran-iso-c-binding' tag wiki|website=Stack Overflow}}</ref> इसे फोरट्रान 2018 मानक में सुधार किया गया है।
* [[Fortran|फॉरटन]] 2003 में एक प्रमात्रक ISO_C_BINDING है जो अंतर-संचालित डेटा प्रकार (आंतरिक प्रकार और POD संरचनाएं दोनों), अंतर-संचालित संकेत, अंतर-संचालित वैश्विक डेटा संचय, और [[फोरट्रान]] से C को कॉल करने के लिए और C से Fortran को कॉल करने के लिए तंत्र प्रदान करता है।<ref>{{cite web|url=https://stackoverflow.com/tags/fortran-iso-c-binding/info|title='fortran-iso-c-binding' tag wiki|website=Stack Overflow}}</ref> इसे फॉरटन 2018 मानक में सुधार किया गया है।
* [[गो (प्रोग्रामिंग भाषा)]] C कोड को सीधे <code>"C"</code> छद्म-पैकेज के माध्यम से कॉल कर सकता है।<ref>{{cite web |url=https://golang.org/cmd/cgo/ |title=cgo&nbsp;— The Go Programming Language |access-date=2015-08-23 }}</ref>
* [[गो (प्रोग्रामिंग भाषा)]] C कोड को सीधे <code>"C"</code> छद्म-पैकेज के माध्यम से कॉल कर सकता है।<ref>{{cite web |url=https://golang.org/cmd/cgo/ |title=cgo&nbsp;— The Go Programming Language |access-date=2015-08-23 }}</ref>
* [[Google वेब टूलकिट|गूगल वेब टूलकिट]], ( GVA) जिसमें जावा को जावास्क्रिप्ट में संकलित किया गया है, GVA में एक FFI है जिसे JSNI कहा जाता है जो जावा स्रोत को यादृच्छिक रूप से जावास्क्रिप्ट कार्यों को कॉल करने की अनुमति देता है, और जावास्क्रिप्ट के लिए जावा में वापस कॉल करने की अनुमति देता है।  
* [[Google वेब टूलकिट|गूगल वेब टूलकिट]], ( GVA) जिसमें जावा को जावास्क्रिप्ट में संकलित किया गया है, GVA में एक FFI है जिसे JSNI कहा जाता है जो जावा स्रोत को यादृच्छिक रूप से जावास्क्रिप्ट कार्यों को कॉल करने की अनुमति देता है, और जावास्क्रिप्ट के लिए जावा में वापस कॉल करने की अनुमति देता है।  
* हास्केल (प्रोग्रामिंग भाषा)
* हास्केल (प्रोग्रामिंग भाषा)
* JNI , जो जावा (प्रोग्रामिंग भाषा) और C/C ++ के बीच एक अंतरापृष्ठ प्रदान करता है, अधिकांश पद्धतियों पर पसंदीदा पद्धति भाषाएँ जहां जावा हैं। JNA गोंद कोड लिखने के बिना स्थानीय पुस्तकालयों के साथ एक अंतरापृष्ठ प्रदान करता है। एक अन्य उदाहरण [https://github.com/jnr/jnr-ffi jnr] है।  
* JNI, जो जावा और C/C ++ के बीच एक अंतरापृष्ठ प्रदान करता है, अधिकांश पद्धतियों पर जावा उपलब्ध हैं। JNA गोंद कोड लिखने के बिना स्थानीय लाइब्रेरी के साथ एक अंतरापृष्ठ प्रदान करता है। एक अन्य उदाहरण [https://github.com/jnr/jnr-ffi jnr] है।  
* Lua (प्रोग्रामिंग भाषा) का सिर्फ-इन-टाइम कार्यान्वयन, एक FFI है जो बाहरी C प्रकार्य को कॉल करने और शुद्ध Lua कोड से C डेटा संरचनाओं का उपयोग करने की अनुमति देता है।<ref name=":0">{{cite web|author=Mike Pall |url=http://luajit.org/ext_ffi.html |title=FFI Library |publisher=Luajit.org |access-date=2013-09-29}}</ref>{{r|:1|pp=35}}
* Lua (प्रोग्रामिंग भाषा) का सिर्फ-इन-टाइम कार्यान्वयन, एक FFI है जो बाहरी C प्रकार्य को कॉल करने और शुद्ध Lua कोड से C डेटा संरचनाओं का उपयोग करने की अनुमति देता है।<ref name=":0">{{cite web|author=Mike Pall |url=http://luajit.org/ext_ffi.html |title=FFI Library |publisher=Luajit.org |access-date=2013-09-29}}</ref>{{r|:1|pp=35}}
* NIM (प्रोग्रामिंग भाषा) में एक FFI है जो इसे C, C ++, ऑब्जेक्टिव-C से स्रोत का उपयोग करने में सक्षम बनाता है। यह जावास्क्रिप्ट के साथ अंतरापृष्ठ भी कर सकता है।
* NIM (प्रोग्रामिंग भाषा) में एक FFI है जो इसे C, C ++, उद्देश्य-C से स्रोत का उपयोग करने में सक्षम बनाता है। यह जावास्क्रिप्ट के साथ अंतरापृष्ठ भी कर सकता है।
* जावास्क्रिप्ट: जावास्क्रिप्ट समान्यतः [[वेब ब्राउज़र]] के अंदर चलायाा जाता है
* जावास्क्रिप्ट: जावास्क्रिप्ट समान्यतः [[वेब ब्राउज़र]] के अंदर चलाया जाता है
** Node.js {{Code|.node}} पूर्व-संकलित प्रमात्रक खोलने के लिए कार्य प्रदान करता है जो बदले में प्रमात्रक गैर-निर्मित संसाधनों तक पहुंच प्रदान कर सकते हैं।
** Node.js {{Code|.node}} पूर्व-संकलित प्रमात्रक खोलने के लिए कार्य प्रदान करता है जो बदले में प्रमात्रक गैर-निर्मित संसाधनों तक पहुंच प्रदान कर सकते हैं।
** [[डेनो (सॉफ्टवेयर)]], {{Code|dlopen(...)}} कार्य के माध्यम से FFI अंतरापृष्ठ प्रदान करता है।<ref>{{Cite web |title=Foreign Function Interface {{!}} Manual |url=https://deno.land/manual@v1.30.3/runtime/ffi_api#foreign-function-interface-api |access-date=2023-02-08 |website=Deno |language=en}}</ref>
** [[डेनो (सॉफ्टवेयर)]], {{Code|dlopen(...)}} कार्य के माध्यम से FFI अंतरापृष्ठ प्रदान करता है।<ref>{{Cite web |title=Foreign Function Interface {{!}} Manual |url=https://deno.land/manual@v1.30.3/runtime/ffi_api#foreign-function-interface-api |access-date=2023-02-08 |website=Deno |language=en}}</ref>
* [[जूलिया (प्रोग्रामिंग भाषा)]] <code>ccall</code> C (और अन्य भाषाओं, जैसे फोरट्रान) को कॉल करने के लिए संकेतशब्द है;<ref>{{Cite web|url=https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/|title=Calling C and Fortran Code · The Julia Language|website=docs.julialang.org|language=en|access-date=2018-02-11}}</ref> जबकि पैकेज, समान नो-बोइलरप्लेट समर्थन प्रदान करते हैं, कुछ भाषाओं के लिए उपलब्ध हैं जैसे कि पायथन <ref>{{Citation|title=PyCall.jl: Package to call Python functions from the Julia language|date=2018-02-08|url=https://github.com/JuliaPy/PyCall.jl|publisher=JuliaPy|access-date=2018-02-11}}</ref> (उदाहरण के लिए OO समर्थन और GC समर्थन प्रदान करना) [[ पीएचपी | जावा]] (और अन्य JDK भाषाओं का समर्थन करता है, जैसे SCALA) और R. C ++ के साथ इंटरएक्टिव उपयोग CXX.JL पैकेज के साथ भी संभव है।
* [[जूलिया (प्रोग्रामिंग भाषा)]] <code>ccall</code> C (और अन्य भाषाओं, जैसे फोरट्रान) को कॉल करने के लिए संकेतशब्द है;<ref>{{Cite web|url=https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/|title=Calling C and Fortran Code · The Julia Language|website=docs.julialang.org|language=en|access-date=2018-02-11}}</ref> जबकि पैकेज, समान नो-बोइलरप्लेट समर्थन प्रदान करते हैं, यह कुछ भाषाओं के लिए उपलब्ध हैं जैसे कि पायथन <ref>{{Citation|title=PyCall.jl: Package to call Python functions from the Julia language|date=2018-02-08|url=https://github.com/JuliaPy/PyCall.jl|publisher=JuliaPy|access-date=2018-02-11}}</ref> (उदाहरण के लिए OO समर्थन और GC समर्थन प्रदान करना) [[ पीएचपी |जावा]] (और अन्य JDK भाषाओं का समर्थन करता है, जैसे SCALA) और R. C ++ के साथ पारस्परिक उपयोग CXX.JL पैकेज के साथ भी संभव है।
* [[PhoneGap]] HTML, CSS और जावास्क्रिप्ट का उपयोग करके स्थानीय मोबाइल एप्लिकेशन बनाने के लिए एक मंच है। इसके अतिरिक्त FFI एस के माध्यम से जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए प्रकार्य है, जिसमें एक्सेलेरोमीटर, कैमरा (साथ ही फोटोलिब्ररी और सेवफोटोबम), कम्पास, स्टोरेज (एसक्यूएल डेटाबेस और लोकलस्टोरेज), अधिसूचना, मीडिया और कैप्चर (रिकॉर्डिंग, ऑडियो और वीडियो भी समिलित हैं ), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी।
* [[PhoneGap]] HTML, CSS और जावास्क्रिप्ट का उपयोग करके स्थानीय मोबाइल एप्लिकेशन बनाने के लिए एक मंच है। इसके अतिरिक्त FFIs के माध्यम से जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए प्रकार्य है, जिसमें एक्सेलेरोमीटर, कैमरा (साथ ही फोटो [[बाइनरी सक्रिय लिंक लाइब्रेरी|लाइब्रेरी]] और सेव फोटो एलबम), कम्पास, स्टोरेज SQL डेटाबेस और लोकल स्टोरेज), अधिसूचना, मीडिया और कैप्चर (रिकॉर्डिंग, ऑडियो और वीडियो भी समिलित हैं ), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी।
* PHP C को FFI प्रदान करता है।<ref>{{cite web |title=PHP: FFI - Manual |url=https://www.php.net/manual/en/book.ffi.php |publisher=The PHP Group |access-date=13 June 2019}}</ref>
* PHP C को FFI प्रदान करता है।<ref>{{cite web |title=PHP: FFI - Manual |url=https://www.php.net/manual/en/book.ffi.php |publisher=The PHP Group |access-date=13 June 2019}}</ref>
* पायथन (प्रोग्रामिंग भाषा) [https://docs.python.org/3/library/ctypes.html ctypes] और [https://cffi.readthedocs.io/en/latest/ cffi] प्रमात्रक प्रदान करता है।उदाहरण के लिए, CTYPES प्रमात्रक साझा पुस्तकालय/DLL से C प्रकार्य को लोड कर सकता है और पायथन और C शब्दार्थ के बीच स्वचालित रूप से सरल डेटा प्रकारों का अनुवाद कर सकता है:
* पायथन (प्रोग्रामिंग भाषा) [https://docs.python.org/3/library/ctypes.html ctypes] और [https://cffi.readthedocs.io/en/latest/ cffi] प्रमात्रक प्रदान करता है। उदाहरण के लिए, CTYPES प्रमात्रक साझा लाइब्रेरी/DLL से C प्रकार्य को लोड कर सकता है और पायथन और C शब्दार्थ के बीच स्वचालित रूप से सरल डेटा प्रकारों का अनुवाद कर सकता है:
*:<syntaxhighlight lang="python">
*:<syntaxhighlight lang="python">
import ctypes
import ctypes
Line 57: Line 56:
t = libc.time(None)                  # Equivalent C code: t = time(NULL)
t = libc.time(None)                  # Equivalent C code: t = time(NULL)
print(t)</syntaxhighlight>
print(t)</syntaxhighlight>
* P/invoke, जो Microsoft [[ सामान्य भाषा रनटाइम | सामान्य भाषारनटाइम]] और स्थानीय कोड के बीच एक अंतरापृष्ठ प्रदान करता है।
* P/इन्वोक, जो माइक्रोसॉफ्ट [[ सामान्य भाषा रनटाइम |सामान्य भाषा कार्यविधि]] और स्थानीय कोड के बीच एक अंतरापृष्ठ प्रदान करता है।
* [[ रैकेट भाषा (प्रोग्रामिंग भाषा) | रैकेट भाषा(प्रोग्रामिंग भाषा)]] में मैक्रोज़ पर एक स्थानीय FFI आधारित है जो मनमानी साझा पुस्तकालयों को सक्रिय रूप से आयात करने में सक्षम बनाता है।<ref>{{cite web|author=Eli Barzilay |url=http://docs.racket-lang.org/foreign/ |title=The Racket Foreign Interface |publisher=Docs.racket-lang.org |access-date=2013-09-29}}</ref><ref>{{cite web |url=http://repository.readscheme.org/ftp/papers/sw2004/barzilay.pdf |title=TR600.pdf |access-date=2013-09-29 |archive-date=2009-09-02 |archive-url=https://web.archive.org/web/20090902152301/http://repository.readscheme.org/ftp/papers/sw2004/barzilay.pdf |url-status=dead }}</ref>
* [[ रैकेट भाषा (प्रोग्रामिंग भाषा) | रैकेट भाषा (प्रोग्रामिंग भाषा)]] में मैक्रोज़ पर एक स्थानीय FFI आधारित है जो यादृच्छिक रूप से लाइब्रेरी को सक्रिय रूप से आयात करने में सक्षम बनाता है।<ref>{{cite web|author=Eli Barzilay |url=http://docs.racket-lang.org/foreign/ |title=The Racket Foreign Interface |publisher=Docs.racket-lang.org |access-date=2013-09-29}}</ref><ref>{{cite web |url=http://repository.readscheme.org/ftp/papers/sw2004/barzilay.pdf |title=TR600.pdf |access-date=2013-09-29 |archive-date=2009-09-02 |archive-url=https://web.archive.org/web/20090902152301/http://repository.readscheme.org/ftp/papers/sw2004/barzilay.pdf |url-status=dead }}</ref>
* RAKU (प्रोग्रामिंग भाषा) [[ रूबी (प्रोग्रामिंग भाषा) ]], पायथन (प्रोग्रामिंग भाषा), [[ पर्ल (प्रोग्रामिंग भाषा) ]], [[ब्रेनफक]] (प्रोग्रामिंग भाषा), लुआ (प्रोग्रामिंग भाषा), सी (प्रोग्रामिंग भाषा), C ++, GO (प्रोग्रामिंग भाषा (प्रोग्रामिंग भाषा), C (प्रोग्रामिंग भाषा), C (प्रोग्रामिंग भाषा), C (प्रोग्रामिंग भाषा), C (प्रोग्रामिंग भाषा),), योजना [[GNU GUILE]]/GAMBIT (स्कीम कार्यान्वयन) और जंग (प्रोग्रामिंग भाषा)<ref>{{cite web |url=https://modules.perl6.org/s/Inline%3A%3A |title=Inline implementations |access-date=2017-08-15 }}</ref><ref>{{cite web |url=https://docs.perl6.org/language/nativecall |title=Native Call |access-date=2017-08-15 }}</ref>
* राकू,[[ रूबी (प्रोग्रामिंग भाषा) ]], पायथन, [[ पर्ल (प्रोग्रामिंग भाषा) |पर्ल (प्रोग्रामिंग भाषा)]] , [[ब्रेनफक]], लुआ, C ++, GO, C (प्रोग्रामिंग भाषा), [[GNU GUILE]]/GAMBIT और रस्ट <ref>{{cite web |url=https://modules.perl6.org/s/Inline%3A%3A |title=Inline implementations |access-date=2017-08-15 }}</ref><ref>{{cite web |url=https://docs.perl6.org/language/nativecall |title=Native Call |access-date=2017-08-15 }}</ref> को कॉल कर सकता हैं।
* रूबी (प्रोग्रामिंग भाषा) या तो [https://rubygems.org/gems/ffi ffi] जेम, या स्टैंडर्ड लाइब्रेरी [https://ruby-doc.org/stdlib-2.6.6.6.6/libdoc/fiddle/rdoc/fiddle.html fiddle]
* रूबी (प्रोग्रामिंग भाषा) या तो [https://rubygems.org/gems/ffi ffi] जेम, या मानक लाइब्रेरी [https://ruby-doc.org/stdlib-2.6.6.6.6/libdoc/fiddle/rdoc/fiddle.html fiddle] के माध्यम से प्रदान करता है।
*:<syntaxhighlight lang="ruby">
*:<syntaxhighlight lang="ruby">
require 'fiddle'
require 'fiddle'
Line 76: Line 75:
floor.call(3.14159) #=> 3.0
floor.call(3.14159) #=> 3.0
</syntaxhighlight>
</syntaxhighlight>
* जंग (प्रोग्रामिंग भाषा) विभिन्न मानक अनुप्रयोग_बिनरी_इंटरफेस के साथ कार्यों के लिए एक विस्थानीय प्रकार्य  अंतरापृष्ठ  को परिभाषित करता है।<ref>{{cite web |url=https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html#using-extern-functions-to-call-external-code |title=Using extern Functions to Call External Code |access-date=2019-06-01}}</ref> एलिक्सिर (प्रोग्रामिंग भाषा), [https://github.com/rusterlium/rustler rustler] के साथ इंटरफेसिंग के लिए एक पुस्तकालय भी है।
* रस्ट (प्रोग्रामिंग भाषा) विभिन्न मानक ABI के साथ कार्यों के लिए एक फॉरेन फंक्शन इंटरफ़ेस को परिभाषित करता है।<ref>{{cite web |url=https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html#using-extern-functions-to-call-external-code |title=Using extern Functions to Call External Code |access-date=2019-06-01}}</ref> एलिक्सिर (प्रोग्रामिंग भाषा), [https://github.com/rusterlium/rustler rustler] के साथ अंतरापृष्ठ के लिए एक लाइब्रेरी भी है।
* [[ मूल दृश्य ]] में एक घोषणात्मक वाक्यविन्यास होता है जो इसे गैर-यूनिकोड सी फ़ंक्शंस को कॉल करने की अनुमति देता है।
* [[विस्वल बेसिक]] में एक घोषणात्मक सिंटैक्स होता है जो इसे गैर-यूनिकोड C कार्यों को कॉल करने की अनुमति देता है।
* [[ वोल्फ्राम भाषा | वोल्फ्राम भाषा]] WSTP (वोल्फ्राम प्रतीकात्मक स्थानांतरण प्रोटोकॉल) नामक एक तकनीक प्रदान करता है जो C ++, जावा, .NET और [[अमृत भाषा|अमृत]] भाषाके लिए बाइंडिंग के साथ अन्य भाषाओं के बीच कोड की द्विदिशीय कॉलिंग को सक्षम बनाता है।
* [[ वोल्फ्राम भाषा | वोल्फ्राम भाषा]] WSTP (वोल्फ्राम प्रतीकात्मक स्थानांतरण प्रोटोकॉल) नामक एक तकनीक प्रदान करता है जो C ++, जावा, .NET और अन्य भाषा को जोड़ने के साथ अन्य भाषाओं के बीच कोड की द्विदिशीय कॉलिंग को सक्षम बनाता है।
* ZIG (प्रोग्रामिंग भाषा) बिलिन का उपयोग करके C को FFI प्रदान करता है {{code|cImport}} समारोह।<ref>{{cite web|url=https://ziglang.org/documentation/master/#Import-from-C-Header-File |title=Import from C Header File |publisher=Zig Software Foundation |access-date=2021-03-11}}</ref>
* ZIG (प्रोग्रामिंग भाषा) बिलिन {{code|cImport}} का उपयोग करके C को FFI प्रदान करता है।<ref>{{cite web|url=https://ziglang.org/documentation/master/#Import-from-C-Header-File |title=Import from C Header File |publisher=Zig Software Foundation |access-date=2021-03-11}}</ref>
इसके अलावा, कई FFI  को स्वचालित रूप से उत्पन्न किया जा सकता है: उदाहरण के लिए, [[SWIG]]।हालांकि, एक एक्सटेंशन भाषाके स्थितियाँ  में अतिथि और मेजबान के रिश्ते का एक शब्दार्थ उलटा हो सकता है, जब एक्सटेंशन भाषाका एक छोटा शरीर मेजबान भाषाके बड़े शरीर में अतिथि आमंत्रित सेवाएं हैं, जैसे कि एक छोटा प्लगइन लिखना<ref>{{cite web|url=http://www.gimp.org/docs/scheme_plugin/scheme-sample.html |title=4. A sample script |publisher=Gimp.org |date=2001-02-04 |access-date=2013-09-29}}</ref> जिम्प के लिए।<ref>{{cite web|url=http://www.gimp.org/docs/scheme_plugin/ |title=Script-Fu and plug-ins for The GIMP |publisher=Gimp.org |access-date=2013-09-29}}</ref>
इसके अतिरिक्त, गेस्ट भाषा को स्वचालित रूप से उत्पन्न किया जा सकता है: उदाहरण के लिए, [[SWIG]]. हालांकि, एक विस्तारण भाषा के स्थितियों में गेस्ट भाषा और होस्ट भाषा के रिश्ते का एक शब्दार्थ उलटा हो सकता है, जब विस्तारण भाषा का एक छोटा शरीर होस्ट भाषा के बड़े शरीर में गेस्ट भाषा आमंत्रित सेवाएं हैं, जैसे कि GIMP के लिए एक छोटा प्लगइन लिखना<ref>{{cite web|url=http://www.gimp.org/docs/scheme_plugin/scheme-sample.html |title=4. A sample script |publisher=Gimp.org |date=2001-02-04 |access-date=2013-09-29}}</ref> <ref>{{cite web|url=http://www.gimp.org/docs/scheme_plugin/ |title=Script-Fu and plug-ins for The GIMP |publisher=Gimp.org |access-date=2013-09-29}}</ref>
कुछ FFI  मुक्त खड़े [[सबरूटीन]]ों तक सीमित हैं, जबकि अन्य किसी वस्तु या वर्ग में एम्बेडेड कार्यों की कॉल की भी अनुमति देते हैं (जिसे प्रायः  [[विधि कॉल]] कहा जाता है);कुछ भी जटिल डेटाटाइप्स और/या वस्तुओं की भाषासीमा के पार की अनुमति देते हैं।


ज्यादातर मामलों में, एक FFI  को एक उच्च-स्तरीय भाषाद्वारा परिभाषित किया जाता है, ताकि यह निचले स्तर की भाषामें परिभाषित और कार्यान्वित सेवाओं को नियोजित कर सके, समान्यतः  एक सिस्टम भाषाजैसे सी (प्रोग्रामिंग भाषा) या सी ++।यह समान्यतः  उस भाषामें ओएस सेवाओं तक पहुंचने के लिए किया जाता है जिसमें ओएस 'एपीआई को परिभाषित किया गया है, या प्रदर्शन के विचारों के लिए।
कुछ FFI रूटीन तक सीमित हैं जबकि अन्य किसी ऑब्जेक्ट या वर्ग में सन्निहित कार्यों की कॉल की भी अनुमति देते हैं (जिसे प्रायः [[विधि कॉल]] कहा जाता है); कुछ भाषा सीमा के पार जटिल डेटाटाइप्स और/या ऑब्जेक्ट के प्रवास की अनुमति देते हैं।


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


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


== विशेष स्थितियाँ ==
== विशेष स्थितियाँ ==


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


== यह भी देखें ==
== यह भी देखें ==


* भाषा इंटरऑपरेबिलिटी
* भाषा इंटरऑपरेबिलिटी
* [[इंटरफ़ेस परिभाषा भाषा|अंतरापृष्ठ परिभाषाभाषा]]
* [[इंटरफ़ेस परिभाषा भाषा|अंतरापृष्ठ परिभाषाभाषा]]
* कॉलिंग कन्वेंशन
* कॉलिंग कन्वेंशन
* नाम मंग्लिंग
* नाम मंग्लिंग
* [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]]
* [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]]
* एप्लिकेशन बाइनरी अंतरापृष्ठ  
* एप्लिकेशन बाइनरी अंतरापृष्ठ  
* अनुप्रयोग वास्तविक मशीनों की तुलना
* अनुप्रयोग वर्चुअल मशीनों की तुलना
* Swig
* Swig
* [[सुदूर प्रणाली संदेश]]
* [[सुदूर प्रणाली संदेश]]
Line 126: Line 126:
* [http://www.nongnu.org/cinvoke/ C/Invoke]
* [http://www.nongnu.org/cinvoke/ C/Invoke]
* [http://sourceware.org/libffi/ libffi]
* [http://sourceware.org/libffi/ libffi]
[[Category: अनुप्रयोग प्रोग्रामिंग इंटरफेस]] [[Category: सबरूटीन्स]]


[[Category: Machine Translated Page]]
[[Category:All articles with unsourced statements]]
[[Category:Articles with invalid date parameter in template]]
[[Category:Articles with unsourced statements from December 2022]]
[[Category:CS1 English-language sources (en)]]
[[Category:Created On 18/02/2023]]
[[Category:Created On 18/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Template documentation pages|Short description/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]

Latest revision as of 12:59, 19 October 2023

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

नामकरण

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

संचालन

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

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

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

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

भाषा से

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

  • ADA (प्रोग्रामिंग भाषा) भाषा बाइंडिंग, न केवल विदेशी कार्यों को कॉल करने की अनुमति देता है, बल्कि गैर-ADA कोड से इसके कार्यों और विधियों को निर्यात करने के लिए भी अनुमति देता है।[6]
  • C ++ में C के साथ एक तुच्छ FFI है, क्योंकि भाषाएं एक महत्वपूर्ण सामान्य उपवर्ग साझा करती हैं। C ++ में extern "C" घोषणा का प्राथमिक प्रभाव C ++ नाम मैंगलिंग को अक्षम करना है।
  • क्लीन C या STDCALL (प्रोग्रामिंग भाषा) कॉलिंग कन्वेंशन के बाद सभी भाषाओं के साथ एक द्विदिश FFI प्रदान करता है।[7][8]
  • कॉमन लिस्प
  • संकलित स्थानीय अंतरापृष्ठ , GNU संकलनकर्ता परिवेश में उपयोग किए जाने वाले JNI का विकल्प है।
  • कम्पोनेंट ऑब्जेक्ट प्रतिरूप के आधारों में से एक सामान्य अंतरापृष्ठ प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए विस्वल बेसिक के समान प्रकार का उपयोग करता है।
  • D (प्रोग्रामिंग भाषा) वैसे ही कार्य करता है जैसे C ++ करता है, [[extern "C"]] के साथ [[extern "C ++"]] के माध्यम से
  • डार्ट (प्रोग्रामिंग भाषा) में DART: FFI समिलित है[9] मोबाइल, कमांड-लाइन और सर्वर अनुप्रयोगों के लिए C कोड को कॉल करने के लिए
  • सक्रिय भाषा, जैसे कि पायथन, पर्ल, TCL , और रूबी प्रोग्रामिंग भाषा, सभी C/C ++ (या किसी अन्य भाषा में C/C ++ कॉलिंग अधिवेशन) में लिखे गए स्थानीय कोड तक आसान पहुंच प्रदान करते हैं।
  • फैक्टर (प्रोग्रामिंग भाषा) में C के लिए FFIs है, Fortran, उद्देश्य-c, और windows com; ये सभी आयात करने और यादृच्छिक रूप से लाइब्रेरी को सक्रिय रूप से कॉल करने में सक्षम बनाते हैं।
  • फॉरटन 2003 में एक प्रमात्रक ISO_C_BINDING है जो अंतर-संचालित डेटा प्रकार (आंतरिक प्रकार और POD संरचनाएं दोनों), अंतर-संचालित संकेत, अंतर-संचालित वैश्विक डेटा संचय, और फोरट्रान से C को कॉल करने के लिए और C से Fortran को कॉल करने के लिए तंत्र प्रदान करता है।[10] इसे फॉरटन 2018 मानक में सुधार किया गया है।
  • गो (प्रोग्रामिंग भाषा) C कोड को सीधे "C" छद्म-पैकेज के माध्यम से कॉल कर सकता है।[11]
  • गूगल वेब टूलकिट, ( GVA) जिसमें जावा को जावास्क्रिप्ट में संकलित किया गया है, GVA में एक FFI है जिसे JSNI कहा जाता है जो जावा स्रोत को यादृच्छिक रूप से जावास्क्रिप्ट कार्यों को कॉल करने की अनुमति देता है, और जावास्क्रिप्ट के लिए जावा में वापस कॉल करने की अनुमति देता है।
  • हास्केल (प्रोग्रामिंग भाषा)
  • JNI, जो जावा और C/C ++ के बीच एक अंतरापृष्ठ प्रदान करता है, अधिकांश पद्धतियों पर जावा उपलब्ध हैं। JNA गोंद कोड लिखने के बिना स्थानीय लाइब्रेरी के साथ एक अंतरापृष्ठ प्रदान करता है। एक अन्य उदाहरण jnr है।
  • Lua (प्रोग्रामिंग भाषा) का सिर्फ-इन-टाइम कार्यान्वयन, एक FFI है जो बाहरी C प्रकार्य को कॉल करने और शुद्ध Lua कोड से C डेटा संरचनाओं का उपयोग करने की अनुमति देता है।[3][4]: 35 
  • NIM (प्रोग्रामिंग भाषा) में एक FFI है जो इसे C, C ++, उद्देश्य-C से स्रोत का उपयोग करने में सक्षम बनाता है। यह जावास्क्रिप्ट के साथ अंतरापृष्ठ भी कर सकता है।
  • जावास्क्रिप्ट: जावास्क्रिप्ट समान्यतः वेब ब्राउज़र के अंदर चलाया जाता है
    • Node.js .node पूर्व-संकलित प्रमात्रक खोलने के लिए कार्य प्रदान करता है जो बदले में प्रमात्रक गैर-निर्मित संसाधनों तक पहुंच प्रदान कर सकते हैं।
    • डेनो (सॉफ्टवेयर), dlopen(...) कार्य के माध्यम से FFI अंतरापृष्ठ प्रदान करता है।[12]
  • जूलिया (प्रोग्रामिंग भाषा) ccall C (और अन्य भाषाओं, जैसे फोरट्रान) को कॉल करने के लिए संकेतशब्द है;[13] जबकि पैकेज, समान नो-बोइलरप्लेट समर्थन प्रदान करते हैं, यह कुछ भाषाओं के लिए उपलब्ध हैं जैसे कि पायथन [14] (उदाहरण के लिए OO समर्थन और GC समर्थन प्रदान करना) जावा (और अन्य JDK भाषाओं का समर्थन करता है, जैसे SCALA) और R. C ++ के साथ पारस्परिक उपयोग CXX.JL पैकेज के साथ भी संभव है।
  • PhoneGap HTML, CSS और जावास्क्रिप्ट का उपयोग करके स्थानीय मोबाइल एप्लिकेशन बनाने के लिए एक मंच है। इसके अतिरिक्त FFIs के माध्यम से जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए प्रकार्य है, जिसमें एक्सेलेरोमीटर, कैमरा (साथ ही फोटो लाइब्रेरी और सेव फोटो एलबम), कम्पास, स्टोरेज SQL डेटाबेस और लोकल स्टोरेज), अधिसूचना, मीडिया और कैप्चर (रिकॉर्डिंग, ऑडियो और वीडियो भी समिलित हैं ), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी।
  • PHP C को FFI प्रदान करता है।[15]
  • पायथन (प्रोग्रामिंग भाषा) ctypes और cffi प्रमात्रक प्रदान करता है। उदाहरण के लिए, CTYPES प्रमात्रक साझा लाइब्रेरी/DLL से C प्रकार्य को लोड कर सकता है और पायथन और C शब्दार्थ के बीच स्वचालित रूप से सरल डेटा प्रकारों का अनुवाद कर सकता है:
    import ctypes
    libc = ctypes.CDLL('/lib/libc.so.6')  # Under Linux/Unix
    t = libc.time(None)                   # Equivalent C code: t = time(NULL)
    print(t)
    
  • P/इन्वोक, जो माइक्रोसॉफ्ट सामान्य भाषा कार्यविधि और स्थानीय कोड के बीच एक अंतरापृष्ठ प्रदान करता है।
  • रैकेट भाषा (प्रोग्रामिंग भाषा) में मैक्रोज़ पर एक स्थानीय FFI आधारित है जो यादृच्छिक रूप से लाइब्रेरी को सक्रिय रूप से आयात करने में सक्षम बनाता है।[16][17]
  • राकू,रूबी (प्रोग्रामिंग भाषा) , पायथन, पर्ल (प्रोग्रामिंग भाषा) , ब्रेनफक, लुआ, C ++, GO, C (प्रोग्रामिंग भाषा), GNU GUILE/GAMBIT और रस्ट [18][19] को कॉल कर सकता हैं।
  • रूबी (प्रोग्रामिंग भाषा) या तो ffi जेम, या मानक लाइब्रेरी fiddle के माध्यम से प्रदान करता है।
    require 'fiddle'
    
    libm = Fiddle.dlopen('/lib/libm.so.6')
    
    # Equivalent to: double floor(double x);
    floor = Fiddle::Function.new(
      libm.sym('floor'),     # ptr is a referenced function(, or symbol), of a Fiddle::Handle.
      [Fiddle::TYPE_DOUBLE], # args is an Array of arguments, passed to the ptr function.
      Fiddle::TYPE_DOUBLE    # ret_type is the return type of the function
    )
    
    # Equivalent to: floor(3.14159);
    floor.call(3.14159) #=> 3.0
    
  • रस्ट (प्रोग्रामिंग भाषा) विभिन्न मानक ABI के साथ कार्यों के लिए एक फॉरेन फंक्शन इंटरफ़ेस को परिभाषित करता है।[20] एलिक्सिर (प्रोग्रामिंग भाषा), rustler के साथ अंतरापृष्ठ के लिए एक लाइब्रेरी भी है।
  • विस्वल बेसिक में एक घोषणात्मक सिंटैक्स होता है जो इसे गैर-यूनिकोड C कार्यों को कॉल करने की अनुमति देता है।
  • वोल्फ्राम भाषा WSTP (वोल्फ्राम प्रतीकात्मक स्थानांतरण प्रोटोकॉल) नामक एक तकनीक प्रदान करता है जो C ++, जावा, .NET और अन्य भाषा को जोड़ने के साथ अन्य भाषाओं के बीच कोड की द्विदिशीय कॉलिंग को सक्षम बनाता है।
  • ZIG (प्रोग्रामिंग भाषा) बिलिन cImport का उपयोग करके C को FFI प्रदान करता है।[21]

इसके अतिरिक्त, गेस्ट भाषा को स्वचालित रूप से उत्पन्न किया जा सकता है: उदाहरण के लिए, SWIG. हालांकि, एक विस्तारण भाषा के स्थितियों में गेस्ट भाषा और होस्ट भाषा के रिश्ते का एक शब्दार्थ उलटा हो सकता है, जब विस्तारण भाषा का एक छोटा शरीर होस्ट भाषा के बड़े शरीर में गेस्ट भाषा आमंत्रित सेवाएं हैं, जैसे कि GIMP के लिए एक छोटा प्लगइन लिखना[22][23]

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

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

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

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

विशेष स्थितियाँ

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

यह भी देखें

संदर्भ

  1. "FFI Introduction". HaskellWiki. Retrieved 19 June 2015. Haskell's FFI is used to call functions from other languages (basically C at this point), and for C to call Haskell functions.
  2. "std::ffi - Rust". Retrieved 1 April 2021. This module provides utilities to handle data across non-Rust interfaces, like other programming languages and the underlying operating system. It is mainly of use for FFI (Foreign Function Interface) bindings and code that needs to exchange C-like strings with other languages.
  3. 3.0 3.1 Mike Pall. "FFI Library". Luajit.org. Retrieved 2013-09-29.
  4. 4.0 4.1 Heintz, Joachim (2013). Ways Ahead : Proceedings of the First International Csound Conference. Alex Hofmann, Iain McCurdy. Newcastle upon Tyne: Cambridge Scholars Publishing. ISBN 978-1-4438-5122-0. OCLC 855505215.
  5. "CFFI documentation". Retrieved 19 June 2015. C Foreign Function Interface for Python. The goal is to provide a convenient and reliable way to call compiled C code from Python using interface declarations written in C.
  6. "Interface to Other Languages". Adaic.org. Retrieved 2013-09-29.
  7. "Foreign Export". Retrieved 2020-05-25.
  8. "Calling C From Clean". Retrieved 2018-04-25.
  9. "dart:ffi library". Retrieved 2020-01-01.
  10. "'fortran-iso-c-binding' tag wiki". Stack Overflow.
  11. "cgo — The Go Programming Language". Retrieved 2015-08-23.
  12. "Foreign Function Interface | Manual". Deno (in English). Retrieved 2023-02-08.
  13. "Calling C and Fortran Code · The Julia Language". docs.julialang.org (in English). Retrieved 2018-02-11.
  14. PyCall.jl: Package to call Python functions from the Julia language, JuliaPy, 2018-02-08, retrieved 2018-02-11
  15. "PHP: FFI - Manual". The PHP Group. Retrieved 13 June 2019.
  16. Eli Barzilay. "The Racket Foreign Interface". Docs.racket-lang.org. Retrieved 2013-09-29.
  17. "TR600.pdf" (PDF). Archived from the original (PDF) on 2009-09-02. Retrieved 2013-09-29.
  18. "Inline implementations". Retrieved 2017-08-15.
  19. "Native Call". Retrieved 2017-08-15.
  20. "Using extern Functions to Call External Code". Retrieved 2019-06-01.
  21. "Import from C Header File". Zig Software Foundation. Retrieved 2021-03-11.
  22. "4. A sample script". Gimp.org. 2001-02-04. Retrieved 2013-09-29.
  23. "Script-Fu and plug-ins for The GIMP". Gimp.org. Retrieved 2013-09-29.


बाहरी संबंध