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

时间:2009-12-29 00:53:27

标签: ruby

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

6 个答案:

答案 0 :(得分:40)

我在问题“much more detailed answer to this question”中写了Can Ruby, PHP, or Perl create a pre-compiled file for the code like 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找到了困难的方法,甚至完成了所有这些工作,并聘请了一些最聪明的密码学家和数学家,并不能保证成功。

唯一真正的解决方案不是技术解决方案,而是社交解决方案:只要您编写了代码,自动完全受版权法保护,没有您不得不做一件事。而已。您的代码受到保护。

答案 1 :(得分:7)

简短回答是“是”,

检查rubini.us

它将解决您的问题。

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

没有MRI解释器,没有。

一些较新的虚拟机正在处理这个问题,但目前还没有广泛使用(或者甚至可以使用)。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)