मैं ऐसे कार्यों का एक सेट कैसे लिख सकता हूं जो किसी भी प्रोग्रामिंग भाषा से (लगभग) से मंगवाए जा सकते हैं?


33

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


4
यदि आप केवल मार्केटिंग कारणों से "हम सभी का समर्थन करते हैं" कहने में सक्षम होना चाहते हैं, तो आप सी में एक निम्न-स्तरीय DLL या साझा लाइब्रेरी लिख सकते हैं। यदि आप अपनी बात का उपयोग करने के लिए जावा, किसी को भी कहना चाहते हैं, तो आप बेहतर जावा इंटरफ़ेस प्रदान करें।
mjfgates

1
आप कहते हैं "(लगभग) किसी भी", आप इस उद्देश्य के लिए किन भाषाओं को छोड़ देंगे? या जो आपके लिए सबसे महत्वपूर्ण हैं?
फंकीब्रेल

22
वेब सेवा? आप उदाहरण के लिए php में कुछ कार्य लिख सकते हैं। लगभग किसी भी भाषा में वेबपृष्ठों के साथ इंटरफ़ेस करने, तर्कों की आपूर्ति करने और परिणामों को पढ़ने की सकारात्मकता है।
पीटर बी

7
+1 का कारण यह एक दिलचस्प सवाल है - लेकिन आपका प्रश्न यह कहकर सुधारा जाएगा कि आप ऐसा क्यों करना चाहते हैं। तुम्हारा लक्ष्य क्या है?
तारकादल

@PieterB => उत्तर।
कोनराड रूडोल्फ

जवाबों:


44

आपके पास कुछ विकल्प हैं:

  1. एक HTTP इंटरफ़ेस बनाएँ, लगभग हर चीज़ HTTP पर बात कर सकती है जिससे आपको बहुत सारी भाषाएँ मिलेंगी।

  2. कोई ऐसी चीज़ बनाएं जिसे भाषा के रनटाइम में जोड़ा जा सकता है, यह समय लेने वाला होगा क्योंकि आपको इसे कई अलग-अलग भाषाओं से कनेक्ट करने का तरीका खोजने की आवश्यकता होगी।


विशेष रूप से आपके मन में किस तरह का HTTP इंटरफ़ेस है?
एंडरसन ग्रीन

@AndersonGreen इससे कोई फर्क नहीं पड़ता (चूंकि कोई भी भाषा जो नेटवर्क सॉकेट को HTTP बोल सकती है) खोल सकती है, लेकिन REST एक उपयोगी छद्म मानक है।
मोनिका

7
REST + JSON एक उचित समाधान होगा
डेविड हेस

मैं यह भी मानता हूं कि, HTTP का उपयोग करने के लिए संवाद करने से आपके आवेदन के कार्यों के साथ बातचीत करने के लिए बहुत अधिक हर भाषा की अनुमति मिलती है।
केवल बोलिवियन हियर

30

मुझे लगता है कि C या C ++ आपके उद्देश्य के लिए सबसे उपयुक्त होगा। आप अपने C या C ++ API से भाषा बाइंडिंग उत्पन्न करने के लिए SWIG (सरलीकृत आवरण और इंटरफ़ेस जेनरेटर) का उपयोग कर सकते हैं ।

