【问题标题】:Are there any interpreted languages in which you can dynamically modify the interpreter?是否有任何解释语言可以动态修改解释器?
【发布时间】:2013-06-22 22:14:43
【问题描述】:

我一直在考虑this writing (apparently) by Mark Twain,他在其中开始用英语写作,但在整个文本中都对拼写规则进行了更改,因此到最后他可能会写出最好描述为伪德语的东西。

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

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

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

【问题讨论】:

    标签: dynamic language-agnostic interpreter


    【解决方案1】:

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

    一般来说,这里的常见想法是处理code and data as equivalent 并赋予用户修改其中一个和另一个一样多的权力的语言或系统。例如,每个 Lisp 程序都是一个 Lisp 数据结构。这与 Java 等语言形成鲜明对比,Java 中的程序代码和它所操作的数据之间有着明显的区别。

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

    【讨论】:

      【解决方案2】:

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

      6 3 + .
      

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

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

      red circle draw
      

      那会画一个红色的圆圈。

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

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

      您可以阅读basic introduction here

      【讨论】:

      • Factor 是另一种具有可塑性语法的连接语言。不过,它的语义更像 Lisp 而不是 Forth。
      【解决方案3】:

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

      有关此论点的介绍,请参阅this page部分执行

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-04
        • 2011-07-09
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多