سؤال

أود أن أرى بعض التعليمات البرمجية المصدر أو ربما رابط للبعض يعطي على الأقل كعبًا لكتابة جواهر روبي بلغات C (هل هذا ممكن أيضًا؟)

أيضًا ، قد يعلم البعض منكم أن Facebook يجمع بعض التعليمات البرمجية أصلاً كملحقات PHP لتحسين الأداء. هل يقوم أي شخص بذلك في القضبان؟ إذا كان الأمر كذلك ، فما هي تجربتك معها؟ هل وجدت أنه مفيد؟

شكرًا.

تعديل:أعتقد أنني سأجيب على سؤالي الخاص ببعض الأشياء التي تعلمتها اليوم ولكني سأترك السؤال مفتوحًا لإجابة أخرى لأنني أود أن أرى ما يقوله الآخرون حول هذا الموضوع

هل كانت مفيدة؟

المحلول

حسنًا ، لذا جلست صديقًا لي جيدًا مع C. لقد عرضت عليه روبي وهو يحفره. عندما التقينا الليلة الماضية أخبرته أنه يمكنك كتابة جواهر روبي في ج ، مما أثار اهتمامه. هنا هو ما وجدناه:

دروس/أمثلة

http://www.eqqon.com/index.php/ruby_c_extension

http://drnicwilliams.com/2008/04/01/writing-c-extensions-in-rubygems/

http://www.rubyinside.com/how-to-create-a-ruby-extension-in-c-in-under-5-minutes-100.html

Ruby-Doc (رمز المصدر Ruby.H)

http://ruby-doc.org/doxygen/1.8.4/ruby_8h-source.html

فيما يلي بعض التعليمات البرمجية المصدر التي كتبناها لاختبارها أيضًا:

افتح محطة:

prompt>mkdir MyTest
prompt>cd MyTest
prompt>gedit extconf.rb

ثم وضعت هذا الرمز في extconf.rb

# Loads mkmf which is used to make makefiles for Ruby extensions
require 'mkmf'

# Give it a name
extension_name = 'mytest'

# The destination
dir_config(extension_name)

# Do the work
create_makefile(extension_name)

احفظ الملف ثم اكتب mytest.c

#include "ruby.h"

// Defining a space for information and references about the module to be stored internally
VALUE MyTest = Qnil;

// Prototype for the initialization method - Ruby calls this, not you
void Init_mytest();

// Prototype for our method 'test1' - methods are prefixed by 'method_' here
VALUE method_test1(VALUE self);
VALUE method_add(VALUE, VALUE, VALUE);

// The initialization method for this module
void Init_mytest() {
MyTest = rb_define_module("MyTest");
rb_define_method(MyTest, "test1", method_test1, 0);
rb_define_method(MyTest, "add", method_add, 2);
}

// Our 'test1' method.. it simply returns a value of '10' for now.
VALUE method_test1(VALUE self) {
int x = 10;
return INT2NUM(x);
}

// This is the method we added to test out passing parameters
VALUE method_add(VALUE self, VALUE first, VALUE second) {
int a = NUM2INT(first);
int b = NUM2INT(second);
return INT2NUM(a + b);
}

من المطالبة التي تحتاجها بعد ذلك إلى إنشاء makefile عن طريق تشغيل extconf.rb:

prompt>ruby extconf.rb
prompt>make
prompt>make install

يمكنك بعد ذلك اختباره:

prompt>irb
irb>require 'mytest'
irb>include MyTest
irb>add 3, 4 # => 7

لقد أجرينا اختبارًا قياسيًا ، وقد أضف روبي 3 و 4 معًا 10 ملايين مرة ، ثم إجراء مكالمة إلى امتداد C 10 ملايين مرة أيضًا. وكانت النتيجة أن استخدام Ruby فقط استغرق 12 ثانية لإكمال هذه المهمة أثناء استخدام امتداد C استغرق 6 ثوانٍ فقط! لاحظ أيضًا أن معظم هذه المعالجة هي تسليم المهمة إلى C لإكمال المهمة. في أحد تلك البرامج التعليمية ، استخدم الكاتب عودة (تسلسل فيبوناتشي) وذكر أن امتداد C استغرق 51 مرة أسرع!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top