SWIG एक सॉफ्टवेयर डेवलपमेंट टूल है, जो C और C ++ में लिखे प्रोग्राम्स को विभिन्न उच्च स्तरीय प्रोग्रामिंग भाषाओं के साथ जोड़ता है। SWIG का उपयोग विभिन्न प्रकार की लक्षित भाषाओं के साथ किया जाता है, जिसमें सामान्य स्क्रिप्टिंग भाषाएं जैसे Perl, PHP, Python, Tcl और Ruby शामिल हैं। की सूचीसमर्थित भाषाओंइसमें सी #, कॉमन लिस्प (सीएलआईएसपी, एलेग्रो सीएल, सीएफएफआई, यूएफएफआई), डी, गो भाषा, जावा सहित एंड्रॉइड, लुआ, मोडुला -3, ओकेएमएल, ऑक्टेव और आर जैसी गैर-स्क्रिप्टिंग भाषाएं भी शामिल हैं। कार्यान्वयन (गिल, MzScheme / रैकेट, चिकन) का समर्थन किया जाता है। SWIG का उपयोग आमतौर पर उच्च-स्तरीय व्याख्या या संकलित प्रोग्रामिंग वातावरण, उपयोगकर्ता इंटरफेस बनाने और C / C ++ सॉफ़्टवेयर के परीक्षण और प्रोटोटाइप के लिए एक उपकरण के रूप में किया जाता है। SWIG का उपयोग आमतौर पर C / C ++ इंटरफेस को पार्स करने के लिए किया जाता है और उपरोक्त लक्ष्य भाषाओं के लिए आवश्यक 'गोंद कोड' को C / C ++ कोड में कॉल करने के लिए उपयोग किया जाता है। SWIG अपने पार्स ट्री को एक्सएमएल और लिस्प एस-एक्सप्रेशन के रूप में भी निर्यात कर सकता है। SWIG मुफ्त सॉफ्टवेयर है और SWIG उत्पन्न करने वाला कोड वाणिज्यिक और गैर-वाणिज्यिक दोनों परियोजनाओं के साथ संगत है ...


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

14
@ एसके-तर्क: वास्तव में नहीं। C को C ++ की तरह रनटाइम लिब की जरूरत है। ABI को C ++ में नियंत्रित किया जा सकता है, extern "C"इसलिए यह बाहर की तरफ C- संगत है। इसलिए, आपके पास C ++ (उच्च प्रकार-सुरक्षा, पुस्तकालय) के आंतरिक फायदे हैं, लेकिन C के बाहरी फायदे (वास्तविक तथ्य मानक)
MSalters

3
@ एसके-तर्क अनिर्दिष्ट एबीआई बस एक हल की गई समस्या है, SWIG, Boost.Python और अन्य भाषा बाइंडिंग के होस्ट देखें।
कोनराड रुडोल्फ

3
@ पुस्तकालय अपवादों और उनके सामान्य गैर-काम के बारे में पुस्तकालय की सीमाओं को नहीं
भूलते

3
-1 + सी सुझाव के लिए। C आसान है, C ++ चीजों को अनावश्यक रूप से कठिन बनाता है।
अर्नेस्ट फ्रेडमैन-हिल

23

बहुत अधिक 2 तरीके हैं:

  • एक सी एपीआई। व्यावहारिक रूप से कभी भी वहां की भाषा सी लाइब्रेरी को लोड करेगी और उसके कार्यों को कॉल करेगी। आप यह कैसे करते हैं यह स्रोत भाषा पर निर्भर करता है।
  • किसी प्रकार का एक आरपीसी तंत्र। यह HTTP पर चलने वाला REST API या सॉकेट के ऊपर चलने वाला बाइनरी इंटरफ़ेस हो सकता है। जब तक आप सबसे कम सामान्य भाजक तंत्र (उदाहरण के लिए एक सॉकेट) के लिए जाते हैं, तो आप क्लाइंट एक्सेस रूटीन नहीं होने का जोखिम चलाते हैं (उदाहरण के लिए कुछ भाषाओं में SOAP का उपयोग करके कार्यान्वित एपीआई को कॉल करने के लिए सही SOAP क्लाइंट नहीं होते हैं, या इंटरऑपरेबिलिटी समस्याएं हैं)। एक HTTP / REST इंटरफ़ेस, या एक सॉकेट के लिए सरलतम से चिपके रहें। सॉकेट्स का लाभ है कि उन्हें क्लाइंट को इंटरफ़ेस को उजागर करने के लिए एक HTTP सर्वर की आवश्यकता नहीं होती है, और बेहतर प्रदर्शन वाले क्लाइंट के समान सर्वर पर आसानी से चल सकता है।

उपयोग किए गए सिस्टम के आधार पर इस परिवर्तन के लिए आवश्यक कार्य, उदाहरण के लिए, एक सॉकेट इंटरफ़ेस काम करेगा, लेकिन क्लाइंट-साइड लाइब्रेरी http पुस्तकालयों की तुलना में अधिक निम्न-स्तरीय होते हैं।

