programas lenguaje funciones ejemplos comandos codigos caracteristicas basicos c ruby rubygems native-code

funciones - ¿Cómo se usa el lenguaje C para producir una gema de rubí?



lenguaje c++ (1)

Me gustaría ver algún código fuente o tal vez un enlace a algunos que brinde al menos un apéndice para escribir gemas de rubí en los idiomas C (¿C ++ es posible también?)

Además, algunos de ustedes sabrán que Facebook compila parte de su código de forma nativa como extensiones de php para un mejor rendimiento. ¿Alguien está haciendo esto en Rails? Si es así, ¿cuál ha sido tu experiencia con eso? ¿Has encontrado que es útil?

Gracias.

Editar: supongo que responderé a mi propia pregunta con algunas cosas que aprendí hoy, pero voy a dejar la pregunta abierta para otra respuesta porque me gustaría ver lo que otros tienen que decir sobre este tema


Ok, entonces senté a un amigo mío que está bien con C. Le he estado mostrando Ruby y él lo cava. Cuando nos encontramos anoche, le dije que podías escribir gemas de Ruby en C, lo que lo intrigaba. Esto es lo que encontramos:

Tutoriales / Ejemplos

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 (código fuente de ruby.h)

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

Aquí hay un código fuente que escribimos para probarlo también:

Abre una terminal:

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

Luego pones este código en 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)

Guarde el archivo y luego escriba 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); }

Desde el mensaje, debe crear un archivo Makefile ejecutando extconf.rb:

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

Luego puedes probarlo:

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

Hicimos una prueba comparativa e hicimos que Ruby sumara 3 y 4 juntos 10 millones de veces y luego realizamos una llamada a nuestra extensión C 10 millones de veces también. El resultado fue que usar solo ruby ​​tardó 12 segundos para completar esta tarea mientras que usar la extensión C solo tomó 6 segundos. También tenga en cuenta que la mayor parte de este procesamiento está entregando el trabajo a C para completar la tarea. En uno de esos tutoriales, el escritor utilizó recursividad (secuencia de Fibonacci) e informó que la extensión C tomó 51 veces más rápido.