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

From Vigyanwiki
(Created page with "{{short description|Interface to call functions from other programming languages}} {{external links|date=August 2016}} एक विदेशी फ़ंक्शन इं...")
 
mNo edit summary
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}}
{{external links|date=August 2016}}
एक विदेशी फ़ंक्शन इंटरफ़ेस (FFI) एक ऐसा तंत्र है जिसके द्वारा एक कार्यक्रम एक में लिखा गया है, आमतौर पर एक व्याख्या की गई ([[प्रोग्रामिंग भाषा]]एं) (स्क्रिप्टेड), प्रोग्रामिंग भाषा जो रूटीन को कॉल कर सकती है या किसी अन्य में लिखी या संकलित सेवाओं का उपयोग कर सकती है।एफएफआई का उपयोग अक्सर संदर्भ में किया जाता है जहां कॉल को [[गतिशील-लिंक पुस्तकालय]] में बनाया जाता है। बाइनरी डायनेमिक-लिंक लाइब्रेरी।
एक विदेशी प्रकार्य अंतरापृष्ठ  (FFI) एक ऐसा तंत्र है जिसके द्वारा एक प्रोग्राम लिखा गया है, समान्यतः एक व्याख्या की गई ([[प्रोग्रामिंग भाषा]]एं) (स्क्रिप्टेड), प्रोग्रामिंग भाषा जो रूटीन को कॉल कर सकती है या किसी अन्य में लिखी या संकलित सेवाओं का उपयोग कर सकती है। FFI का उपयोग प्रायः संदर्भ में किया जाता है जहां कॉल को [[गतिशील-लिंक पुस्तकालय]] में बनाया जाता है। बाइनरी डायनेमिक-लिंक लाइब्रेरी।


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