आप एक नेटवर्किंग लाइब्रेरी खोजने की कोशिश कर सकते हैं जो उस भाषा का उपयोग करने वाली सभी भाषाओं का समर्थन करती है, और उस लाइब्रेरी के संदर्भ में एपीआई को लागू करती है - जैसे, ZeroMQ का उपयोग करने से आपको बहुत लचीलापन मिलता है, इसलिए आप ZeroMQ इंटरफेस का उपयोग करके अपना एपीआई लिखेंगे, और फिर कोई भी भाषा जो आपके API को कॉल करना चाहती है, उसे ऐसा करने के लिए ZeroMQ क्लाइंट लाइब्रेरी का उपयोग करना चाहिए। एक ऐसी लाइब्रेरी चुनें जो भाषाओं की एक विस्तृत श्रृंखला का समर्थन करती है, और आपको सर्वश्रेष्ठ प्रदर्शन के लिए इन-प्रोसेस और आउट-ऑफ-प्रोसेस संचार की अनुमति देती है।


तो अगर मुझे एपीआई को कई भाषाओं में लिखना है तो मुझे क्या कदम उठाने होंगे? (मेरे मामले में, वे भाषाएँ जावास्क्रिप्ट, C ++ और जावा होंगी।)
एंडरसन ग्रीन

क्या मुझे प्रत्येक भाषा के लिए 3 अलग-अलग RESTful API लिखने चाहिए?
एंडरसन ग्रीन

आप इनमें से प्रत्येक भाषा में एक देशी आवरण लिखते हैं जो अंतर्निहित C dll को लोड करने और कॉल करने का काम करता है। या इसे C ++ में लिखें और आपके लिए ऐसा करने के लिए SWIG का उपयोग करें। यदि आप REST API का उपयोग कर रहे हैं, तो वही लागू होता है, या तो एक API और फिर 3 आवरण लिखें, लेकिन यदि आप REST API लिख रहे हैं तो प्रत्येक भाषा REST API को सीधे कॉल कर सकेगी - परेशान न करें एक आवरण के साथ।
gbjbaanb

क्या dll (डायनामिकली लिंक्ड लाइब्रेरी) विंडोज के अलावा किसी भी प्लेटफॉर्म पर संगत होगी? मुझे यहां क्रॉस-प्लेटफॉर्म संगतता की आवश्यकता है।
एंडरसन ग्रीन

नहीं, आपको इसे अन्य प्लेटफ़ॉर्म के लिए पुनः कनेक्ट करने की आवश्यकता होगी। उदाहरण के लिए लिनक्स .dll के बजाय .so का उपयोग करता है। बस एक सीधे recompile की जरूरत है, नहीं (या बहुत मामूली) कोड बदलता है।
gbjbaanb

12

यदि प्रदर्शन और कॉल विलंबता एक समस्या नहीं है, तो एक व्यापक कमांड लाइन इंटरफ़ेस प्रदान करने पर विचार करें (शायद, इसके ऊपर एक स्क्रिप्टिंग भाषा का उपयोग करके)। ImageMagick इस तरह के "एपीआई" का एक अच्छा उदाहरण हो सकता है। एक और अच्छा उदाहरण है Tk टूलकिट।


कमांड लाइन विदेशी फ़ंक्शन इंटरफ़ेस बनाने के लिए आप किस स्क्रिप्टिंग भाषा और / या प्रोग्रामिंग भाषा की सिफारिश करेंगे? इसके अलावा, क्या आपने ऐसे इंटरफेस का कोई ठोस उदाहरण पाया है?
एंडरसन ग्रीन

@AndersonGreen, इस तरह के एक उद्देश्य के लिए सभ्य मेटाप्रोग्रामिंग वाली कोई भी भाषा ठीक है। जैसे, स्कीम, मेटाला, विभिन्न अन्य एम्बेड करने योग्य लिस्प्स, टीईसीएल। आप आसानी से अपनी खुद की कमांड भाषा भी लागू कर सकते हैं। कई सीएडी / सीएई सिस्टम इस तरह से काम करते हैं। पहले से ही उल्लेखित Tk एक और विशिष्ट उदाहरण है।
एसके-लॉजिक

