विदेशी फ़ंक्शन इंटरफ़ेस

From alpha
Jump to navigation Jump to search

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

नामकरण

यह शब्द सामान्य लिस्प के विनिर्देश से आया है, जो स्पष्ट रूप से अंतर-भाषा कॉल के लिए भाषा सुविधाओं को संदर्भित करता है;[citation needed] हास्केल (प्रोग्रामिंग भाषा) द्वारा आधिकारिक तौर पर इस शब्द का प्रयोग किया जाता है,[1] जंग (प्रोग्रामिंग भाषा) ,[2] और पायथन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषाएँ।[3] अन्य भाषाएं अन्य शब्दावली का उपयोग करती हैंएडा प्रोग्रामिंग भाषा भाषा भाषा बाइंडिंग के बारे में बात करती है, जबकि जावा (प्रोग्रामिंग भाषा) अपने एफएफआई को जेएनआई (जावा मूल इंटरफ़ेस ) या जेएनए (जावा नेटिव एक्सेस ) के रूप में संदर्भित करती है। ऐसी सेवाएं प्रदान करने वाले तंत्रों के लिए विदेशी कार्य इंटरफ़ेस सामान्य शब्दावली बन गया है।

ऑपरेशन

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

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

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

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

भाषा द्वारा

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

  • एडा (प्रोग्रामिंग लैंग्वेज) लैंग्वेज बाइंडिंग, न केवल विदेशी कार्यों को कॉल करने की अनुमति देता है बल्कि गैर-एडा कोड से बुलाए जाने वाले कार्यों और विधियों को निर्यात करने की भी अनुमति देता है।[4]
  • C++ में C (प्रोग्रामिंग लैंग्वेज) के साथ एक तुच्छ FFI है, क्योंकि भाषाएँ एक महत्वपूर्ण सामान्य उपसमुच्चय साझा करती हैं। का प्राथमिक प्रभाव extern "C" सी ++ में घोषणा सी ++ नाम मंगलिंग को अक्षम करना है।
  • स्वच्छ (प्रोग्रामिंग भाषा) C (प्रोग्रामिंग लैंग्वेज) या stdcall कॉलिंग कन्वेंशन के बाद सभी भाषाओं के साथ एक द्विदिश FFI प्रदान करता है।[5][6]
  • सामान्य लिस्प
  • संकलित मूल इंटरफ़ेस , GNU कंपाइलर वातावरण में उपयोग किए जाने वाले JNI का विकल्प।
  • घटक वस्तु मॉडल के आधारों में से एक सामान्य इंटरफ़ेस प्रारूप है, जो मूल रूप से स्ट्रिंग्स और सरणियों के लिए Visual Basic के समान प्रकारों का उपयोग करता है।
  • डी (प्रोग्रामिंग भाषा) इसे उसी तरह से करता है जैसे सी ++ करता है, बाहरी सी के माध्यम से बाहरी (सी ++)
  • डार्ट (प्रोग्रामिंग भाषा) में डार्ट शामिल है: एफएफआई[7] मोबाइल, कमांड-लाइन और सर्वर एप्लिकेशन के लिए नेटिव C (प्रोग्रामिंग लैंग्वेज) कोड कॉल करने के लिए लाइब्रेरी
  • गतिशील भाषा , जैसे कि पायथन (प्रोग्रामिंग लैंग्वेज), पर्ल , टीसीएल , और रूबी प्रोग्रामिंग भाषा , सभी C/C++ (या C/C++ कॉलिंग कन्वेंशन का पालन करने वाली कोई अन्य भाषा) में लिखे गए नेटिव कोड तक आसान पहुँच प्रदान करती हैं।
  • कारक (प्रोग्रामिंग भाषा) में सी के लिए एफएफआई हैं, फोरट्रान , -cocoa.html Objective-C, और Windows COM; ये सभी मनमाने ढंग से साझा पुस्तकालयों को गतिशील रूप से आयात और कॉल करने में सक्षम हैं।
  • फोरट्रान 2003 में एक मॉड्यूल ISO_C_BINDING है जो इंटरऑपरेबल डेटा प्रकार (दोनों आंतरिक प्रकार और पीओडी स्ट्रक्चर्स), इंटरऑपरेबल पॉइंटर्स, इंटरऑपरेबल ग्लोबल डेटा स्टोर्स, और फोरट्रान से सी को कॉल करने और सी से फोरट्रान को कॉल करने के लिए तंत्र प्रदान करता है।[8] इसे फोरट्रान 2018 मानक में सुधार किया गया है।
  • जाओ (प्रोग्रामिंग भाषा) के माध्यम से सीधे सी कोड को कॉल कर सकते हैं "C" छद्म पैकेज।[9]
  • Google वेब टूलकिट, जिसमें जावा को जावास्क्रिप्ट के लिए संकलित किया गया है, में JSNI नामक एक FFI है जो जावा स्रोत को मनमाने ढंग से जावास्क्रिप्ट कार्यों को कॉल करने की अनुमति देता है, और जावास्क्रिप्ट को जावा में वापस कॉल करने की अनुमति देता है।
  • हास्केल (प्रोग्रामिंग भाषा)
  • जावा नेटिव इंटरफ़ेस, जो जावा (प्रोग्रामिंग लैंग्वेज) और C/C++ के बीच एक इंटरफ़ेस प्रदान करता है, अधिकांश सिस्टम पर पसंदीदा सिस्टम भाषाएँ जहाँ जावा तैनात है। जावा नेटिव एक्सेस ग्लू कोड लिखे बिना देशी पुस्तकालयों के साथ एक इंटरफ़ेस प्रदान करता है। एक और उदाहरण है JNR
  • LuaJIT, एक समय-समय पर संकलन | Lua (प्रोग्रामिंग लैंग्वेज) का जस्ट-इन-टाइम कार्यान्वयन, में एक FFI है जो बाहरी C फ़ंक्शंस को कॉल करने और शुद्ध Lua कोड से C डेटा संरचनाओं का उपयोग करने की अनुमति देता है।[10]
  • निम (प्रोग्रामिंग भाषा) में एक एफएफआई है जो इसे सी (प्रोग्रामिंग भाषा), सी++ (प्रोग्रामिंग भाषा)|सी++, और ऑब्जेक्टिव-सी (प्रोग्रामिंग भाषा)|ऑब्जेक्टिव-सी से स्रोत का उपयोग करने में सक्षम बनाता है। यह जावास्क्रिप्ट के साथ भी इंटरफेस कर सकता है।
  • जूलिया (प्रोग्रामिंग भाषा) है ccall सी (और अन्य भाषाओं, जैसे फोरट्रान) को कॉल करने के लिए कीवर्ड;[11] जबकि समान नो-बॉयलरप्लेट समर्थन प्रदान करने वाले पैकेज कुछ भाषाओं के लिए उपलब्ध हैं, उदा. पायथन के लिए[12] (उदाहरण के लिए OO समर्थन और GC समर्थन प्रदान करना), Java (और अन्य JDK-भाषाओं, जैसे Scala) और R. C++ के साथ इंटरएक्टिव उपयोग भी Cxx.jl पैकेज के साथ संभव है।
  • PhoneGap (जिसे Apache Callback के नाम से पुकारा जाता था, लेकिन अब Apache Cordova) HTML, CSS और JavaScript का उपयोग करके देशी मोबाइल एप्लिकेशन बनाने का एक मंच है। इसके अतिरिक्त एक्सेलेरोमीटर, कैमरा (PhotoLibrary और SavedPhotoAlbum), कम्पास, स्टोरेज (SQL डेटाबेस और स्थानीय स्टोरेज), अधिसूचना, मीडिया और कैप्चर (प्लेइंग और रिकॉर्डिंग या ऑडियो) सहित मोबाइल फोन की मूल सुविधाओं के तरीकों और गुणों तक पहुंच के लिए जावास्क्रिप्ट कॉलबैक फ़ंक्शंस के माध्यम से FFI है। और वीडियो), फ़ाइल, संपर्क (पता पुस्तिका), ईवेंट, डिवाइस और कनेक्शन जानकारी। [1], [2]
  • PHP C को FFI प्रदान करता है।[13]
  • पायथन (प्रोग्रामिंग भाषा) ctypes और cffi मॉड्यूल प्रदान करता है। उदाहरण के लिए, ctypes मॉड्यूल साझा डायनामिक-लिंक लाइब्रेरी से ऑन-द-फ़्लाई C फ़ंक्शन को लोड कर सकता है और सरल डेटा प्रकारों को स्वचालित रूप से Python और C शब्दार्थ के बीच निम्नानुसार अनुवादित कर सकता है:
    <वाक्यविन्यास लैंग = अजगर>

