编译阻止了什么?

What does compiling prevent?

RubyVM可以将Ruby代码编译成字节码,然后直接执行。例如,

COMPILE.rb

File.write(ARGV[1],RubyVM::InstructionSequence.compile_file(ARGV[0]).to_binary)

EXECUTE.rb

RubyVM::InstructionSequence.load_from_binary(File.read(ARGV[0]).force_encoding(Encoding::ISO_8859_1)).eval

Test.bat

ruby COMPILE.rb test.rb test.rbx
ruby EXECUTE.rb test.rbx

test.rb 本身的 ruby 代码实际执行。这里有什么明显的缺点吗?一位朋友建议您可能要小心,因为它可能不会在其他操作系统上结束 运行ning。但是我希望它适用于所有操作系统,例如像 Java 字节码,它可以 运行 在所有操作系统上,因为它们由 JVM 执行。

将 Ruby 编译为字节码是否有任何明显的缺点(当然除了可读性)?

Ruby 没有标准化的字节码格式。因此,无论你在那里有什么,它都是 不是 "Ruby byte code",它是 one 版本 one 的字节码 执行 Ruby.

在您的特定情况下,它是 YARV 的字节码。它不适用于 MRuby、JRuby、Rubinius、Opal、MagLev、IronRuby、Topaz、MRI 或任何其他 Ruby 实现。

此外,YARV 不保证其字节码的向前或向后兼容性,因此不能保证它适用于较新或较旧版本的 YARV。 The documentation says:

The instruction sequence results will almost certainly change as Ruby changes

同样,YARV 不保证字节码的可移植性,因此不能保证它可以在不同的操作系统、不同的 CPU 或不同的平台上工作,即使使用相同版本的 YARV。

最后,YARV的字节码不安全,没有校验器。 YARV 会愉快地执行任何不安全的字节代码而不进行检查,并且您可以构建使 VM 处于不安全状态的字节代码。因此,您应该永远不要使用您自己未创建的且完全在您自己控制之下的字节码来执行此操作。 The documentation says:

This loader does not have a verifier, so that loading broken/modified binary causes critical problem.

You should not load binary data provided by others. You should use binary data translated by yourself.

请注意,关于您的具体问题:

Are there any obvious downsides that come with compiling Ruby to byte code, (except of course readability)?

您似乎误以为您主动需要做一些特殊的事情才能将 Ruby 编译为字节码。这不一定是真的。

如果您使用 YARV、Rubinius、MRuby、MagLev 或 Topaz,那么您的 Ruby 代码总是 编译为字节码,没有你必须做任何事情。使用 IronRuby 和 JRuby,它可能会或可能不会被编译为字节码,这取决于代码是否 "hot" 足够。

此外,使用 MagLev,如果 "hot" 足够,您的字节代码将被编译为本机代码,使用 Rubinius 和 YARV,它 可能 被编译为本机代码代码取决于版本,对于 IronRuby 和 JRuby,CIL/JVM 字节代码可能会编译为本机代码,具体取决于 CLI VES/JVM 实现。