यह शब्द आम LISP के लिए विनिर्देश से आता है, जो स्पष्ट रूप से प्रोग्रामिंग भाषा सुविधा को संदर्भित करता है जैसे कि अंतर-भाषा कॉल के लिए सक्षम होता है;{{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> अन्य भाषाएं अन्य शब्दावली का उपयोग करती हैं: एडीए प्रोग्रामिंग भाषा भाषा बाइंडिंग के बारे में बात करती है, जबकि [[जावा (प्रोग्रामिंग भाषा)]] अपने एफएफआई को जेएनआई ([[जावा देशी इंटरफ़ेस]]) या जेएनए (जावा मूल निवासी एक्सेस) के रूप में संदर्भित करता है।विदेशी फ़ंक्शन इंटरफ़ेस ऐसे तंत्रों के लिए जेनेरिक शब्दावली बन गया है जो ऐसी सेवाएं प्रदान करते हैं।
यह शब्द आम LISP के लिए विनिर्देश से आता है, जो स्पष्ट रूप से प्रोग्रामिंग भाषा सुविधा को संदर्भित करता है जैसे कि अंतर-भाषा कॉल के लिए सक्षम होता है;{{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> अन्य भाषाएं अन्य शब्दावली का उपयोग करती हैं: एडीए प्रोग्रामिंग भाषा भाषा बाइंडिंग के बारे में बात करती है, जबकि [[जावा (प्रोग्रामिंग भाषा)]] अपने FFI  को जेएनआई ([[जावा देशी इंटरफ़ेस|जावा देशी अंतरापृष्ठ]] ) या जेएनए (जावा मूल निवासी एक्सेस) के रूप में संदर्भित करता है।विदेशी प्रकार्य  अंतरापृष्ठ  ऐसे तंत्रों के लिए जेनेरिक शब्दावली बन गया है जो ऐसी सेवाएं प्रदान करते हैं।


== ऑपरेशन ==
== ऑपरेशन ==


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


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


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


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


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


* [[एडीए (प्रोग्रामिंग भाषा)]] भाषा बाइंडिंग, न केवल विदेशी कार्यों को कॉल करने की अनुमति देता है, बल्कि गैर-पीएडी कोड से इसके कार्यों और तरीकों को निर्यात करने के लिए भी निर्यात करता है।<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>
* [[एडीए (प्रोग्रामिंग भाषा)]] भाषा बाइंडिंग, न केवल विदेशी कार्यों को कॉल करने की अनुमति देता है, बल्कि गैर-पीएडी कोड से इसके कार्यों और तरीकों को निर्यात करने के लिए भी निर्यात करता है।<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>
Line 32: Line 32:
* [[ स्वच्छ (प्रोग्रामिंग भाषा) ]] 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 का विकल्प।
* [[घटक वस्तु मॉडल]] के आधारों में से एक एक सामान्य इंटरफ़ेस प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए विजुअल बेसिक के समान प्रकार का उपयोग करता है।
* [[घटक वस्तु मॉडल]] के आधारों में से एक एक सामान्य अंतरापृष्ठ  प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए विजुअल बेसिक के समान प्रकार का उपयोग करता है।
* [[डी (प्रोग्रामिंग भाषा)]] इसे उसी तरह करता है जैसे कि C ++ करता है, बाहरी C के साथ बाहरी (C ++) के माध्यम से
* [[डी (प्रोग्रामिंग भाषा)]] इसे उसी तरह करता है जैसे कि C ++ करता है, बाहरी C के साथ बाहरी (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> मोबाइल, कमांड-लाइन और सर्वर एप्लिकेशन के लिए देशी सी (प्रोग्रामिंग भाषा) कोड को कॉल करने के लिए लाइब्रेरी
* [[डार्ट (प्रोग्रामिंग भाषा)]] में 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> मोबाइल, कमांड-लाइन और सर्वर एप्लिकेशन के लिए देशी सी (प्रोग्रामिंग भाषा) कोड को कॉल करने के लिए लाइब्रेरी
Line 40: Line 40:
* 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 मानक में सुधार किया गया है।
* [[गो (प्रोग्रामिंग भाषा)]] सीधे सी कोड को कॉल कर सकता है <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>
* [[गो (प्रोग्रामिंग भाषा)]] सीधे सी कोड को कॉल कर सकता है <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 वेब टूलकिट]], जिसमें जावा को जावास्क्रिप्ट में संकलित किया गया है, में एक एफएफआई है जिसे जेएसएनआई कहा जाता है जो जावा स्रोत को मनमाने ढंग से जावास्क्रिप्ट कार्यों को कॉल करने की अनुमति देता है, और जावास्क्रिप्ट के लिए जावा में वापस कॉल करने के लिए।
* [[Google वेब टूलकिट]], जिसमें जावा को जावास्क्रिप्ट में संकलित किया गया है, में एक FFI  है जिसे जेएसएनआई कहा जाता है जो जावा स्रोत को मनमाने ढंग से जावास्क्रिप्ट कार्यों को कॉल करने की अनुमति देता है, और जावास्क्रिप्ट के लिए जावा में वापस कॉल करने के लिए।
* हास्केल (प्रोग्रामिंग भाषा)
* हास्केल (प्रोग्रामिंग भाषा)
* जावा देशी इंटरफ़ेस, जो जावा (प्रोग्रामिंग भाषा) और C/C ++ के बीच एक इंटरफ़ेस प्रदान करता है, अधिकांश प्रणालियों पर पसंदीदा सिस्टम भाषाएँ जहां जावा तैनात हैं।जावा देशी एक्सेस गोंद कोड लिखने के बिना देशी पुस्तकालयों के साथ एक इंटरफ़ेस प्रदान करता है।एक अन्य उदाहरण है [https://github.com/jnr/jnr-ffi jnr]
* जावा देशी अंतरापृष्ठ , जो जावा (प्रोग्रामिंग भाषा) और C/C ++ के बीच एक अंतरापृष्ठ  प्रदान करता है, अधिकांश प्रणालियों पर पसंदीदा सिस्टम भाषाएँ जहां जावा तैनात हैं।जावा देशी एक्सेस गोंद कोड लिखने के बिना देशी पुस्तकालयों के साथ एक अंतरापृष्ठ  प्रदान करता है।एक अन्य उदाहरण है [https://github.com/jnr/jnr-ffi jnr]
* Luajit, एक [[जस्ट-इन-टाइम संकलन]] | 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}}
* Luajit, एक [[जस्ट-इन-टाइम संकलन]] | 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 ++, और ऑब्जेक्टिव-C (प्रोग्रामिंग लैंग्वेज) | ऑब्जेक्टिव-सी।यह जावास्क्रिप्ट के साथ इंटरफ़ेस भी कर सकता है।
* NIM (प्रोग्रामिंग लैंग्वेज) में एक FFI है जो इसे C (प्रोग्रामिंग लैंग्वेज), C ++ (प्रोग्रामिंग लैंग्वेज) से स्रोत का उपयोग करने में सक्षम बनाता है। C ++, और ऑब्जेक्टिव-C (प्रोग्रामिंग लैंग्वेज) | ऑब्जेक्टिव-सी।यह जावास्क्रिप्ट के साथ अंतरापृष्ठ  भी कर सकता है।
* जावास्क्रिप्ट: जावास्क्रिप्ट आमतौर पर [[वेब ब्राउज़र]] के अंदर चलाया जाता है
* जावास्क्रिप्ट: जावास्क्रिप्ट समान्यतः  [[वेब ब्राउज़र]] के अंदर चलाया जाता है
** Node.js पूर्व -खोलने के लिए कार्य प्रदान करता है {{Code|.node}} बदले में मॉड्यूल गैर-बिल्टिन संसाधनों तक पहुंच प्रदान कर सकते हैं।
** Node.js पूर्व -खोलने के लिए कार्य प्रदान करता है {{Code|.node}} बदले में मॉड्यूल गैर-बिल्टिन संसाधनों तक पहुंच प्रदान कर सकते हैं।
** [[डेनो (सॉफ्टवेयर)]], के माध्यम से एफएफआई इंटरफ़ेस की तरह प्रदान करता है {{Code|dlopen(...)}} कार्य।<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>
** [[डेनो (सॉफ्टवेयर)]], के माध्यम से FFI  अंतरापृष्ठ  की तरह प्रदान करता है {{Code|dlopen(...)}} कार्य।<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 (और अन्य भाषाओं, उदा। Fortran) को कॉल करने के लिए कीवर्ड;<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-Languages, जैसे SCALA का समर्थन करता है) और C ++ के साथ R. इंटरएक्टिव उपयोग CXX.JL पैकेज के साथ भी संभव है।
* [[जूलिया (प्रोग्रामिंग भाषा)]] है <code>ccall</code> C (और अन्य भाषाओं, उदा। Fortran) को कॉल करने के लिए कीवर्ड;<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-Languages, जैसे SCALA का समर्थन करता है) और C ++ के साथ R. इंटरएक्टिव उपयोग CXX.JL पैकेज के साथ भी संभव है।
* [[PhoneGap]] (अपाचे कॉलबैक नाम से कहा गया था, लेकिन अब अपाचे कॉर्डोवा) HTML, CSS और जावास्क्रिप्ट का उपयोग करके देशी मोबाइल एप्लिकेशन बनाने के लिए एक मंच है।इसके अतिरिक्त एफएफआईएस के माध्यम से जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए फ़ंक्शन है, जिसमें एक्सेलेरोमीटर, कैमरा (साथ ही फोटोलिब्ररी और सेवफोटोबम), कम्पास, स्टोरेज (एसक्यूएल डेटाबेस और लोकलस्टोरेज), अधिसूचना, मीडिया और कैप्चर (रिकॉर्डिंग और रिकॉर्डिंग या ऑडियो भी शामिल हैं।और वीडियो), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी।
* [[PhoneGap]] (अपाचे कॉलबैक नाम से कहा गया था, लेकिन अब अपाचे कॉर्डोवा) HTML, CSS और जावास्क्रिप्ट का उपयोग करके देशी मोबाइल एप्लिकेशन बनाने के लिए एक मंच है।इसके अतिरिक्त FFI एस के माध्यम से जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए प्रकार्य  है, जिसमें एक्सेलेरोमीटर, कैमरा (साथ ही फोटोलिब्ररी और सेवफोटोबम), कम्पास, स्टोरेज (एसक्यूएल डेटाबेस और लोकलस्टोरेज), अधिसूचना, मीडिया और कैप्चर (रिकॉर्डिंग और रिकॉर्डिंग या ऑडियो भी शामिल हैं।और वीडियो), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी।
* PHP FFI को C को प्रदान करता है।<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 FFI को C को प्रदान करता है।<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 मॉड्यूल साझा लाइब्रेरी/डायनेमिक-लिंक लाइब्रेरी से सी फ़ंक्शंस को लोड कर सकता है और पायथन और सी शब्दार्थ के बीच स्वचालित रूप से सरल डेटा प्रकारों का अनुवाद कर सकता है:
* पायथन (प्रोग्रामिंग भाषा) [https://docs.python.org/3/library/ctypes.html ctypes] और [https://cffi.readthedocs.io/en/latest/ cffi] मॉड्यूल प्रदान करता है।उदाहरण के लिए, CTYPES मॉड्यूल साझा लाइब्रेरी/डायनेमिक-लिंक लाइब्रेरी से सी फ़ंक्शंस को लोड कर सकता है और पायथन और सी शब्दार्थ के बीच स्वचालित रूप से सरल डेटा प्रकारों का अनुवाद कर सकता है:
Line 57: Line 57:
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/invoke, जो Microsoft [[ सामान्य भाषा रनटाइम ]] और देशी कोड के बीच एक अंतरापृष्ठ  प्रदान करता है।
* [[ रैकेट भाषा (प्रोग्रामिंग भाषा) ]] में मैक्रोज़ पर एक देशी एफएफआई आधारित है जो मनमानी साझा पुस्तकालयों को गतिशील रूप से आयात करने में सक्षम बनाता है।<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>
* 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>
* रूबी (प्रोग्रामिंग लैंग्वेज) या तो [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]।
Line 76: Line 76:
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] के साथ इंटरफेसिंग के लिए एक पुस्तकालय भी है।
* जंग (प्रोग्रामिंग भाषा) विभिन्न मानक अनुप्रयोग_बिनरी_इंटरफेस के साथ कार्यों के लिए एक विदेशी प्रकार्य  अंतरापृष्ठ  को परिभाषित करता है।<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] के साथ इंटरफेसिंग के लिए एक पुस्तकालय भी है।
* [[ मूल दृश्य ]] में एक घोषणात्मक वाक्यविन्यास होता है जो इसे गैर-यूनिकोड सी फ़ंक्शंस को कॉल करने की अनुमति देता है।
* [[ मूल दृश्य ]] में एक घोषणात्मक वाक्यविन्यास होता है जो इसे गैर-यूनिकोड सी फ़ंक्शंस को कॉल करने की अनुमति देता है।
* [[ वोल्फ्राम भाषा ]] 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 (प्रोग्रामिंग भाषा) बिलिन का उपयोग करके 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>
इसके अलावा, कई एफएफआई को स्वचालित रूप से उत्पन्न किया जा सकता है: उदाहरण के लिए, [[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>
इसके अलावा, कई 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>
कुछ एफएफआई मुक्त खड़े [[सबरूटीन]]ों तक सीमित हैं, जबकि अन्य किसी वस्तु या वर्ग में एम्बेडेड कार्यों की कॉल की भी अनुमति देते हैं (जिसे अक्सर [[विधि कॉल]] कहा जाता है);कुछ भी जटिल डेटाटाइप्स और/या वस्तुओं की भाषा सीमा के पार की अनुमति देते हैं।
कुछ FFI  मुक्त खड़े [[सबरूटीन]]ों तक सीमित हैं, जबकि अन्य किसी वस्तु या वर्ग में एम्बेडेड कार्यों की कॉल की भी अनुमति देते हैं (जिसे प्रायः  [[विधि कॉल]] कहा जाता है);कुछ भी जटिल डेटाटाइप्स और/या वस्तुओं की भाषा सीमा के पार की अनुमति देते हैं।


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


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


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


== विशेष मामले ==
== विशेष मामले ==


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


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


* भाषा इंटरऑपरेबिलिटी
* भाषा इंटरऑपरेबिलिटी
* [[इंटरफ़ेस परिभाषा भाषा]]
* [[इंटरफ़ेस परिभाषा भाषा|अंतरापृष्ठ  परिभाषा भाषा]]
* कॉलिंग कन्वेंशन
* कॉलिंग कन्वेंशन
* नाम मंग्लिंग
* नाम मंग्लिंग
* [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]]
* [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]]
* एप्लिकेशन बाइनरी इंटरफ़ेस
* एप्लिकेशन बाइनरी अंतरापृष्ठ
* एप्लिकेशन वर्चुअल मशीनों की तुलना
* एप्लिकेशन वर्चुअल मशीनों की तुलना
* Swig
* Swig