ctypes आयात करें libc = ctypes.CDLL('/lib/libc.so.6') # Linux/Unix के अंतर्गत टी = libc.समय (कोई नहीं) # समतुल्य सी कोड: टी = समय (NULL) प्रिंट (टी) </ सिंटैक्स हाइलाइट>

'बांसुरी' की आवश्यकता है

libm = Fiddle.dlopen ('/ lib/libm.so.6')

  1. समतुल्य: डबल फ्लोर (डबल एक्स);

मंजिल = बेला :: समारोह। नया (

 libm.sym('floor'), # ptr Fiddle::Handle का एक संदर्भित फ़ंक्शन (, या प्रतीक) है।
 [फिडल :: TYPE_DOUBLE], # args तर्कों की एक सरणी है, जो ptr फ़ंक्शन को पास किया गया है।
 Fiddle::TYPE_DOUBLE # ret_type फ़ंक्शन का रिटर्न प्रकार है

)

  1. समतुल्य: मंजिल (3.14159);

मंजिल.कॉल (3.14159) #=> 3.0 </वाक्यविन्यास हाइलाइट>

  • रस्ट (प्रोग्रामिंग लैंग्वेज) विभिन्न मानक Application_binary_interface के साथ कार्य करने के लिए एक विदेशी फ़ंक्शन इंटरफ़ेस को परिभाषित करता है।[18] अमृत ​​​​(प्रोग्रामिंग भाषा) , Rustler के साथ इंटरफेस करने के लिए एक लाइब्रेरी भी है।
  • मूल दृश्य में एक घोषणात्मक सिंटैक्स है जो इसे गैर-यूनिकोड सी कार्यों को कॉल करने की अनुमति देता है।
  • वोल्फ्राम भाषा WSTP (वोल्फ्राम सिंबॉलिक ट्रांसफर प्रोटोकॉल) नामक एक तकनीक प्रदान करती है जो C++, Java, .NET और अन्य भाषाओं के लिए बाइंडिंग के साथ अन्य भाषाओं के बीच कोड की द्विदिश कॉलिंग को सक्षम करती है।
  • Zig (प्रोग्रामिंग लैंग्वेज) बिल्टिन का उपयोग करके c को FFI प्रदान करता है cImport समारोह।[19]

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

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

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

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

