在解释语言时,口译员应该如何“工作”?

时间:2013-12-26 01:44:28

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

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

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

2:我想在阅读时执行每个声明吗?或者我应该构建整个程序的解析树 - >在走遍树并生成/执行代码之前,内存中的AST? (取决于问题1的答案)

1 个答案:

答案 0 :(得分:1)

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

  1. 解析源文件:您可以自己编写解析器,也可以使用许多可用的编译器生成器之一(例如Cocoa)。如果使用编译器生成器,那么“低级别的东西”就会少得多,并且可以更专注于实现语言语义。但是,您也将错过学习如何自己实现解析器的机会。
  2. 生成可执行文件AST:您在执行函数/方法中的一个节点中本地实现每个操作。例如,添加节点将执行其左子节点,右子节点,然后返回结果本身。 if节点首先执行其条件,然后根据条件执行其if分支子节点或其右分支子节点。您还必须考虑,您希望存储运行时数据,例如变量。
  3. 执行AST:如果要执行像JavaScript这样的动态类型语言,则必须考虑变量可以具有不同类型的值。您可以拥有适应执行状态的节点,也可以实现处理所有情况的单个节点。
  4. 一种方法是在Java Truffle框架的顶部实现它。如果你以正确的方式实施翻译,你将获得不错的表现。还有几种语言实现可用;还包括使用Cocoa编译器生成器的simple example language。一些论文(1) (2)解释了如何实现局部变量等事物或处理动态类型语言的不同类型的值。

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