2

As part of a group project I'm writing a compiler for a simplified language. As one of the optional features I thought I'd add a peephole optimizer to go over the codegen's output intel assembly code and optimize it.

Our compiler is done in java and it seems like it's going to be a lot of work to create this peephole optimizer using the java I've learned so far. Is there some sort of tool I should be using to make this possible, as pattern matching strings doesn't sound like a good approach in java.

thanks

4

3 回答 3

3

窥孔优化应该在解析树的二进制表示上完成,而不是在打算作为汇编器输入的文本上完成。

于 2011-12-14T18:12:46.007 回答
3

如果不查看编译器的设计就很难说,但通常在生成代码和发出代码之间会有一个中间步骤。例如,您可以考虑让代码生成阶段的输出成为例如指令的链接列表,其中每个指令对象存储指令的类型、任何参数、标签/分支目标等。然后每个模式将检查当前节点及其直接后继节点(例如if (curr.isMov() && curr.next.isPush() && ...)并相应地修改列表。然后您的窥视孔优化器从 codegen 输出开始,在其上运行每个模式,并一遍又一遍地执行此操作,直到列表停止更改。然后您有一个单独的阶段,它只接受这个指令列表并输出实际的程序集。

于 2011-12-14T18:15:50.923 回答
2

绝对不会为此使用字符串。您可能会查看lex/yacc和它的同类(例如 Jack 是 Java 的一个,虽然我没有使用它)来生成程序集的 AST,然后在 AST 上运行优化,然后再次写出程序集……但是你这样做意识到这是一件很难的事情,对吧?:-)

于 2011-12-14T18:14:50.630 回答