【问题标题】:What should my AST look like for easy transforms?我的 AST 应该是什么样子才能轻松转换?
【发布时间】:2010-07-24 11:14:08
【问题描述】:

我有一个类似于 javascript 的最小玩具语言。我生成了一个 AST 来尝试一些优化技术,比如逃逸分析、类型推断。我尝试了一些方法,例如概括运算符令牌而不是每个类/函数,在每个节点上保留类型信息......但我仍然觉得我不会去任何地方。处理起来很快就会变得笨拙......

我研究过 lua5、neko、v8,但是……嗯……我肯定不是周围最聪明的人之一。

有没有人有设计 AST 和在 AST 上实现转换的经验,这很容易处理?我会感谢那些让您的生活更轻松的提示和技巧?

(请不要叫我去读龙书,我已经有了。)

【问题讨论】:

  • 唯一的问题是“它变得笨拙”。 什么(什么事情,什么动作)变得笨拙?您使用什么工具?
  • 我有一个 ast 作为 javascript 对象。例如,当我有一个操作员节点时,我有不太通用的左右字段而不是子数组。我不知道这是否是一个好的选择(例如:推断类型),即使我尝试了另一种方式。

标签: compiler-construction abstract-syntax-tree


【解决方案1】:

正如 Alan 所说,Appel 的书籍很棒。我有现代编译器在 ML 中实现的编译器本科课程。

我个人会避免对 AST 进行许多转换,因为您可以拥有多种不同的构造以及可以表达同一事物的多种方式。您将经常不得不编写处理大量案例和子案例的代码,而且正如您所说,它会很快变得笨拙。

最好将 AST 转换为更小的表示形式,例如控制流图中的基本块。然后可以将每个操作编写为基本块中的简单语句。可能的操作集应保持较小。只要确保保留足够的信息,您仍然可以进行所有您想要的转换(特别是不要丢弃类型)。您还可以使用单一静态分配形式,其中每个程序变量只分配一次。这提供了一个不变量,简化了许多转换和分析。

【讨论】:

    【解决方案2】:

    我使用ANLTR.org,我觉得这很容易。

    【讨论】:

      【解决方案3】:

      好吧,我不推荐龙书,因为你已经有了。我可以推荐Appel 的书吗?甚至有一些 source code 演示了这些概念,其中使用访问者模式将抽象语法树转换为具体语法树。祝你好运,尽情享受!

      【讨论】:

        【解决方案4】:

        AST 表示程序的结构。对于复杂的语言, 你的 AST 一定会很复杂。所以不要假设这个 应该是“容易的”。

        许多人认为拥有 AST,生活会更轻松。 但解析只是喜马拉雅山脚下。 AST 不代表常见的推论, 比如标识符的含义,接下来执行什么语句, 使用此数据的位置。 除非你拥有所有这些,否则你不会 能够用真正的语言做很多事情,更不用说 轻松搞定。

        最好将这些推理结果缓存或显式: 符号表、控制流、数据流……

        可以添加模式匹配语言来启用 识别语法结构,甚至写转换 规则:

        optimize_increment(x:exp):statement
        = " \x=\x+1; " -->  " \x++ " if no_side_effects(x);
        

        此类规则需要利用缓存的推论(例如, “副作用”)。

        尝试构建这一切真的很难。一种制作方法 这实际上是将基础设施成本摊销 许多语言和转换应用程序。 我们的DMS Software Reengineering Toolkit 在不同程度上为各种语言提供了所有这些机制,包括 C、C++、Java、C# 和 COBOL。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-12
          • 1970-01-01
          • 2015-12-09
          • 2017-12-14
          • 1970-01-01
          • 2013-01-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多