Ruby预编译库

时间:2016-04-04 15:07:36

标签: ruby libraries

例如我在我的ruby项目中安装了devise gem,我可以看到它的所有源代码。是否有可能以预编译二进制形式存在没有源代码的库?像.Net中的汇编一样?如何在没有gem包管理器的情况下手动将其添加到项目中?

3 个答案:

答案 0 :(得分:0)

不,这在Ruby中是不可能的。你在Ruby中最接近的是包装预编译库的扩展。例如Nokogiribcrypt-ruby

答案 1 :(得分:0)

简短的回答是否定的。

Ruby不是一种编译语言。尽管YARV动态编译源代码,但它不会生成字节代码。 Ruby,Rubinius的唯一编译实现不保证不同版本之间的字节代码兼容性(即使在次要版本中)。

答案 2 :(得分:0)

Ruby没有Ruby语言本身以外的代码的可移植格式。它拥有的唯一其他可移植格式是Marshal格式,但这仅适用于数据,它不能序列化代码,即所有方法,Proc s,lambdas和块都将被省略和/或导致错误。

请注意,这实际上与其他语言没有什么不同。例如。 Java语言和JVM字节码语言是两种不同规范中定义的两种不同语言。无法保证Java的实现还包括JVML的实现,反之亦然。例如,Avian只实现JVML,它不实现Java。而GWT只实现Java,而不是JVML。

例如,依赖于能够即时执行JVM字节码的Java应用程序(例如JRuby及其JIT编译器或Kilim并发框架)不能在Android上运行。 JRuby通过禁用Android上的JIT并运行纯粹的解释来解决这个问题。

JRuby和IronRuby都有Ahead-Of-Time编译器,分别编译Ruby到JVML字节码和CLI CIL字节码。 Opal有一个Ahead-Of-Time编译器,可以将Ruby编译为ECMAScript。

YARV有一个编译Ruby到YARV字节码的Ahead-Of-Time编译器,但是,该字节码通常直接馈送到YARV字节码VM,并且永远不会持久存在或暴露在任何地方。并且有一个很好的理由:YARV字节码是不安全的,YARV VM隐含地相信编译器只会生成不会破坏VM的代码。如果编译器是VM的一部分,这是一个合理的假设,但是如果你允许从外部源读入字节码,那么你就不知道编译器是什么产生的,你可以得到VM处于不一致的状态。

为了防止这种情况,必须将字节码更改为安全,或者VM需要字节码验证器。

可以实际访问字节码,并且通过一些工作,可以从文件读取并执行,但由于我概述的原因,这是不安全的。

Rubinius支持在文件中写入和读取字节码,但这并不是用于分发字节码存档。 Rubinius使用它来缓存编译的字节码作为延迟优化(类似于CPython的工作方式)。 Rubinius曾经有一个类似于JVM .class.jar文件(.rbc.rba)的功能,您可以在其中加载.rba存档中的代码,但我不确定它是否仍然存在。

因此,一些Ruby实现对某种形式的字节码编译有一定程度的支持,但没有一种可靠地工作,而且没有一种可以在Ruby实现中移植。