compiler-construction - 解释器在解释一种语言时应该如何处理 "work"?

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

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

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

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

最佳答案

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

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

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

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

关于compiler-construction - 解释器在解释一种语言时应该如何处理 "work"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20778262/

相关文章:

c# - 只编译当前项目而不检查引用的项目

c# - VB.NET和C#的语法比较系统、全面、完整

CodeIgniter 表类 : Add a Link From a Generated Cell

c++ - 返回 char* 函数的内存管理

c++ - SDL 和 g++ 总是产生错误?

programming-languages - 像我 8 岁一样向我解释连接语言

javascript - 在 HTML 中请求时用 PHP 生成 JavaScript 文件

java - 创建自定义gradle插件来分析java源代码并生成代码

gcc - 使用 avr-gcc 在 C++ 中读取意外的全局变量结果(局部变量访问符合预期)

java - 最佳(scala 和其他针对 java vm 的语言)优化