¿Cómo comstackr Ruby?

¿Existe alguna herramienta que me permita comstackr el código de Ruby para que se ejecute un poco más rápido?

Por ejemplo, he escuchado que hay una herramienta para Python llamada “pyc” que nos permite comstackr el código, para que se ejecute 10 veces más rápido.

La respuesta simple es que no se puede, al menos con MRI 1.8 (el estándar). Esto se debe a que 1.8 funciona al caminar el árbol de syntax abstracta. Python, Ruby 1.9, JRuby y Rubinius utilizan el código de bytes, que permite la comstackción en una Representación intermedia (código de bytes). Desde MRI Ruby 2.3 ha sido fácil hacer esto, vea esta respuesta a continuación.

Con Rubinius, puedes hacer algo como se describe en este post: http://rubini.us/2011/03/17/running-ruby-with-no-ruby/

En JRuby puedes usar el comstackdor “Ahead Of Time” a través de, creo, jrubyc.

Esta no es realmente la forma estándar de hacer las cosas y, en general, es mejor dejar que la implementación de Ruby lo maneje como quiera. Rubinius, al menos, almacenará en caché el código de bytes después de la primera comstackción, actualizándolo según sea necesario.

A principios de 2013 no hay una manera de traducir Ruby a una fuente de C / C ++ y luego comstackrlo.

Sin embargo, escuché a Matz (Yukihiro Matsumoto) decir que un investigador está creando esta herramienta en Japón. El proyecto debe ser fundado por el gobierno japonés.

De lo contrario, podría usar JRuby y comstackrlo en el código de bytes de Java o podría usar Rubinius. Rubinius comstack automáticamente en byte-code (comstackdor JIT) para la máquina virtual de Rubinius. Es posible convertir Rubinius en byte-code en LLVM IR y LLVM puede generar código de máquina.

Compruebe el repository git Unholy

Sé que esta es una pregunta antigua, pero encontré un proyecto muy interesante que puede proporcionar una respuesta a su pregunta: http://crystal-lang.org/

Básicamente comstack Ruby a código de máquina nativo. Eso no es exactamente cierto porque Crystal no es exactamente Ruby y es posible que tengas que hacer algunas modificaciones en tu código. También hay bibliotecas que no son compatibles (todavía) pero para mí todo parece muy prometedor.

Desde ruby 2.3.0 es tan fácil comstackr su código fuente a códigos de bytes que el Ruby-VM entiende.

 byte_code = RubyVM::InstructionSequence.compile_file '/home/john/somefile.rb' File.binwrite '/home/john/bytecode', byte_code.to_binary 

y en linea de comando

 $ cat bytecode YARB  IUsx86_64-linux*.*1 +1 !AA*1 !qy        yyQ  E/home/john/somefile.rbE
E EshivaEhelloEAEputsEcore#define_methodu 5M

El contenido del archivo.

 class A def shiva puts 'hello' end end 

¿Cuál es el propósito?

Bueno, ruby ​​toma tiempo para comstackr su código fuente en códigos de bytes para que pueda cargar sus códigos de bytes directamente en ruby ​​y ejecutar. Sin sobrecarga de gramática de comprobación y comstackción. Es mucho más rápido que los procesos normales.

¿Cómo cargar código byte?

 bytecode = File.readbin('/home/john/bytecode') instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary byte_code instruction_from_byte_code.eval # => :shiva 

Nota : Esta respuesta se prueba solo en MRI . Puede o no funcionar en otras implementaciones de Ruby

    Intereting Posts