将Ruby转换为低级语言?

时间:2010-08-22 19:25:31

标签: ruby

我使用Ruby编写了所有脚本:

rails (symfony)
ruby (php, bash)
rb-appscript (applescript)

是否可以用Ruby替换低级语言?

我在Ruby中编写并将其转换为java,c ++或c。

原因人们说当涉及到Ruby中更多性能关键任务时,你可以用C扩展它。但是,这个词意味着你编写你刚刚在Ruby代码中调用的C文件。我想,我可以改用Ruby并将其转换为C源代码,将其编译为机器代码。然后我可以用C语言“扩展”它,但是在Ruby代码中。

这就是这篇文章的内容。用Ruby编写所有内容但获得C(或Java)的性能。

第二个好处是你不必学习其他语言。

就像HipHop for PHP。

是否有此实现?

6 个答案:

答案 0 :(得分:13)

这样的编译器将是一项巨大的工作。即使它有效,它仍然必须

  1. 包含ruby运行时
  2. 包括标准库(不是为了性能而是为了可用性而构建的)
  3. 允许元编程
  4. 做动态调度
  5. 所有这些都会造成巨大的运行时间损失,因为C编译器既不能理解也不能优化这种抽象。 Ruby和其他动态语言不仅因为它们被解释(或编译为字节码然后被解释)而变慢,而且因为它们是动态的。

    实施例

    在C ++中,在大多数情况下可以内联方法调用,因为编译器知道this的确切类型。如果传递了子类型,则该方法仍然无法更改,除非它是虚拟的,在这种情况下使用仍然非常有效的查找表。

    在Ruby中,类和方法可以随时以任何方式改变,因此每次都需要(相对昂贵的)查找。

    Ruby,Python或Perl等语言有很多 昂贵的功能,大多数(如果不是所有)相关程序都非常依赖这些功能(当然,它们非常有用!),所以无法删除或内联。

    简单地说:动态语言非常难以优化,只需执行解释器所做的操作,并将其编译为机器代码不会削减它。正如V8所证明的那样,动态语言可以获得令人难以置信的速度,但你必须投入大量资金和办公室里充满了聪明的程序员。

答案 1 :(得分:10)

https://github.com/seattlerb/ruby_to_c Ruby To C编译器。它实际上只涉及Ruby的一个子集。我认为主要的缺失部分是元编程功能

答案 2 :(得分:7)

在最近的采访中(2012年11月16日)Yukihiro“Matz”Matsumoto(Ruby的创建者)谈到了将Ruby编译为C

  

(...)在东京大学,一名研究生正在研究一个学术研究项目,该项目在编译二进制代码之前将Ruby代码编译成C代码。该过程涉及类型推断等技术,在最佳情况下,速度可达到典型手写C代码的90%。到目前为止,只有一篇论文发表,还没有开源代码,但我希望明年一切都会被揭示......(from interview

只有一个学生并不多,但这可能是一个有趣的项目。完全支持Ruby可能还有很长的路要走。

答案 3 :(得分:5)

“低级别”是非常主观的。许多人以不同的方式划清界限,所以为了这个论点,我只是假设你的意思是将Ruby编译成一个中间形式,然后可以将其转换为特定平台的机器代码。即,将ruby编译为C或LLVM IR,或者那种性质的东西。

简短的回答是肯定的。这是可能的。

更长的答案是这样的:

多种语言(最值得注意的是Objective-C)作为其他语言的薄层存在。出于所有实际目的,ObjC语法实际上只是一个围绕objc _ *()libobjc运行时调用的松散包装器。

知道这一点,那么编译器会做什么?好吧,它基本上可以像任何C编译器一样工作,但也可以使用objc特定的东西,并生成适当的C函数调用以与objc运行时进行交互。

ruby​​编译器可以用类似的术语实现。

然而,还应该注意的是,仅仅通过将一种语言转换为较低级别的形式并不意味着语言会立即表现得更好,但这并不意味着它也会表现更差。你真的要问自己为什么要这样做,如果这是一个很好的理由。

答案 4 :(得分:3)

如果您仍然认为Java是一种低级语言,那么还有JRuby。实际上,语言本身几乎没有什么可做的:可以编译为JVM字节码,它独立于语言。

答案 5 :(得分:3)

性能不仅仅来自“低级”编译语言。将Ruby程序交叉编译为复杂的,自动生成的C代码也无济于事。这可能会让事情变得混乱,包括编译时间长等等。还有更好的方法。

但是你先说“低级语言”然后提到Java。 Java不是一种低级语言。在高级或低级语言方面,它仅比Ruby低一步。但是,如果你看看Java是如何工作的,JVM,字节码和即时编译,你可以看到高级语言如何快速(呃)。 Ruby目前正在做类似的事情。 MRI 1.8是一种解释性语言,并且存在一些性能问题。 1.9更快,它使用字节码解释器。我不确定它是否会在核磁共振成像上发生,但Ruby距离JIT只有一步之遥。

我不确定jRuby和IronRuby背后的技术,但他们可能已经这样做了。但是,两者各有利弊。我倾向于坚持MRI,它足够快,而且效果很好。