4

我一直在考虑马克吐温的这篇文章(显然),他开始用英语写作,但在整个文本中都对拼写规则进行了更改,因此到最后他得到的东西可能最好被描述为伪德语.

这让我想知道是否有一些已建立的语言的解释器可以访问解释器本身,以便您可以随时更改语言的语法和结构。例如,一个if子句通常是一个关键字;有没有一种语言可以让您即时更改或重新定义它?想象一下以一种语言开始控制台会话,到最后以另一种语言工作。

显然,可以编写一个解释器并运行它,也许这样做和修改解释器之间没有具体的区别。我不确定。也许您可以对任何给定的解释器动态地进行修改是有限制的?

除了这些更开放的问题,我只想知道是否有任何已知的口译员允许这样做?或者,也许,这种能力只是程度问题,而我的问题提出得不好。

4

3 回答 3

6

当然,在某些语言中,这种在语言语法本身级别上的自我修改行为是可能的。 Lisp 程序可以包含宏,这些宏允许动态创建新的控制结构,以至于两个依赖于大量宏编程的 Lisp 程序看起来几乎就像是用两种不同的语言编写的。Forth 有点相似,因为Forth 解释器提供了一组核心,只有十几个原始操作必须以问题域的语言在其上构建程序(通常是某种必须精确和以编程方式完成的真实世界交互,例如工业机器人)。Forth 程序员创建一个解释器来理解他或她试图解决的问题的特定语言,然后用该语言编写更高级别的程序。

一般来说,这里的共同想法是语言或系统将代码和数据视为等效,并赋予用户修改其中一个和另一个相同的权力。例如,每个 Lisp 程序都是一个 Lisp 数据结构。这与诸如 Java 之类的语言形成鲜明对比,后者在程序代码和它所操作的数据之间有明显的区别。

一个相关的主题是自修改低级代码,这是在具有复杂指令集的小型计算机时代的汇编语言程序员中相当普遍的技术,并且在一定程度上蔓延到早期的 8 位和 16 位微型计算机世界。在这个编程习惯中,出于速度或节省内存的目的,程序将在编写程序时“感知”其编译或解释指令将存储在内存中的位置,并且可以在适当位置更改实际的机器级指令字节逐字节影响其运行中的行为。

于 2013-06-25T23:00:28.770 回答
2

Forth 是我能想到的最明显的事情。它是连接和基于堆栈的,基本原子是一个词。所以你写了一个单词流,它们按照它们被写入的顺序执行,堆栈被显式操作以影响参数传递、结果等。所以一个简单的 Forth 程序可能看起来像:

6 3 + .

哪个是6,3+. .这两个数字将它们的值压入堆栈。加号从堆栈中弹出最后两个项目,将它们相加并推送结果。句号输出堆栈顶部的任何内容。

Forth 的一个基本部分是你定义你自己的词。由于所有单词都是运行时的一等成员,因此实际上您构建了一个特定于应用程序的语法。定义了相关词后,您可能会得到如下代码:

red circle draw

那会画一个红色的圆圈。

Forth 会在遇到每个单词序列时对其进行解释。然而,它区分了编译时和普通词。编译时单词会做一些事情,比如将一系列单词编译并存储为一个新单词。所以这相当于用经典的过程语言定义子例程。它们也是实现控制结构的手段。但是您也可以定义自己的编译时单词。

作为一个最终结果,一个 Forth 程序通常定义了它的整个语法,包括相关的控制字。

您可以在此处阅读基本介绍

于 2013-06-25T23:03:53.487 回答
2

Prolog 是一种谐音语言,允许以多种方式拒绝元解释器 (MI)。元解释器 - 解释解释器 - 是 Prolog 中常见且有用的原生结构。

有关此论点的介绍,请参阅此页面。一个有趣且实用的技术是部分执行

使用 MI 实现这些东西所产生的开销可以使用部分评估技术编译掉。

于 2013-06-25T23:18:19.527 回答