विशेष मामले

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

यह भी देखें

संदर्भ

  1. "एफएफआई परिचय". HaskellWiki. Retrieved 19 June 2015. हास्केल के एफएफआई का उपयोग अन्य भाषाओं से कार्यों को कॉल करने के लिए किया जाता है (मूल रूप से इस बिंदु पर सी), और सी के लिए हास्केल कार्यों को कॉल करने के लिए।
  2. "एसटीडी :: एफएफआई - जंग". Retrieved 1 April 2021. यह मॉड्यूल अन्य प्रोग्रामिंग भाषाओं और अंतर्निहित ऑपरेटिंग सिस्टम की तरह नॉन-रस्ट इंटरफेस में डेटा को संभालने के लिए उपयोगिताओं को प्रदान करता है। यह मुख्य रूप से FFI (फॉरेन फंक्शन इंटरफ़ेस) बाइंडिंग और कोड के लिए उपयोग किया जाता है, जिसे अन्य भाषाओं के साथ C-जैसी स्ट्रिंग्स का आदान-प्रदान करने की आवश्यकता होती है।
  3. "सीएफएफआई दस्तावेज". Retrieved 19 June 2015. पायथन के लिए सी फॉरेन फंक्शन इंटरफेस। लक्ष्य सी में लिखित इंटरफ़ेस घोषणाओं का उपयोग करके पायथन से संकलित सी कोड को कॉल करने का एक सुविधाजनक और विश्वसनीय तरीका प्रदान करना है।
  4. "अन्य भाषाओं के लिए इंटरफ़ेस". Adaic.org. Retrieved 2013-09-29.
  5. "विदेशी निर्यात". Retrieved 2020-05-25.
  6. "C को क्लीन से कॉल कर रहा हूँ". Retrieved 2018-04-25.
  7. "डार्ट: एफएफआई लाइब्रेरी". Retrieved 2020-01-01.
  8. "'फोरट्रान-आइसो-सी-बाइंडिंग' विकि टैग". Stack Overflow.
  9. "cgo — द गो प्रोग्रामिंग लैंग्वेज". Retrieved 2015-08-23. {{cite web}}: no-break space character in |title= at position 4 (help)
  10. Mike Pall. "एफएफआई पुस्तकालय". Luajit.org. Retrieved 2013-09-29.
  11. "कॉलिंग सी और फोरट्रान कोड · जूलिया भाषा". docs.julialang.org. Retrieved 2018-02-11.
  12. PyCall.jl: Package to call Python functions from the Julia language, JuliaPy, 2018-02-08, retrieved 2018-02-11
  13. "पीएचपी: एफएफआई - मैनुअल". The PHP Group. Retrieved 13 June 2019.
  14. Eli Barzilay. "रैकेट विदेशी इंटरफ़ेस". Docs.racket-lang.org. Retrieved 2013-09-29.
  15. "TR600.pdf" (PDF). Archived from the original (PDF) on 2009-09-02. Retrieved 2013-09-29.
  16. "इनलाइन कार्यान्वयन". Retrieved 2017-08-15.
  17. "देशी कॉल". Retrieved 2017-08-15.
  18. "बाहरी कोड को कॉल करने के लिए बाहरी कार्यों का उपयोग करना". Retrieved 2019-06-01.
  19. "सी हैडर फ़ाइल से आयात करें". Zig Software Foundation. Retrieved 2021-03-11.
  20. "4. एक नमूना स्क्रिप्ट". Gimp.org. 2001-02-04. Retrieved 2013-09-29.
  21. "GIMP के लिए स्क्रिप्ट-फू और प्लग-इन". Gimp.org. Retrieved 2013-09-29.


इस पेज में लापता आंतरिक लिंक की सूची

  • भाषा बंधन
  • जावा वर्चुअल मशीन
  • वंशानुक्रम (कंप्यूटर विज्ञान)
  • कॉलिंग कन्वेंशन
  • क्रम पर्यावरण
  • एडा (प्रोग्रामिंग भाषा)
  • सी (प्रोग्रामिंग भाषा)
  • गूगल वेब टूलकिट
  • लुआ (प्रोग्रामिंग भाषा)
  • सी ++ (प्रोग्रामिंग भाषा)
  • ऑब्जेक्टिव-सी (प्रोग्रामिंग लैंग्वेज)
  • गैम्बिट (योजना कार्यान्वयन)
  • ज़िग (प्रोग्रामिंग भाषा)
  • बड़ा घूँट
  • साबुन
  • सबरूटीन
  • क्लोजर (प्रोग्रामिंग भाषा)
  • एप्लिकेशन वर्चुअल मशीनों की तुलना

बाहरी कड़ियाँ

श्रेणी:एप्लीकेशन प्रोग्रामिंग इंटरफेस श्रेणी: सबरूटीन्स