是否可以像使用Python一样将Ruby编译为字节代码?

在Python中,如果我想提供一个没有源代码的应用程序,我可以将它编译成字节码.pyc,有没有办法在Ruby中做类似的事情?

我在“ Ruby,PHP或Perl可以为Python等代码创建预编译文件吗? ” 这个问题中写了一个更详细的答案

答案是:这取决于。 Ruby 语言没有规定编译为字节码和/或运行字节码。 它也没有字节码格式的说明。 原因很简单:如果语言实现者被迫使用特定的字节码格式,甚至根本不使用字节码,那么对语言实现者的限制就太大了。 例如,XRuby和JRuby编译为JVM字节码,Ruby.NET和IronRuby编译为CIL字节码,Cardinal编译为PAST,SmallRuby编译为Smalltalk / X字节码,MagLev编译为GemStone / S字节码。 对于所有这些实现,使用除当前使用的字节码格式之外的任何其他字节码格式将是非常愚蠢的,因为它们的全部要点与使用相同字节码格式的其他语言实现互操作。

Simlar for MacRuby:它编译为本机代码,而不是字节码。 再次,使用字节码将是愚蠢的,因为其中一个目标是在iPhone上运行Ruby,这几乎需要本机代码。

当然还有MRI,它是纯粹的AST行走脚本解释器,因此没有字节码格式。

话虽这么说,有一些Ruby 实现允许编译和从字节码加载。 例如,Rubinius允许这样做。 (实际上,它必须具有该function,因为它的Ruby编译器是用Ruby编写的,因此编译器必须首先编译为Rubinius字节码,以便解决Catch-22。)

YARV也可以保存和加载字节码,尽管加载function目前是禁用的,直到实现了一个字节码validation器,阻止用户加载可能崩溃或以其他方式破坏解释器的操作字节码。

但是,当然,这两者都有自己的字节码格式,并且彼此不了解(也不是tinyrb或者RubyGoLight或者……)而且,JVM或CLR都不能理解这些格式,反之亦然。

然而,重点是无关紧要,因为正如Mark指出的那样,你总是可以对字节代码进行逆向工程,特别是在像CPython,PyPy,Rubinius,YARV,tinyrb,RubyGoLightly这样的情况下,字节码格式专门设计为非常接近源语言。

通常,以这种方式保护代码根本不可能。 原因很简单:您希望机器能够执行代码。 (否则首先写它的重点是什么?)但是,为了执行代码,机器必须理解代码。 由于机器比人类笨重,因此任何人都可以理解机器可以理解的代码,无论代码是源forms,字节码,汇编,本机代码还是打卡片组。

只有一个可行的技术解决方案:如果您控制整个执行管道,即构建自己的CPU,您自己的计算机,您自己的操作系统,您自己的编译器,您自己的解释器等等,并使用强大的加密技术来保护所有那些, 然后 才有 可能保护你的代码。 然而,正如微软在XBox 360中发现的那样艰难,即使完成所有这些并雇用一些最聪明的密码学家和数学家,也不能保证成功。

唯一真正的解决方案不是技术解决方案而是社交解决方案:只要您编写了代码,它就会受到版权法的自动完全保护,而您无需执行任何操作。 而已。 您的代码受到保护。

简短的回答是“是”,

检查rubini.us

它会解决你的问题。

以下是编译ruby代码的方法:

http://rubini.us/2011/03/17/running-ruby-with-no-ruby/

虽然Ruby的1.9 YARV VM是一个字节码编译器,但我不认为它可以将字节码转储到磁盘上。 你可能想看看替代编译器, Rubinius ,我相信它有这种能力。 你应该注意到,字节码pyc文件(我想象ruby等价物)可以很容易地“反编译”。

没有MRI解释器,没有。

一些较新的VM正在研究它们在桌面上的位置,但是这些并没有被广泛使用(或者甚至可以随时使用)。

如果你使用Jruby,你可以将你的Ruby代码编译成Java .class文件(包括你的Rails东西),用(开放)jdk开箱即可执行它们!

您甚至可以将完整的东西编译成.war文件,使用名为“warbler”的工具将其部署到Apache Tomcat或Jboss上

https://rubygems.org/gems/warbler/