将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一样。

这有实现吗?

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

  1. 包括ruby运行时
  2. 包括标准库(不是为了性能而是为了可用性而构建的)
  3. 允许元编程
  4. 做动态调度
  5. 等等

所有这些都会造成巨大的运行时间损失,因为C编译器既不能理解也不能优化这种抽象。 Ruby和其他动态语言不仅因为它们被解释(或编译为字节码然后被解释)而变慢,而且因为它们是动态的。

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

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

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

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

有http://rubyforge.org/projects/ruby2c/ Ruby To C编译器。 它实际上只涉及Ruby的一个子集。 我相信主要的缺失部分是元编程function

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

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

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

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

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

更长的答案是这样的:

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

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

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

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

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

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

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

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