将Ruby转换为低级语言?

nev*_*ame 13 ruby

我用Ruby编写了各种脚本:

rails (symfony)
ruby (php, bash)
rb-appscript (applescript)
Run Code Online (Sandbox Code Playgroud)

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

我用Ruby编写并将其转换为java,c ++或c.

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

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

第二个优点是您不必学习其他语言.

就像HipHop for PHP一样.

这有实现吗?

小智 13

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

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

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

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

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

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

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

  • @Dorian 我写的(两年前-.-)仍然是真的。JIT 编译器回避了我提到的问题,至少在某些时候,但这并没有使问题变得不那么重要。AOT 编译,这就是这个问题和我的答案的内容,在优化动态语言方面仍然并将永远无效。 (2认同)

Ear*_*rlz 10

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


Tom*_*art 7

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

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

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

  • @Anwar最有可能吗?现实. (2认同)

jer*_*jer 5

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

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

更长的答案是这样的:

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

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

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

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

  • @ajsie:一个(任何)编译器需要非常**聪明才能在任何地方产生代码,就像用[目标语言]程序员一样用[目标语言]编写的扩展一样高效.C/C++编译器现在非常聪明,因此他们在90%的案例中击败了所有汇编程序员的90%,但是他们有几个世纪以及许多大公司的支持来实现这一目标.但是任何一个开源组可能在10年内生成的Ruby-> C编译器仍然会写得很好. (3认同)