Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी सी एक्सटेंशन कैसे लिखें (चरण-दर-चरण)

C एक्सटेंशन लिखने से आप C से रूबी के साथ इंटरैक्ट कर सकते हैं।

यदि कोई विशेष महत्वपूर्ण तरीका है जिसे आप C की गति के साथ अनुकूलित करना चाहते हैं, या यदि आप C लाइब्रेरी और रूबी के बीच एक इंटरफ़ेस बनाना चाहते हैं, तो आप ऐसा कर सकते हैं।

एक विकल्प FFI मॉड्यूल का उपयोग करना होगा।

अब :

आइए जानें कि C एक्सटेंशन कैसे लिखा जाता है!

आपका पहला C एक्सटेंशन

extconf.rb . नाम की एक फाइल बनाएं इन सामग्रियों के साथ:

require 'mkmf'

create_header
create_makefile 'foobar'

फिर ruby extconf.rb चलाएं जो आपके लिए कुछ फ़ाइलें बनाएगा (Makefile &extconf.h ) इन फ़ाइलों को न बदलें।

अब foobar.c create बनाएं , यह नाम create_makefile . से आया है extconf.rb . में लाइन . आप चाहें तो इसे बदल सकते हैं लेकिन इसे आपके .c . से मेल खाना होगा इसके काम करने के लिए फ़ाइल नाम।

अंदर foobar.c आप इसे जोड़ें:

#include "ruby.h"
#include "extconf.h"

void Init_foobar()
{
  // Your C code goes here
}

यह आपके सी एक्सटेंशन का मूल कंकाल है। ध्यान दें कि आपको extconf.rb . पर घोषित नाम का उपयोग करना होगा प्लस शब्द Init_ . इस मामले में Init_foobar

आप इसे make . चलाकर कंपाइल कर सकते हैं , और आपको जो मिलता है वह एक so है फ़ाइल जिसे आप require . का उपयोग करके अपने रूबी एप्लिकेशन में लोड कर सकते हैं ।

C से रूबी मेथड लिखना

आप c फ़ंक्शंस बना सकते हैं जिन्हें आप अपने रूबी कोड से कॉल कर सकते हैं। इस तरह से बिल्ट-इन क्लास और तरीके काम करते हैं।

सभी रूबी विधियों को VALUE return वापस करना होगा . एक VALUE एक रूबी वस्तु है।

उदाहरण :

VALUE rb_return_nil() {
  return Qnil;
}

अब हमें इस फ़ंक्शन को रूबी क्लास या मॉड्यूल से जोड़ना होगा। आप एक नया वर्ग बना सकते हैं या किसी मौजूदा का उपयोग कर सकते हैं।

यहां मैं एक मॉड्यूल बना रहा हूं :

void Init_foobar() {
  VALUE mod = rb_define_module("RubyGuides");

  rb_define_method(mod, "return_nil", rb_return_nil, 0);
}

आप rb_define_method . का उपयोग कर सकते हैं सी फ़ंक्शन को इस मॉड्यूल में संलग्न करने की विधि।

तर्क हैं :

तर्क विवरण
mod मॉड्यूल ऑब्जेक्ट
“print_hello” रूबी विधि का नाम
rb_print_hello C फंक्शन का नाम
0 इस विधि द्वारा लिए जाने वाले तर्कों की संख्या, चर तर्कों के लिए -1 का उपयोग करें

अब make run चलाएँ एक्सटेंशन को फिर से संकलित करने के लिए, और इसे इस तरह आज़माएँ:

require 'foobar'

include RubyGuides
print_hello

आप वहाँ जाएँ, आपने अभी-अभी रूबी से C फ़ंक्शन को कॉल किया है!

C से रूबी हैश बनाना

अक्सर आप C से रूबी ऑब्जेक्ट बनाना और उसमें हेरफेर करना चाहेंगे।

आप C API का उपयोग करके ऐसा कर सकते हैं।

उदाहरण के लिए, हैश बनाने और उसमें कुछ तत्व जोड़ने के लिए:

VALUE create_hash() {
  hash = rb_hash_new();

  rb_hash_aset(hash, rb_str_new2("test"), INT2FIX(1));
  return hash;
}

यहां ध्यान देने योग्य दो महत्वपूर्ण बातें, पहला rb_str_new2 फ़ंक्शन, यह रूबी स्ट्रिंग बनाता है।

फिर INT2FIX मैक्रो, यह एक नियमित पूर्णांक को रूबी पूर्णांक में परिवर्तित करता है।

