语言如何被自己解释(如Rubinius)?

时间:2010-05-30 06:01:04

标签: ruby compiler-construction language-design rubinius self-interpreter

我已经使用Ruby的标准MRI实现在Ruby中编程了一段时间,但我一直对我听到的其他实现感到好奇。

前几天我正在阅读Rubinius,一个用Ruby编写的Ruby解释器。我尝试在不同的地方查找它,但我很难弄清楚这样的东西是如何工作的。我从未在编译器或语言写作方面有过多少经验,但我真的很想知道它。

语言究竟能如何解释?编译中是否有一个基本步骤,我不明白这有什么意义?有人可以解释一下这对我来说就像我是个白痴(因为那不会离基地太远)

5 个答案:

答案 0 :(得分:8)

这比你想象的要简单。

Rubinius不是100%用Ruby编写的,只是大多数。

来自http://rubini.us/

  

C和Java等流行语言的一个重要方面是程序员可用的大部分功能都是用语言本身编写的。 Rubinius的目标是将Ruby添加到该列表中。 Rubyists可以更轻松地为语言添加功能,修复错误并了解语言的工作原理。 Rubinius尽可能用Ruby编写。如果不可能(还),那就是C ++。

答案 1 :(得分:4)

您正在寻找的概念是编译器引导

基本上,自举意味着在语言 x 中为语言 x 编写编译器(或解释器)。这可以通过手工编写较低级别的基本编译器(即在汇编中编写C编译器)或使用不同的高级语言来完成。

wikipedia上阅读有关自举的更多信息。格雷格关于元循环评估者的回答也是强烈推荐的,包括SICP的相关章节。

答案 2 :(得分:2)

对于Rubinius,VM是用C ++编写的,处理所有低级(操作系统相关)的东西和基本操作。 VM拥有自己的字节码格式(就像JVM也有自己的字节码格式),当Rubinius启动时,它会启动执行字节码的VM。 然而,与C(MRI)或Java(JRuby)相比,Rubinius的大多数标准库(Ruby语言的一部分)都在Ruby中实现。此外,Rubinius字节码编译器也是用Ruby编写的。 所以是的,在开始的早些时候,他们不得不使用标准的Ruby解释器(MRI)来引导Rubinius。但这不应该是这种情况(虽然我不确定你是否仍然需要它,因为它的构建系统使用rake)。

答案 3 :(得分:1)

假设你使用的语言是某种语言,比如说Lisp,尽管没关系。 (可能是C ++,Java,Ruby,等等。)

你有一个Lisp的实现。将此实现称为Imp(仅为IMPlementation的一些名称缩写)。由于Imp本身就是一个程序,因此您的计算机可以运行它。现在你用Lisp编写的Lisp编写自己的实现,你称之为Circ。 Circ只是一个从Lisp代码编译(或解释,如果你将)的程序。编写代码使其读入文件,解析它(将其处理为有意义的数据),并对数据执行某些操作。这是什么东西?在Circ的情况下,它执行数据。

但它是如何做到的?

假设一个简单的例子,Circ读入和解析的代码就像做一些数学并输出结果一样简单。 Circ将代码处理成易于使用的数据(对于像Lisp这样的语言很容易开始,但这超出了这一点)并存储它。那么在Lisp中你可以编写代码来处理数字,所以为Circ编写的代码也可以这样做,因为它是用Lisp编写的。因此处理后的数据被插入到一些附加处理代码中......瞧!你有数值结果!然后你的Circ程序输出结果。

对于比简单数学更复杂的事情,可以做同样的事情。实际上,您可以编译/解释该语言的其他方面。写下足够的这些“其他方面”并将它们粘合在一起,你得到一个用Lisp编写的Lisp编译器。

由于编译器是由Imp编译的,因此它可以由您的机器运行,并且可以运行!你完成了。

答案 4 :(得分:0)

这种技术通常称为metacircular evaluator,几十年前在Lisp的背景下首次引入。

可以在Structure and Interpretation of Computer Programs第4章中找到对该技术的良好描述。