在选定的答案中 这个关于蓝色红宝石的问题, ,查克说:

所有当前的Ruby实现都汇编为字节码。与SAP的主张相反,截至Ruby 1.9,MRI本身包括一个字节编译器,尽管在合并Yarv虚拟机的过程中,将编译为字节码保存到磁盘的能力消失了。 Jruby被编译到Java .class文件中。我没有太多关于Maglev的细节,但是可以肯定地说这条路也是如此。

我对Ruby的这个汇编/解释问题感到困惑。

我了解到Ruby是一种解释的语言,这就是为什么当我将更改为Ruby文件时,我不需要重新构建项目的原因。

但是,如果现在所有的Ruby实施都汇编了,那么可以说Ruby是一种解释的语言吗?还是我误会了什么?

有帮助吗?

解决方案

是的,Ruby仍然是一种解释的语言,或者更确切地说,Matz的Ruby Exprenter(MRI),这是人们在谈论Ruby时通常谈论的内容,仍然是一名口译员。汇编步骤仅仅是为了将代码简化为执行速度比解释和重新解释相同的代码更快的速度。

其他提示

如今,如果您将字节码为编译,那么如今几乎每种语言都被“编译”。甚至emacs lisp也被编译。 Ruby是一个特殊情况,因为直到最近, 不是 编译为字节码。

我认为您可以质疑将语言描述为“编译”与“解释”的效用。但是,一个有用的区别是该语言是否直接从用户代码创建机器代码(例如X86汇编程序)。 C,C ++,许多Lisps和Java启用了JIT,但Ruby,Python和Perl却没有。

那些不了解更好的人都会称任何具有单独的手动汇编步骤的语言为“编译”,而没有“解释”的语言。

确实是一个微妙的问题……过去,“解释”的语言被解析并转变为中间形式,该形式更快地执行,但是执行它们的“机器”是一个非常特定语言的程序。 “编译”语言被转换为运行计算机支持的机器代码指令。早期的区别是非常基本的 - 静态与动态范围。在静态键入的语言中,可以在几个计算机说明中几乎可以将变量引用分配到存储地址 - 您确切地知道在调用框架中,变量引用的位置。在动态键入的语言中,您必须搜索(在A列表或呼叫框架上)才能参考。随着面向对象的编程的出现,参考的非关键性质扩展到了更多概念(类型),方法(函数),甚至是语法解释(嵌入式DSL(如Regex))。

实际上,这种区别可以追溯到70年代后期,在编译和解释之间并没有太多 语言, ,但是它们是在编译还是解释的环境中运行的。例如,帕斯卡(我研究的第一种高级语言)在比尔·乔伊 PXP 口译员,后来在他写的编译器上 PCC. 。相同的语言,在编译和解释环境中可用。

某些语言比其他语言更具动态性,即某种类型,一种方法,变量 - 取决于运行时环境的含义。这意味着编译或不编译或没有与执行程序相关的实质性运行时机制。 Forth,Smalltalk,News,Lisp都是这样的例子。最初,这些语言需要如此多的机制来执行(与A C或Fortran),以至于它们是自然的解释。

甚至在Java之前,仍尝试加快用技巧,技巧,技术汇编,即时汇编等的技术来加快执行复杂的动态语言。

我认为这是Java,这是第一个真正使编译器/口译员差距混乱的广泛语言,具有讽刺意味的是,它不会更快地运行(尽管也是如此),而是在任何地方都可以运行。通过定义自己的机器语言和“机器” Java字节码和VM,Java试图成为一种汇编成接近任何基本计算机的语言,但实际上没有任何真实的机器。

现代语言嫁给了所有这些创新。有些人具有动态,开放式的,您不知道的习惯性质的传统“解释性语言)(Ruby,Lisp,Smalltalk,Python,Perl(!)),有些人试图尝试具有规格的严格性,允许对传统编译语言(Java,scala)的深层静态错误检测。所有这些都汇编为实际与机器无关的表示(JVM),以在任何语义语义上获取曾经运行的书写。

那么,编译与解释?两者兼而有之。所有代码都在源(带有文档)中,更改所有内容,并且效果是直接的,简单的操作几乎与硬件可以执行的速度一样快,支持复杂的操作得到了支持和足够快的,硬件和内存模型在平台之间是一致的。

今天的语言较大的辩论可能是它们是静态还是动态键入,也不是说它们会运行多快,而是编译器事先发现错误(以程序员的代价为代价,必须指定相当复杂的键入信息)或在测试和生产中出现错误。

您可以使用 irb, ,交互式红宝石壳。尽管它可能会产生中间字节码,但从传统意义上讲,它当然不是“编译器”。

通常将编译的语言编译到机器代码中,而不是仅字节代码。但是,某些字节代码生成器实际上可以将字节代码进一步编译到机器代码中。

字节代码本身只是用户编写的文字代码和虚拟机之间的一个中间步骤,但是它仍然需要由虚拟机解释(就像使用JVM中的Java和使用OpCode Cache一起使用Java)。

这可能是一个偏离的话题,但是...

铁红宝石 是基于.NET的Ruby实现,因此通常将其编译到字节代码,然后在运行时将JIT编译为机器语言(即未解释)。也(至少有其他.NET语言,所以我认为与Ruby一起使用) ngen 可用于提前生成编译的本机二进制文件,因此有效地是Ruby Code的机器代码。

至于我从2011年在上海的RubyConf获得的信息,Matz正在开发一个“ Mruby”(代表Matz的Ruby),以靶向在嵌入式设备上运行。 Matz说,The Mruby将提供将Ruby代码编译到机器代码中的能力,以提高速度并减少嵌入式设备上(有限)资源的使用。因此,有各种各样的红宝石实现,绝对不是所有这些都在运行时被解释。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top