Revision as of 15:16, 27 February 2023

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

नामकरण

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

ऑपरेशन

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

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

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

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

भाषा द्वारा

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

  • एडीए (प्रोग्रामिंग भाषा) भाषा बाइंडिंग, न केवल विदेशी कार्यों को कॉल करने की अनुमति देता है, बल्कि गैर-पीएडी कोड से इसके कार्यों और तरीकों को निर्यात करने के लिए भी निर्यात करता है।[6]
  • C ++ में C (प्रोग्रामिंग भाषा) के साथ एक तुच्छ FFI है, क्योंकि भाषाएं एक महत्वपूर्ण सामान्य सबसेट साझा करती हैं।का प्राथमिक प्रभाव extern "C" C ++ में घोषणा C ++ नाम mangling को अक्षम करना है।
  • स्वच्छ (प्रोग्रामिंग भाषा) C (प्रोग्रामिंग लैंग्वेज) या STDCALL कॉलिंग कन्वेंशन के बाद सभी भाषाओं के साथ एक द्विदिश FFI प्रदान करता है।[7][8]
  • कॉमन लिस्प
  • संकलित देशी अंतरापृष्ठ , GNU कंपाइलर वातावरण में उपयोग किए जाने वाले JNI का विकल्प।
  • घटक वस्तु मॉडल के आधारों में से एक एक सामान्य अंतरापृष्ठ प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए विजुअल बेसिक के समान प्रकार का उपयोग करता है।
  • डी (प्रोग्रामिंग भाषा) इसे उसी तरह करता है जैसे कि C ++ करता है, बाहरी C के साथ बाहरी (C ++) के माध्यम से
  • डार्ट (प्रोग्रामिंग भाषा) में DART: FFI शामिल है[9] मोबाइल, कमांड-लाइन और सर्वर एप्लिकेशन के लिए देशी सी (प्रोग्रामिंग भाषा) कोड को कॉल करने के लिए लाइब्रेरी
  • गतिशील भाषा, जैसे कि पायथन (प्रोग्रामिंग लैंग्वेज), पर्ल, आविष्कार , और रूबी प्रोग्रामिंग भाषा , सभी सी/सी ++ (या किसी अन्य भाषा में सी/सी ++ कॉलिंग कन्वेंशन) में लिखे गए देशी कोड तक आसान पहुंच प्रदान करते हैं।
  • कारक (प्रोग्रामिंग भाषा) के लिए ffis है, Fortran, उद्देश्य-c, और windows com;ये सभी आयात करने और मनमानी साझा पुस्तकालयों को गतिशील रूप से कॉल करने में सक्षम बनाते हैं।
  • Fortran 2003 में एक मॉड्यूल ISO_C_BINDING है जो इंटरऑपरेबल डेटा प्रकार (आंतरिक प्रकार और POD संरचनाएं दोनों), इंटरऑपरेबल पॉइंटर्स, इंटरऑपरेबल पॉइंटर्स, इंटरऑपरेबल ग्लोबल डेटा स्टोर, और फोरट्रान से C को कॉल करने के लिए और C. Fortran को कॉल करने के लिए प्रदान करता है।[10] इसे फोरट्रान 2018 मानक में सुधार किया गया है।
  • गो (प्रोग्रामिंग भाषा) सीधे सी कोड को कॉल कर सकता है "C" छद्म-पैकेज।[11]
  • Google वेब टूलकिट, जिसमें जावा को जावास्क्रिप्ट में संकलित किया गया है, में एक FFI है जिसे जेएसएनआई कहा जाता है जो जावा स्रोत को मनमाने ढंग से जावास्क्रिप्ट कार्यों को कॉल करने की अनुमति देता है, और जावास्क्रिप्ट के लिए जावा में वापस कॉल करने के लिए।
  • हास्केल (प्रोग्रामिंग भाषा)
  • जावा देशी अंतरापृष्ठ , जो जावा (प्रोग्रामिंग भाषा) और C/C ++ के बीच एक अंतरापृष्ठ प्रदान करता है, अधिकांश प्रणालियों पर पसंदीदा सिस्टम भाषाएँ जहां जावा तैनात हैं।जावा देशी एक्सेस गोंद कोड लिखने के बिना देशी पुस्तकालयों के साथ एक अंतरापृष्ठ प्रदान करता है।एक अन्य उदाहरण है jnr
  • Luajit, एक जस्ट-इन-टाइम संकलन | Lua (प्रोग्रामिंग भाषा) का सिर्फ-इन-टाइम कार्यान्वयन, एक FFI है जो बाहरी C प्रकार्य को कॉल करने और शुद्ध Lua कोड से C डेटा संरचनाओं का उपयोग करने की अनुमति देता है।[3][4]: 35 
  • NIM (प्रोग्रामिंग लैंग्वेज) में एक FFI है जो इसे C (प्रोग्रामिंग लैंग्वेज), C ++ (प्रोग्रामिंग लैंग्वेज) से स्रोत का उपयोग करने में सक्षम बनाता है। C ++, और ऑब्जेक्टिव-C (प्रोग्रामिंग लैंग्वेज) | ऑब्जेक्टिव-सी।यह जावास्क्रिप्ट के साथ अंतरापृष्ठ भी कर सकता है।
  • जावास्क्रिप्ट: जावास्क्रिप्ट समान्यतः वेब ब्राउज़र के अंदर चलाया जाता है
    • Node.js पूर्व -खोलने के लिए कार्य प्रदान करता है .node बदले में मॉड्यूल गैर-बिल्टिन संसाधनों तक पहुंच प्रदान कर सकते हैं।
    • डेनो (सॉफ्टवेयर), के माध्यम से FFI अंतरापृष्ठ की तरह प्रदान करता है dlopen(...) कार्य।[12]
  • जूलिया (प्रोग्रामिंग भाषा) है ccall C (और अन्य भाषाओं, उदा। Fortran) को कॉल करने के लिए कीवर्ड;[13] जबकि पैकेज, समान नो-बोइलरप्लेट समर्थन प्रदान करते हैं, कुछ भाषाओं के लिए उपलब्ध हैं उदा।पायथन के लिए[14] (उदा। OO समर्थन और GC समर्थन पीएचपी ्रदान करने के लिए), जावा (और अन्य JDK-Languages, जैसे SCALA का समर्थन करता है) और C ++ के साथ R. इंटरएक्टिव उपयोग CXX.JL पैकेज के साथ भी संभव है।
  • PhoneGap (अपाचे कॉलबैक नाम से कहा गया था, लेकिन अब अपाचे कॉर्डोवा) HTML, CSS और जावास्क्रिप्ट का उपयोग करके देशी मोबाइल एप्लिकेशन बनाने के लिए एक मंच है।इसके अतिरिक्त FFI एस के माध्यम से जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए प्रकार्य है, जिसमें एक्सेलेरोमीटर, कैमरा (साथ ही फोटोलिब्ररी और सेवफोटोबम), कम्पास, स्टोरेज (एसक्यूएल डेटाबेस और लोकलस्टोरेज), अधिसूचना, मीडिया और कैप्चर (रिकॉर्डिंग और रिकॉर्डिंग या ऑडियो भी शामिल हैं।और वीडियो), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी।
  • PHP FFI को C को प्रदान करता है।[15]
  • पायथन (प्रोग्रामिंग भाषा) ctypes और cffi मॉड्यूल प्रदान करता है।उदाहरण के लिए, CTYPES मॉड्यूल साझा लाइब्रेरी/डायनेमिक-लिंक लाइब्रेरी से सी फ़ंक्शंस को लोड कर सकता है और पायथन और सी शब्दार्थ के बीच स्वचालित रूप से सरल डेटा प्रकारों का अनुवाद कर सकता है:
    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/invoke, जो Microsoft सामान्य भाषा रनटाइम और देशी कोड के बीच एक अंतरापृष्ठ प्रदान करता है।
  • रैकेट भाषा (प्रोग्रामिंग भाषा) में मैक्रोज़ पर एक देशी FFI आधारित है जो मनमानी साझा पुस्तकालयों को गतिशील रूप से आयात करने में सक्षम बनाता है।[16][17]
  • RAKU (प्रोग्रामिंग लैंग्वेज) रूबी (प्रोग्रामिंग भाषा) , पायथन (प्रोग्रामिंग लैंग्वेज), पर्ल (प्रोग्रामिंग भाषा) , ब्रेनफक (प्रोग्रामिंग लैंग्वेज), लुआ (प्रोग्रामिंग लैंग्वेज), सी (प्रोग्रामिंग लैंग्वेज), C ++, GO (प्रोग्रामिंग लैंग्वेज (प्रोग्रामिंग लैंग्वेज), C (प्रोग्रामिंग लैंग्वेज), C (प्रोग्रामिंग लैंग्वेज), C (प्रोग्रामिंग लैंग्वेज), 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
    
  • जंग (प्रोग्रामिंग भाषा) विभिन्न मानक अनुप्रयोग_बिनरी_इंटरफेस के साथ कार्यों के लिए एक विदेशी प्रकार्य अंतरापृष्ठ को परिभाषित करता है।[20] एलिक्सिर (प्रोग्रामिंग भाषा), rustler के साथ इंटरफेसिंग के लिए एक पुस्तकालय भी है।
  • मूल दृश्य में एक घोषणात्मक वाक्यविन्यास होता है जो इसे गैर-यूनिकोड सी फ़ंक्शंस को कॉल करने की अनुमति देता है।
  • वोल्फ्राम भाषा WSTP (वोल्फ्राम प्रतीकात्मक स्थानांतरण प्रोटोकॉल) नामक एक तकनीक प्रदान करता है जो C ++, जावा, .NET और अमृत भाषा के लिए बाइंडिंग के साथ अन्य भाषाओं के बीच कोड की द्विदिशीय कॉलिंग को सक्षम बनाता है।
  • ZIG (प्रोग्रामिंग भाषा) बिलिन का उपयोग करके C को FFI प्रदान करता है cImport समारोह।[21]

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

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

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

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

विशेष मामले

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


बाहरी संबंध