rubyvm可以将ruby代码编译成字节码,然后直接执行。例如。,
汇编语言
File.write(ARGV[1],RubyVM::InstructionSequence.compile_file(ARGV[0]).to_binary)
RB
RubyVM::InstructionSequence.load_from_binary(File.read(ARGV[0]).force_encoding(Encoding::ISO_8859_1)).eval
球拍
ruby COMPILE.rb test.rb test.rbx
ruby EXECUTE.rb test.rbx
test.rb
本身的ruby代码实际上是执行的。这里有什么明显的缺点吗?一位朋友建议,人们可能需要小心,因为它可能不会在其他操作系统上运行。不过,我希望它可以在所有操作系统上工作,例如java字节码,它可以在jvm执行的所有操作系统上运行。编译ruby到字节的代码有什么明显的缺点吗(当然可读性除外)?
最佳答案
ruby没有标准的字节码格式。因此,无论您拥有什么,它都不是“ruby字节码”,而是一个ruby实现版本的字节码。
在您的特定情况下,它是yarv的字节码。它不会在mruby、jruby、rubinius、opal、maglev、ironruby、topaz、mri或任何其他ruby实现上工作。
此外,yarv不保证其字节码的前后兼容性,因此不能保证它能在较新或较旧版本的yarv上工作。The documentation says
指令序列结果几乎肯定会随着ruby的改变而改变
同样,yarv也不能保证字节码的可移植性,因此不能保证它能在不同的操作系统、不同的cpu或不同的平台上工作,即使使用相同版本的yarv。
最后,yarv的字节码是不安全的,并且没有验证器。yarv很乐意在不检查的情况下执行任何不安全的字节码,并且您可以构造使vm处于不安全状态的字节码。因此,您永远不应该对自己没有创建的字节码执行此操作,而字节码完全由您自己控制。The documentation says
此加载程序没有验证程序,因此加载损坏/修改的二进制文件会导致严重问题。
不应加载其他人提供的二进制数据。您应该使用自己翻译的二进制数据。
请注意,关于您的具体问题:
编译ruby到字节的代码有什么明显的缺点吗(当然可读性除外)?
您似乎有一种错误的印象,认为您需要做一些特殊的事情来编译ruby到字节的代码。这不一定是真的。
如果您使用yarv、rubinius、mruby、maglev或topaz,那么您的ruby代码总是编译成字节码,而不必做任何事情。使用ironruby和jruby,它可能被编译成字节码,这取决于代码是否足够“热”。
此外,使用maglev,如果字节码足够“热”,那么它将被编译为本机代码;使用rubinius和yarv,根据版本的不同,它可能被编译为本机代码;使用ironruby和jruby,根据cli ves/jvm实现,cil/jvm字节码可能被编译为本机代码。
关于ruby - 编译可以防止什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51581462/