अब यदि आप rb_define_method . का उपयोग करके इस फ़ंक्शन को रूबी में उजागर करते हैं आपको एक कुंजी के साथ एक नियमित रूबी हैश मिलेगा (test ) और 1 . का मान ।

हर बार परिवर्तन करने पर अपने एक्सटेंशन को पुन:संकलित करना न भूलें 🙂

स्ट्रिंग्स के साथ कार्य करना

आपके सी फ़ंक्शन भी पैरामीटर ले सकते हैं।

उदाहरण के लिए:

VALUE rb_print_length(VALUE self, VALUE str) {
  if (RB_TYPE_P(str, T_STRING) == 1) {
    return rb_sprintf("String length: %ld", RSTRING_LEN(str));
  }

  return Qnil;
}

void Init_foobar()
{
  rb_define_global_function("print_length", rb_print_length, 1);
}

यहां हम एक VALUE ले रहे हैं (रूबी ऑब्जेक्ट) एक तर्क के रूप में और फिर हम सुनिश्चित करते हैं कि यह RB_TYPE_P के साथ एक स्ट्रिंग है मैक्रो। उसके बाद, हम केवल RSTRING_LEN . का उपयोग करके स्ट्रिंग की लंबाई प्रिंट करते हैं मैक्रो।

यदि आप स्ट्रिंग डेटा के लिए एक पॉइंटर चाहते हैं तो आप RSTRING_PTR . का उपयोग कर सकते हैं मैक्रो।

उदाहरण :

VALUE rb_print_data(VALUE self, VALUE str) {
  if (RB_TYPE_P(str, T_STRING) == 1) {
    return rb_sprintf("String length: %s", RSTRING_LEN(str));
  }

  return Qnil;
}

यह भी देखें कि यहाँ एक और पैरामीटर कैसे है, self , यह विधि कॉल प्राप्त करने वाली वस्तु है।

यदि आप इस विधि को स्ट्रिंग वर्ग पर ही परिभाषित करना चाहते हैं तो आप इसे इस प्रकार करेंगे:

void Init_foobar()
{
  rb_define_method(rb_cString, "print_length", rb_print_length, 0);
}

सारांश

आपने सीखा कि रूबी के लिए सी एक्सटेंशन कैसे लिखना है ताकि आप अपने रूबी कार्यक्रमों से सी की सारी शक्ति तक पहुंच सकें। आपने यह भी सीखा कि रूबी में सी फ़ंक्शन को कैसे उजागर किया जाए और सी से रूबी ऑब्जेक्ट्स जैसे स्ट्रिंग्स और हैश के साथ कैसे काम किया जाए।

यदि आपको रूबी से सी के साथ बातचीत करने के लिए और अधिक कार्यों की आवश्यकता है, तो आपको उन्हें रूबी के स्रोत कोड में ढूंढना पड़ सकता है और सी एक्सटेंशन कोड पढ़ना पड़ सकता है क्योंकि यह अच्छी तरह से प्रलेखित नहीं है।

आशा है कि आपको यह लेख उपयोगी और रोचक लगा होगा! अगर आपने किया है तो कृपया इसे अपने दोस्तों के साथ साझा करें ताकि वे भी इसका आनंद उठा सकें।


  1. रूबी में स्ट्रक्चर और ओपनस्ट्रक्चर का उपयोग कैसे करें?

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

  1. रूबी में पोर्ट स्कैनर कैसे लिखें?

    आप पोर्ट स्कैनर क्यों लिखना चाहेंगे? पोर्ट स्कैनर लिखना टीसीपी प्रोटोकॉल की मूल बातें सीखने का एक शानदार तरीका है, जो कि ट्रांसपोर्ट लेयर है। अधिकांश इंटरनेट प्रोटोकॉल (HTTP और SSH सहित) द्वारा उपयोग किया जाता है। रूबी नेटवर्क प्रोग्रामिंग कैसे काम करती है, इसके बारे में अधिक जानने के लिए यह एक अच

  1. रूबी में फाइलें कैसे पढ़ें और लिखें (उदाहरण के साथ)

    आज आप रूबी में फाइलों को पढ़ना और लिखना सीखेंगे ताकि आप सामग्री को निकाल सकें, नई फाइलें बना सकें और अपनी जरूरत की जानकारी पा सकें! यहां बताया गया है कि हम क्या कवर करने जा रहे हैं : सामग्री 1 रूबी में फ़ाइलें कैसे पढ़ें 2 रूबी में फ़ाइल को कैसे लिखें 3 रूबी फ़ाइल विधियाँ 4 निर्देशिका संचालन 5