इस तरह से कमांड-लाइन इंटरफ़ेस का उपयोग करने के लिए, क्या आपको किसी विशिष्ट कमांड के लिए कंसोल आउटपुट मिलेगा (जैसे कि whoamiउबंटू पर उपयोगकर्ता नाम पाने के लिए), या क्या आपके पास कुछ और है?
एंडरसन ग्रीन

@AndersonGreen, स्टिंगिंग स्टड और स्टडआउट ज्यादातर मामलों में पर्याप्त होना चाहिए।
एसके-लॉजिक

5

एपीआई द्वारा, वास्तव में आपका क्या मतलब है?

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

सी जैसे कुछ पोर्टेबल और एक DLL में बाइनरी एंडपॉइंट के आधार पर एक इंटरफ़ेस ठीक हो सकता है और आम तौर पर अधिकांश प्लेटफार्मों पर और अधिकांश भाषाओं से कॉल करने योग्य हो सकता है, लेकिन इसे अलग-अलग संकलित करने की आवश्यकता हो सकती है और / या अलग-अलग स्वादों में पेश की जाती है या विभिन्न स्थिर पुस्तकालयों से जुड़ी होती है।

यह मुझे लगता है कि आप जिस भाषा में अपनी लाइब्रेरी या सेवा लिखते हैं या जो कुछ भी है, परिभाषा के हिसाब से, जब तक कि आप उस प्लेटफ़ॉर्म / सेवा के बारे में अधिक जानकारी नहीं दे देते, जिस पर एपीआई एक्सपोज़ करता है। यदि आप मान सकते हैं कि एक नेटवर्क स्टैक उपलब्ध है और डायरेक्ट-लिंक्ड फंक्शन-कॉल-लेवल परफॉर्मेंस की आवश्यकता नहीं है, तो अनुरोधों को पारदर्शी बनाने के लिए API आसानी से क्लाइंट लैंग्वेज के लिए किसी तरह की शिम के साथ HTTP-based हो सकता है।

मुझे लगता है कि सामान्य रूप से यह सवाल वास्तविक दुनिया में उपयोगी होने के लिए व्यापक है, क्योंकि आपने इस बारे में संकेत नहीं दिया है कि किस प्रकार की एपीआई उपयुक्त हो सकती है जिस प्रकार की सेवा दी जा रही है।


2

उपरोक्त उत्तरों को जोड़ने के लिए जो एक आरपीसी तंत्र का उपयोग करने का सुझाव देते हैं। आप Apache Thrift का उपयोग कर सकते हैं। ( http://thrift.apache.org/ )। यह मूल रूप से एक RPC फ्रेमवर्क है।

थ्रिफ्ट विकी के अनुसार:

स्केलेबल क्रॉस-लैंग्वेज सर्विसेज डेवलपमेंट के लिए अपाचे थ्रिफ्ट सॉफ्टवेयर फ्रेमवर्क, C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C # के बीच कुशलतापूर्वक और निर्बाध रूप से काम करने वाली कोड जनरेशन इंजन के साथ एक सॉफ्टवेयर स्टैक को जोड़ती है। कोको, जावास्क्रिप्ट, Node.js, Smalltalk, OCaml और डेल्फी और अन्य भाषाएँ


अपाचे थ्रिफ्ट का उपयोग करके विदेशी फ़ंक्शन कॉल कैसे किया जा सकता है?
एंडरसन ग्रीन

0

पास करने के लिए परमेस के साथ कॉल करने के लिए फ़ंक्शन के साथ किसी भी भाषा को एक टेक्स्ट फ़ाइल लिखें कोई सर्वर या नेटवर्क प्रोटोकॉल नहीं; यहां तक ​​कि एक गैर-कंप्यूटर भाषा विधि भी कार्य को प्रभावित कर सकती है। यहां तक ​​कि एक व्यक्ति केवल पाठ फ़ाइल बना सकता है।

सामग्री की तरह लग सकता है:

Call-method:  fdisk()
Params:  (string) "/root", (string) "write-back-file-expected.txt"

;) आप एक जवाब पाने के लिए हमेशा इंतजार कर सकते हैं। आपको बस कुछ बाइट्स को दूसरी प्रक्रिया में धकेलना होगा, लेकिन मुझे यकीन है कि यह पूरी कल्पना नहीं है।


