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.