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

前几天,我正在阅读有关Ruby的Ruby口译员的读物。我尝试在各个地方查找它,但是我很难确切地弄清楚这样的事情。我从来没有在编译器或语言写作方面有太多经验,但我真的很感兴趣地弄清楚这一点。

一种语言如何被自己解释?我不明白这有意义的编译中有基本的一步吗?有人可以向我解释一下,就像我是个白痴一样(因为无论如何,这不会太远了)

有帮助吗?

解决方案

这比您想象的要简单。

Rubinius并非100%写在Ruby中,主要是在Ruby中。

http://rubini.us/

诸如C和Java之类的流行语言的很大一部分是,程序员可用的大多数功能都是用语言本身编写的。 Rubinius的目标是将Ruby添加到该列表中。红宝石主义者可以更轻松地为语言添加功能,修复错误并了解语言的工作原理。 在可能的鲁比尼乌斯用红宝石写的任何地方。在不可能的情况下,它是C ++。

其他提示

您要寻找的概念是 编译器引导.

基本上,引导意味着为语言编写编译器(或解释器) X 语言 X. 。这是通过手工编写基本编译器(即在汇编中编写C编译器)或使用其他高级语言来完成的。

阅读有关自举的更多信息 维基百科. 。还强烈建议格雷格(Greg)关于元圆圈评估者的答案,包括SICP中的相关章节。

如果Rubinius,VM用C ++编写,并处理所有与操作系统相关的(操作系统)和基本操作。 VM具有其自己的字节码格式(例如JVM也有其自己的字节码),当Rubinius启动时,它启动了执行字节码的VM。但是,与C(MRI)或Java(Jruby)相比,Ruby的大部分标准库(是Ruby的一部分)是在Ruby中实现的。此外,Rubinius字节码编译器还用Ruby编写。是的,在一开始,在某个时候,他们不得不使用标准的红宝石口译员(MRI)来引导Rubinius。但这不再是这种情况(尽管我不确定您是否仍然需要它,因为它的构建系统使用了Rake)。

假设您正在使用的语言是某种语言,例如LISP,尽管没关系。 (可能是C ++,Java,Ruby等。)

好吧,您有LISP的实施。调用此实施IMP(只是实施的简短名称)。由于IMP本身就是一个程序,因此您的计算机可以运行它。现在,您为用LISP编写的LISP编写了自己的实现,并将其称为Circ。 CIRC只是LISP代码中编译(或解释)的程序。您的代码是编写的,因此它在文件中读取,对其进行解析(将其处理成有意义的数据),然后对数据进行一些操作。这是什么?对于Circ,它执行数据。

但是它是怎么做的呢?

好吧,对于一个简单的情况,代码循环读取和解析就像做一些数学并输出结果一样简单。 Circ将代码处理到易于使用的数据中(对于像LISP这样的语言,很容易开始,但这是超越重点)并存储它。在LISP中,您可以将代码写入紧缩编号,因此为Circ编写的代码也可以这样做,因为它是用LISP编写的。因此,处理后的数据被插入了一些添加处理代码...和瞧!您有数值结果!然后,您的Circ程序输出结果。

与简单的数学相比,可以使用更复杂的事情来完成同样的事情。实际上,您可以编译/解释语言的其他方面。将这些“其他方面”写得足够多,然后将它们粘合在一起,您会为LISP编写的LISP编译器。

由于编译器是由IMP编译的,因此可以由您的机器和Presto运行!你完成了。

该技术通常称为 元评估器 并于几十年前首次在LISP的背景下引入。

可以在 计算机程序的结构和解释, ,第4章。

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