【问题标题】:How is an interpreter supposed to "work" when interpreting a language?口译员在口译语言时应该如何“工作”?
【发布时间】:2014-02-04 01:17:21
【问题描述】:

作为一个自我项目,我正在为我“编造”的一种编程语言创建一个解释器(它实际上只是 JavaScript 编程语言的一个微小扩展),但我对解释器的真正工作原理有点迷茫我应该如何执行用我的语言编写的程序。我的问题是:

1:因为这是一个解释器,我应该在遍历分析树时执行语句,还是应该用不同的语言生成代码——比如 python——然后使用子进程调用来编译和运行它生成python文件?

2:我是否应该在阅读时执行每条语句?还是应该在遍历树并生成/执行代码之前在内存中构建整个程序的解析树-> AST? (取决于问题1的答案是什么)

【问题讨论】:

  • 查看我的 SO 答案,展示如何执行构造的 AST:stackoverflow.com/a/10555114/120163
  • 我发誓,您是 SO 上最有帮助的用户。
  • @kjh,JavaScript 太甜了,无法由临时 AST walker 轻松评估。值得先将其降低为一些更简单的语言,或者更好的是,转换为扁平字节码,然后由一个简单的解释器执行。
  • @SK-logic,这意味着什么?你的意思是我应该在我的解释器实现中省略该语言的某些特性吗?
  • @kjh,不,我的意思是您可以先将源语言编译翻译成更简单的语言,然后再进行解释。您可以删除语法糖,将多个结构化编程语句简化为一个简单的通用语句(例如,goto),在可能的情况下枚举变量而不是使用它们的符号名称等。

标签: compiler-construction programming-languages code-generation interpreter


【解决方案1】:

实现解释器的一种直观方法是创建可执行的 AST:

  1. 解析源文件:您可以自己编写解析器,也可以使用许多可用的编译器生成器之一(例如Cocoa)。如果您使用编译器生成器,那么“低级东西”的麻烦就会少得多,并且可以更多地专注于实现语言语义。但是,您也会错过学习如何自己实现解析器的机会。
  2. 生成可执行的 AST:您在执行函数/方法的一个节点中本地实现每个操作。例如,添加节点将执行其左孩子、右孩子,然后自己返回结果。 if 节点将首先执行其条件,然后根据条件执行其 if 分支子节点或右分支子节点。您还必须考虑要将运行时数据(例如变量)存储在哪里。
  3. 执行 AST:如果你想执行像 JavaScript 这样的动态类型语言,你必须考虑一个变量可以有不同类型的值。您可以拥有适应执行状态的节点,也可以实现处理所有情况的单个节点。

一种方法是在 Java Truffle 框架之上实现它。如果您以正确的方式实现您的解释器,您将获得不错的性能。还有几种可用的语言实现;还包括使用 Cocoa 编译器生成器的 simple example language。一些论文(1)(2) 解释了如何为动态类型语言实现局部变量或处理不同类型的值。

我建议你先看看 truffle.sl 实现(link how to get it),然后看看你可以从那里得到什么。

【讨论】:

  • 非常有趣的答案,我一定会调查的。我们今天在操作系统课上讨论了这个概念,当时我们的教授正在谈论虚拟机的工作原理。很酷的主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2015-09-05
  • 2014-10-11
  • 2012-07-20
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多