जब आप सिर्फ एक कमांड-लाइन इंटरफ़ेस + स्टडिन / स्टडआउट कर सकते हैं तब अत्यधिक जटिल लगता है।
मोनिका

1
इससे भी बेहतर कॉल ++ 1 हो सकता है, ब्रेंडन। मैंने इसे कभी कार्रवाई में नहीं देखा, लेकिन एक बार लोग बाइट्स को स्थानांतरित करने के लिए कार्ड में छेद छिद्रण कर रहे थे।
परेशकुमार

4
यह एक मजाक का जवाब है, है ना? हम यहाँ ऐसा नहीं करते हैं।
अर्नेस्ट फ्रीडमैन-हिल

वैसे fdisk और / root हिस्सा एक मजाक है, लेकिन मैं एक प्लेटफॉर्म-उत्पाद बनाने के लिए 5 साल से अधिक समय तक एक प्लेटफॉर्म r & d (डेवलपर और विश्लेषक) के रूप में शामिल था जिसने 10 मिलियन डॉलर में अच्छा उत्पादन किया। यह इस प्रकार के REST पद्धति का उपयोग करके क्लाइंट के लिए लाखों shippable भौतिक (पीडीएफ और ईमेल नहीं) आइटम थूक देता है (सैकड़ों एमबी में प्रति आइटम प्रसंस्करण फ़ाइलें)। हमारे पास प्रमुख प्रणाली त्रिकोणीय-एसएपी-एमएस ऑफिस-पीएलसी ड्राइववार्स-पीडीएफ वर्कफ़्लो है जो एक-दूसरे को ले जा रहे हैं और सादे-पुराने-यूटीएफ-8-टेक्स्ट फ़ाइलों के साथ मिलकर काम कर रहे हैं और एक ज़िप के साथ एक ज़िप में एक ज़िप में, और कोई HTTP bs ओवरहेड नहीं है।
परेशकुमार

क्या मैं एक सवाल पूछ सकता हूँ? कोई यह क्यों नहीं सोचता कि JSON एक मजाक है? कैसे मैं किसी भी अलग recomended है? हमने json का उपयोग किया हो सकता है, लेकिन यह 2003 के आसपास नहीं था। XML बहुत मोटा है, लेकिन फिर उस महीने का स्वाद सबसे व्यावहारिक और सरल आत्मा नहीं था।
परेशकुमार

0

ओपनगेल आप जो वर्णन करते हैं उसका एक अच्छा उदाहरण है - यह सी में लिखा गया एक एपीआई है, जिसे इस तरह से डिज़ाइन किया गया है कि अन्य भाषाओं के लिए बाइंडिंग लिखना आसान है

  1. C पुस्तकालयों को अधिकांश प्रोग्रामिंग भाषाओं (आमतौर पर संकलित एक्सटेंशन, या PyPy की ctypesलाइब्रेरी आदि) जैसी चीजों से बुलाया जा सकता है

  2. सभी फ़ंक्शन सरल डेटा-प्रकारों को तर्क के रूप में लेते हैं (बूलियन, पूर्णांक, फ्लोटिंग बिंदु, स्थिरांक, सरणियाँ), क्योंकि फ़ंक्शन लेने वाले फ़ंक्शन कुछ भाषाओं में अनुवाद करने के लिए अजीब हो सकते हैं।

  3. इसके पास स्वयं के संख्यात्मक डेटा प्रकार हैं, जो सटीक और हस्ताक्षरित निर्दिष्ट करते हैं (जबकि int floatआदि भिन्न हो सकते हैं)

परिणामी API आवश्यक रूप से सबसे अच्छा उपयोग करने वाला C API नहीं है जिसे आप केवल C उपयोगकर्ताओं को लक्षित करके लिख सकते हैं। हालांकि इसका मतलब है कि फ़ंक्शन लगभग सीधे किसी अन्य भाषा (जैसे PyOpenGL) के संपर्क में आ सकते हैं डॉक्स सूचीबद्ध करते हैं, जिनमें से अधिकांश सुंदर हैं)

इस वर्बोज़ एपीआई के शीर्ष पर, आप इसके चारों ओर "डेवलपर के अनुकूल" रैपर लिख सकते हैं (गेम फ्रेमवर्क और इस तरह)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.