如何编译Ruby?
有没有一个工具可以让我编译Ruby代码,以便它运行得更快?
例如,我听说有一个名为“pyc”的Python工具允许我们编译代码,因此运行速度提高了10倍。
简单的答案是你不能,至少用MRI 1.8(标准)。 这是因为1.8通过遍历抽象语法树来工作。 Python,Ruby 1.9,JRuby和Rubinius使用字节代码,允许编译为中间表示(字节代码)。 从MRI Ruby 2.3可以很容易地做到这一点,请参阅下面的答案 。
使用Rubinius,您可以执行此帖中所述的操作: http : //rubini.us/2011/03/17/running-ruby-with-no-ruby/
在JRuby中,你可以使用“Ahead Of Time”编译器,我相信,jrubyc。
这不是真正的标准处理方式,而且通常让你的Ruby实现像它想要的那样处理它。 Rubinius至少会在第一次编译后缓存字节代码,并根据需要进行更新。
在2013年初,没有办法将Ruby转换为C / C ++源代码然后进行编译。
但是,我听说Matz(Yukihiro Matsumoto)说研究人员正在日本创造这个工具。 该项目应由日本政府建立。
否则你可以使用JRuby并用Java字节码编译它,或者你可以使用Rubinius。 Rubinius在Rubinius VM的字节码(JIT编译器)中自动编译。 可以将Rubinius的字节码转换为LLVM IR,LLVM可以生成机器码。
检查Unholy git repo
我知道这是一个老问题,但我发现了一个非常有趣的项目,可以为您的问题提供答案: http : //crystal-lang.org/
它基本上将Ruby编译为本机机器代码。 这不完全正确,因为Crystal不完全是Ruby,您可能需要对代码进行一些修改。 还有一些图书馆不受支持(但是)对我来说这看起来非常有前景。
从ruby 2.3.0
很容易地将源代码编译为Ruby-VM理解的字节码。
byte_code = RubyVM::InstructionSequence.compile_file '/home/john/somefile.rb' File.binwrite '/home/john/bytecode', byte_code.to_binary
并在命令行中
$ cat bytecode YARB IUsx86_64-linux*.*1 +1 !AA*1 !qy yyQ E/home/john/somefile.rbEE EshivaEhelloEAEputsEcore#define_methodu 5M
文件的内容
class A def shiva puts 'hello' end end
什么目的?
好吧,ruby需要时间将源代码编译成字节代码,因此您可以将字节码直接加载到ruby中并执行。 没有语法检查和编译的开销。 它比正常流程快得多。
如何加载字节码?
bytecode = File.readbin('/home/john/bytecode') instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary byte_code instruction_from_byte_code.eval # => :shiva
注意 :此答案仅在MRI中进行测试。 它可能或可能不适用于其他Ruby实现