كيف تستخدم لغة C لإنتاج جوهرة الياقوت؟
-
27-09-2019 - |
سؤال
أود أن أرى بعض التعليمات البرمجية المصدر أو ربما رابط للبعض يعطي على الأقل كعبًا لكتابة جواهر روبي بلغات 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 مرة أسرع!