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

use*_*895 25 ruby

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

Jör*_*tag 40

我在" 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允许这样做.(实际上,它必须具有该功能,因为它的Ruby编译器是用Ruby编写的,因此编译器必须首先编译为Rubinius字节码,以便解决Catch-22.)

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

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

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

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

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

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


lin*_*ida 7

简短的回答是"是",

检查rubini.us

它会解决你的问题.

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

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


rfu*_*duk 2

MRI 解释器不行,不行。

一些较新的虚拟机正在开发中,但目前尚未广泛使用(甚至尚未准备好使用)。