मैं एक साधारण प्रश्न का उत्तर देना चाहता हूँ…
Ruby में FFI क्या है ?
FFI का मतलब "विदेशी फ़ंक्शन इंटरफ़ेस" है।
यह अन्य प्रोग्रामिंग भाषाओं में परिभाषित कार्यों का उपयोग करने . का एक तरीका है ।
रूबी का एफएफआई मॉड्यूल आपको बाहरी पुस्तकालयों और कोड तक पहुंच प्रदान करता है जो आपके पास अन्यथा नहीं होता।
हम अक्सर इसका इस्तेमाल सी कोड के साथ काम करने के लिए करते हैं।
उदाहरणों में शामिल हैं :
- आरबी-सूचित करें
- रूबी-विप्स
- रूबी-एनएफसी
आप अपने स्वयं के प्रोग्राम लिख सकते हैं जो FFI मॉड्यूल की सहायता से FFI का उपयोग करते हैं।
कैसे?
आइए कुछ कोड उदाहरण देखें!
FFI मूल बातें:लोड हो रहा है और आयात कार्य
आप अपने द्वारा बनाए गए मॉड्यूल में FFI के कार्यों को शामिल करके उसके साथ काम कर सकते हैं।
इसे पसंद करें :
require 'ffi' module A extend FFI::Library end
फिर, मॉड्यूल के अंदर, हम ffi_lib
. का उपयोग करके एक लाइब्रेरी लोड करने जा रहे हैं विधि।
A C लाइब्रेरी, जैसे Windows में "DLL", या Linux में "SO", "प्रतीकों" या फ़ंक्शन परिभाषाओं की एक सूची निर्यात करती है जो एक प्रोग्राम दूसरों के उपयोग के लिए उपलब्ध कराता है।
आइए "libc", C के मानक पुस्तकालय की आवश्यकता है।
यहां बताया गया है :
module A extend FFI::Library ffi_lib 'c' end
अब :
आप इस पुस्तकालय से रूबी विधियों के रूप में विशिष्ट कार्यों को आयात कर सकते हैं।
attach_function
के साथ विधि।
यहां एक उदाहरण दिया गया है :
module A extend FFI::Library ffi_lib 'c' attach_function :strlen, [:string], :int end A.strlen("abc") # 3का विस्तार करें
यह कैसे काम करता है?
सबसे पहले, हम जानते हैं कि C में strlen
. नामक एक फंक्शन है , यह फ़ंक्शन chars *
. लेता है एक तर्क के रूप में।
chars *
String
. में अनुवाद करता है रूबी में।
फिर…
यह strlen
फ़ंक्शन एक मान देता है, जो स्ट्रिंग की लंबाई है।
दूसरे शब्दों में, attach_function
3 पैरामीटर लेता है:
- सी फ़ंक्शन का नाम
- तर्क प्रकारों की एक सरणी
- एक वापसी प्रकार
यह पता लगाने के लिए कि कोई विशेष फ़ंक्शन किस प्रकार के साथ काम करता है, आपको दस्तावेज़ीकरण पढ़ना होगा।
एक और उदाहरण के लिए समय!
अपना खुद का मीडिया प्लेयर बनाएं
आपको खेलने के लिए कई दिलचस्प पुस्तकालय मिल सकते हैं।
Linux में, अधिकांश /usr/lib/
. के अंतर्गत पाए जाते हैं निर्देशिका, उनके नाम में "lib" से शुरू होती है और "so" एक्सटेंशन के साथ समाप्त होती है।
उन्हें इस तरह सूचीबद्ध करें :
ls /usr/lib/lib*.so
इस उदाहरण के लिए, हम VLC की मीडिया प्लेयर लाइब्रेरी का उपयोग करने जा रहे हैं :
/usr/lib/libvlc.so
हमारा लक्ष्य एक mp3 फ़ाइल लोड करना और उसे चलाना है!
आइए इसे शुरू करें :
require 'ffi' module VLC extend FFI::Library ffi_lib 'vlc' attach_function :libvlc_get_version, [], :string endको बढ़ाएं।
यह आपको यह जांचने की अनुमति देता है कि पुस्तकालय सही ढंग से लोड हो रहा है या नहीं और फिर उसका संस्करण प्रिंट करें।
इसे पसंद करें :
VLC.libvlc_get_version # "3.0.6 Vetinari"
आप एक चौथा पैरामीटर जोड़कर इन विधियों को एक कस्टम नाम दे सकते हैं।
उदाहरण :
attach_function :get_version, :libvlc_get_version, [], :string
तब आप कर सकते हैं :
VLC.get_version
एमपी3 चलाने के लिए अब हमें क्या चाहिए?
यदि हम दस्तावेज़ीकरण को देखें, तो libvlc_media_player_play
फ़ंक्शन जाने का रास्ता जैसा दिखता है।
इस फ़ंक्शन को मीडिया प्लेयर "ऑब्जेक्ट" की आवश्यकता है।
मीडिया प्लेयर को मीडिया की जरूरत होती है, और मीडिया को वीएलसी इंस्टेंस की जरूरत होती है।
यह रही प्रक्रिया :
VLC instance -> media -> media_player -> play
मैंने libVLC
. के दस्तावेज़ीकरण को पढ़कर इसे एक साथ जोड़ दिया है ।
रूबी में मेमोरी पॉइंटर्स???
सी में आपको कोई ऑब्जेक्ट नहीं मिलेगा, सब कुछ मेमोरी पॉइंटर्स के साथ संभाला जाता है।
मेमोरी पॉइंटर डेटा के साथ एक मेमोरी एड्रेस होता है।
आइए एक कोड उदाहरण देखें :
module VLC extend FFI::Library ffi_lib 'vlc' attach_function :get_version, :libvlc_get_version, [], :string attach_function :new, :libvlc_new, [:int, :int], :pointer end VLC.new(0, 0) # FFI::Pointer address=0x000055c6f04ae7b0
कॉल करने के परिणामस्वरूप VLC.new
हमें एक पॉइंटर मिलता है।
हमें इसे अन्य सी कार्यों के साथ पास करना होगा जिन्हें इसकी आवश्यकता है।
अब :
पूरा उदाहरण और इसका उपयोग कैसे करें।
module VLC extend FFI::Library ffi_lib 'vlc' attach_function :version, :libvlc_get_version, [], :string attach_function :new, :libvlc_new, [:int, :int], :pointer attach_function :libvlc_media_new_path, [:pointer, :string], :pointer attach_function :libvlc_media_player_new_from_media, [:pointer], :pointer attach_function :play, :libvlc_media_player_play, [:pointer], :int attach_function :stop, :libvlc_media_player_stop, [:pointer], :int attach_function :pause, :libvlc_media_player_pause, [:pointer], :int end
यह कुछ संगीत चलाने के लिए पर्याप्त है :
vlc = VLC.new(0, 0) media = VLC.libvlc_media_new_path(vlc, "/home/jesus/Downloads/meditation.mp3") player = VLC.libvlc_media_player_new_from_media(media) VLC.play(player)
यह किसी भी प्रकार के दृश्य इंटरफ़ेस को खोले बिना संगीत चलाएगा।
आप इसके ऊपर अपना खुद का वेब इंटरफेस बना सकते हैं।
इसे आज़माएं!
सारांश
आपने FFI
. की अद्भुत शक्ति के बारे में जान लिया है ! एक रूबी मॉड्यूल जो आपको बाहरी पुस्तकालयों का उपयोग करने की अनुमति देता है जैसे कि वे स्वयं भाषा का हिस्सा थे।
कृपया इस लेख को शेयर करें ताकि अधिक से अधिक लोग इसका आनंद उठा सकें 🙂
पढ़ने के लिए धन्यवाद!