是否有任何解释性语言可以动态修改解释器?

时间:2013-06-25 22:42:08

标签: dynamic language-agnostic interpreter

我一直在考虑this writing (apparently) by Mark Twain,他开始用英语写作,但整篇文章都改变了拼写规则,最后他最终得到了一些最好被描述为伪德语的东西

这让我想知道是否有某种已有语言的解释器,其中一个人可以访问解释器本身,因此您可以随时更改语言的语法和结构。例如,if子句通常是关键字;有没有一种语言可以让你在飞行中改变或重新定义?想象一下,用一种语言开始一个控制台会话,到最后,在另一种语言中工作。

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

除了这些更开放的问题之外,我只想知道是否有任何已知的口译员允许这样做?或者,或许,这种能力只是一个程度问题而且我的问题很糟糕。

3 个答案:

答案 0 :(得分:6)

有些语言可以在语言语法本身的层面上进行这种自我修改行为。 Lisp programs can contain macros,其中允许动态创建新的控件构造,在某种程度上,依赖于广泛的宏编程的两个Lisp程序看起来几乎就像用两种不同的语言编写。 Forth在某种程度上类似于a Forth interpreter provides a core set of just a dozen or so primitive operations,在该code and data as equivalent上必须用问题域的语言构建程序(通常必须以精确和编程方式完成某种现实世界的交互,例如工业机器人)。一个Forth程序员创建一个解释器,该解释器理解他或她试图解决的问题所特定的语言,然后用该语言编写更高级别的程序。

一般来说,这里的常见想法是处理self-modifying low-level code的语言或系统,并为用户提供与另一个相同的修改权限。例如,每个Lisp程序都是Lisp数据结构。这与Java之类的语言形成对比,在Java语言中,程序代码与其操作的数据之间存在明显的区别。

一个相关的主题是minicomputers with complex instruction sets的主题,这是{{3}}时代汇编语言程序员中相当常见的技术,并且在早期的8位和16位中溢出。位微机世界。在这种编程习惯用语中,为了节省速度或节省内存,程序将被编写,其中“编译”或解释指令将被存储在存储器中的位置的“感知”,并且可以改变实际的机器级指令字节。按字节来影响其动态行为。

答案 1 :(得分:2)

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

6 3 + .

单词63+.。这两个数字将它们的值推到堆栈上。加号将弹出堆栈中的最后两个项目,添加它们并推送结果。完整停止输出堆栈顶部的任何内容。

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

red circle draw

那个画了一个红圈。

Forth在遇到它们时解释每个单词序列。但它区分了编译时和普通单词。编译时单词的作用就像将一系列单词编译并存储为新单词。这相当于用经典的过程语言定义子程序。它们也是实现控制结构的手段。但您也可以定义自己的编译时单词。

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

您可以阅读basic introduction here

答案 2 :(得分:2)

Prolog是homoiconic language,允许元解释器(MI)以各种方式被拒绝。元解释器 - 解释解释器 - 是Prolog中常见且有用的本机构造。

有关此参数的介绍,请参阅this page。一个有趣而实用的技术是部分执行

  

使用MI实现这些事情所产生的开销可以使用部分评估技术进行编译。