Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编译Ruby?_Ruby_Compilation - Fatal编程技术网

如何编译Ruby?

如何编译Ruby?,ruby,compilation,Ruby,Compilation,有没有一个工具可以让我编译Ruby代码,让它运行得更快 例如,我听说Python有一个名为“pyc”的工具,它允许我们编译代码,使其运行速度提高10倍。检查git repo简单的答案是,至少在MRI 1.8(标准)中,您不能。这是因为1.8通过遍历抽象语法树来工作。Python、Ruby 1.9、JRuby和Rubinius使用字节码,这允许编译为中间表示(字节码)。从MRI Ruby 2.3开始,实现这一点变得很容易,请参见下面的内容 有了Rubinius,你可以做这篇文章中描述的事情: 在J

有没有一个工具可以让我编译Ruby代码,让它运行得更快


例如,我听说Python有一个名为“pyc”的工具,它允许我们编译代码,使其运行速度提高10倍。

检查git repo

简单的答案是,至少在MRI 1.8(标准)中,您不能。这是因为1.8通过遍历抽象语法树来工作。Python、Ruby 1.9、JRuby和Rubinius使用字节码,这允许编译为中间表示(字节码)。从MRI Ruby 2.3开始,实现这一点变得很容易,请参见下面的内容

有了Rubinius,你可以做这篇文章中描述的事情:

在JRuby中,我相信可以通过jrubyc使用“提前”编译器


这并不是做事情的标准方式,一般来说,让Ruby实现按照它想要的方式处理它会更好。至少,Rubinius会在第一次编译后缓存字节码,并根据需要进行更新。

在2013年初,还没有办法将Ruby翻译成C/C++源代码,然后进行编译

然而,我听到Matz(松本由纪弘)说,一位研究人员正在日本创造这个工具。这个项目应该由日本政府建立


否则,您可以使用JRuby并用Java字节码编译它,也可以使用Rubinius。Rubinius为Rubinius VM自动编译字节码(JIT编译器)。可以将字节码中的Rubinius转换为LLVM IR,LLVM可以生成机器代码。

我知道这是一个老问题,但我发现了一个非常有趣的项目,可以为您的问题提供答案:


它基本上将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.rbE<main>E <class:A>EshivaEhelloEAEputsEcore#define_methodu����� 5M
目的何在? ruby需要时间将源代码编译成字节码,这样就可以将字节码直接加载到ruby中并执行。没有语法检查和编译的开销。它比正常过程快得多

如何加载字节码? 注意:此答案仅在MRI中测试。它可能在其他Ruby实现中工作,也可能不工作

下面的“自包含”ruby测试用例基于这个线程中的示例,来自名为illusionist的用户的评论/回答

#/usr/bin/env ruby
#==========================================================================
#此文件位于公共域中。
#此文件的代码基于
#2018年12月9日版本的:
#
#     https://stackoverflow.com/questions/5902334/how-to-compile-ruby
#
#这个文件已经过ruby版本的测试
#
#ruby 2.5.1p57(2018-03-29修订版63029)[x86_64-linux]
#
#-----样板文件的开始------------------------------------------
s_fp_home=ENV[“home”]。发送至
s_fp_tmp=s_fp_home+“/tmp”#使用/tmp可能存在安全风险
s_fp_demofolder=s_fp_tmp+“/ruby_字节码_用法_demo_01”
如果需要,定义创建文件夹(s_fp_in)
如果!目录存在吗?s_fp_in
目录mkdir(s_fp_in)
如果!目录存在吗?s_fp_in
raise(异常。新建(“\n\n文件夹创建失败。\n”+
“GUID=='d6e409cb-e072-4441-9421-22630190c2e7'\n”))
结束#如果
结束#如果
结束#创建#文件夹(如果需要)
如果需要,创建文件夹(s\U fp\U tmp)
如果需要,创建文件夹(s\U fp\U demofolder)
s_rand=“”

7.times{s_rand尝试从Ruby和Ruby on Rails应用程序中创建可执行文件

我所知道的术语“pyc”的唯一用途是作为字节码的文件扩展名。Cython是一种不同的语言,可以用来编写相当低级的代码,它很乐意与Python对话(它接受香草Python,但如果不添加类型注释,最多只能给你一个或百分之二个性能)。PyPy也可以加速加速,但你不会认为它是编译器,因为它是JIT编译器。还可以看到为什么这是一个有缺陷的想法。pyc只是字节码Python,它不是“10倍快”。,它以完全相同的速度运行,但是启动时间可能会稍微快一点,因为它不需要在开始时将python代码转换为字节码。我不建议使用unholy。它似乎主要是概念证明,它需要依赖python vm,为什么不回来呢?不,我认为有人正在开发类似H的东西php的ip跃点这很好,谢谢。我不得不使用
File.binread
而不是
File.readbin
,这是一个打字错误吗?也许,这是Ruby 2.4.1很好的一个,我们使用它,但它会给加载带有ffi的本机库带来困难,如果有本机库访问文件系统上的gem文件,您很可能会遇到麻烦
class A
  def shiva
    puts 'hello'
  end
end
bytecode = File.binread('/home/john/bytecode')
instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary bytecode

instruction_from_byte_code.eval
# => :shiva