2011-04-09 6 views
8

official ruby About page के अनुसार पर्ल की तुलना में रूबी के साथ रूबी का विस्तार करना आसान है। मैं एक (perl) एक्सएस लड़का नहीं हूं, लेकिन मुझे Inline::C के साथ कुछ तेज़ और सरल लिखने के लिए यह गंदगी आसान है, तो रुबी में यह क्यों आसान है?रूल की तुलना में रूबी में सी इंटरफ़ेस को कैसे लिखना आसान है?

लेखन सी रूबी में एक्सटेंशन सी से रूबी बुला इस सॉफ्टवेयर में रूबी embedding, एक पटकथा भाषा के रूप में उपयोग के लिए के लिए कॉल भी शामिल के लिए पर्ल या पायथन में की तुलना में आसान, एक बहुत ही सुंदर एपीआई के साथ है। एक एसडब्ल्यूआईजी इंटरफ़ेस भी उपलब्ध है।

अधिक सी एक्सटेंशन करने वाले लोगों से कोई और स्पष्टीकरण उपयोगी होगा।

+5

मुझे लगता है कि इसमें एक गीक लड़ाई में गिरावट की संभावना है, और गीक लड़ाई के रूप में इतनी छोटी और व्यर्थ नहीं है। और, बीटीडब्ल्यू, [एड] (http://www.gnu.org/fun/jokes/ed.msg.html) >> vi> emacs, Linux> फ्रीबीएसडी, आदि –

+3

अभी तक कोई जवाब नहीं है - - आपके विचलित नकारात्मक अटकलों की कोई ज़रूरत नहीं है। –

+4

यदि आप चाहते हैं कि यह पूरी तरह से व्यक्तिपरक हो, तो आपको मार्केटिंग पेज पर एक बयान से अधिक संरचना प्रदान करनी होगी। शायद सवाल दोबारा दोहराएं? "सी एक्सटेंशन के उदाहरण प्रदान करें जो रूबी के साथ लिखना आसान है"? या शायद यहां तक ​​कि सरल ... "रूबी के साथ रूबी बढ़ाने के लिए एक अच्छा ट्यूटोरियल क्या है?" – Schwern

उत्तर

12

(पूर्ण प्रकटीकरण, मैं एक पर्ल प्रोग्रामर हूँ)

Ruby C API निश्चित रूप से Perl की तुलना में बहुत अच्छे लग रहा है। यह एक नियमित सी लाइब्रेरी की तरह दिखता है जो रूबी कोड से मेल खाता है। पर्ल एपीआई मैक्रोज़ और मैजिक थ्रेडिंग झंडे के भीतर मैक्रोज़ के भीतर मैक्रोज़ की गड़बड़ है। पर्ल कोर के बाहर पर्ल एपीआई का उपयोग निश्चित रूप से एक माध्यमिक चिंता है। रूबी निश्चित रूप से डरावनी रूप से डरावनी नहीं होने पर जीतता है।

जबकि रूबी के पास एक बेहतर सी एपीआई है, पर्ल के पास इसके साथ कुछ भी करने के तरीके पर बेहतर ट्यूटोरियल हैं। जेनरेट किए गए रूबी दस्तावेज में किसी प्रकार का संयोग ट्यूटोरियल या अक्सर कोई वर्णनात्मक पाठ नहीं होता है। यह संभव है कि मैं गलत जगह but that's all that was offered देख रहा हूं। इसके विपरीत, पर्ल एपीआई दस्तावेज हाथ से लिखित गद्य है जो प्रत्येक समारोह के बारे में उपयोगी जानकारी के साथ होता है। इसके अलावा, there's over a dozen documents in the core docs about using Perl and C। मैं कहूंगा कि पर्ल डॉक्स पर जीतता है।

एफएफआई काफी प्रभावशाली दिखता है। सबसे नज़दीकी चीज पर्ल को एफएफआई है Inline::C जो एक्सएस की गड़बड़ी के आसपास एक रैपर है। इसका प्राथमिक उपयोग inline C code into your Perl program है, लेकिन आप इसे access C library functions पर भी उपयोग कर सकते हैं।

यहां नाश के गेटपीड उदाहरण के समान एक मामूली उदाहरण है।

use Inline 
    C    => Config  => 
    ENABLE  => "AUTOWRAP"; 

use Inline C => q{ int getpid(); }; 

print getpid(); 

अब, मैं धोखा दे रहा हूँ क्योंकि तकनीकी रूप से getpid रिटर्न अपने सिस्टम पर pid_t, लेकिन वह सिर्फ एक पूर्णांक है। एफएफआई के पास गेटपिड के लिए बहुत अधिक विशेष कोड कोड है, इसलिए मुझे संदेह है कि इसका उपयोग आसानी से होगा, एफएफआई ने पहले से ही इसका ख्याल रखा है या नहीं। मामूली उदाहरण तुच्छ हैं। यह देखना दिलचस्प होगा कि सामान्य जटिलताओं के दौरान क्या होता है, जैसे कि पूर्व-आवंटित स्मृति को वापस करने वाले कार्यों और विषम प्रकार होते हैं और structs के चारों ओर फेंकते हैं।

जबकि एफएफआई और इनलाइन :: सी का उपयोग एक ही काम करने के लिए किया जा सकता है, वे यह कैसे बहुत अलग दिखते हैं। इनलाइन :: सी वास्तव में संकलन और सी कोड कैशिंग है। एफएफआई किसी भी तरह संकलन नहीं कर रहा है। मुझे यकीन नहीं है कि यह वास्तव में असली है, या यदि आपके लिए सामान्य पुस्तकालयों के लिए इंस्टॉलेशन समय पर संकलन किया जाता है।

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

+0

लड़का, किसी ऐसे व्यक्ति के लिए जो इस शब्द को स्वीकार करने में संकोच करता था, वैसे ही यह वही उत्तर है जिसे मैं ढूंढ रहा था। धन्यवाद! अगर मैं अधिक जबरदस्त भयानक नहीं हूं तो मैं इसे कुछ दिनों में स्वीकार करूंगा। –

+0

@ नाश के उत्तर में लापता संरचना प्रदान की गई। इसके अलावा एफएफआई ने मेरी जिज्ञासा पकड़ी। – Schwern

+0

पर्ल के लिए कुछ एफएफआई परियोजनाएं हैं –

6

FFI यह सी के साथ रूबी विस्तार करने के लिए बहुत आसान है के साथ इस github

require 'rubygems' 
require 'ffi' 
module Foo 
    extend FFI::Library 
    ffi_lib FFI::Library::LIBC 
    attach_function :getpid, [ ], :int 
end 
puts "My pid=#{Foo.getpid}" 

आप एक संकलक अपने सिस्टम पर स्थापित की जरूरत नहीं है FFI एक्सटेंशन चलाने के लिए सक्षम होने के लिए से एक उदाहरण है । लिनक्स पर, आप को पुस्तकालयों के संस्करणों को स्थापित करने की आवश्यकता नहीं है, केवल रनटाइम संस्करण। बेशक, जिन पुस्तकालयों के खिलाफ आप लिंक करते हैं उन्हें की आवश्यकता होगी ताकि पर संकलित किया जा सके, लेकिन बाधाओं को आपको करना नहीं होगा।

https://github.com/ffi/ffi/wiki/why-use-ffi

+0

AFAIK, समान मॉड्यूल पर्ल के लिए उपलब्ध हैं। –

+2

मैं उन लोगों को देखता हूं जो कहते हैं कि एफएफआई सूओ उपयोगी हैं, लेकिन वे असली दुनिया के जटिल डेटा प्रकारों के साथ कैसे किराया करते हैं? पूर्णांक और फ़्लोटिंग पॉइंट मानों को लपेटने का कार्य सीमित उपयोग का ही है। – tsee

+2

क्या जटिल प्रकार हैं? [https://github.com/ffi/ffi/wiki/Structs ](https://github.com/ffi/ffi/wiki/Structs), [https://github.com/ffi/ffi/wiki/ Enums] (https://github.com/ffi/ffi/wiki/Enums), [https://github.com/ffi/ffi/wiki/Types ](https://github.com/ffi/ffi/ विकी/प्रकार) –

संबंधित मुद्दे