Optimization 如何在类型检查的ast上运行优化?

Optimization 如何在类型检查的ast上运行优化?,optimization,go,code-generation,Optimization,Go,Code Generation,有一些包需要扫描/解析/类型检查Go代码, 但是优化呢 假设我们有一个将Go翻译成另一种目标语言的程序。 如果我们仅基于AST进行优化,我们将错过所有优化(除非我们手动应用它们)。目标环境可能有非常糟糕的或根本没有优化器,当然,即使它有一个优化器,也无法很好地优化转写的代码 简单地说:我们的选择是什么 也许有某种编译方法,通过优化转到其汇编程序,然后(2个选项中的任意一个): a)将汇编程序翻译回原处,并像往常一样遍历AST b)将汇编程序读入某种IR结构并使用它来发出代码 提前感谢。Assem

有一些包需要扫描/解析/类型检查Go代码, 但是优化呢

假设我们有一个将Go翻译成另一种目标语言的程序。 如果我们仅基于AST进行优化,我们将错过所有优化(除非我们手动应用它们)。目标环境可能有非常糟糕的或根本没有优化器,当然,即使它有一个优化器,也无法很好地优化转写的代码

简单地说:我们的选择是什么

也许有某种编译方法,通过优化转到其汇编程序,然后(2个选项中的任意一个): a)将汇编程序翻译回原处,并像往常一样遍历AST
b)将汇编程序读入某种IR结构并使用它来发出代码


提前感谢。

Assembly/IR有损-几个不同的AST表示可能最终编译成同一个ASM。对于传输,您通常希望携带代码的意图。这本身是困难的,Go可能会笨拙地传输到JavaScript,如果目标是“惯用的”Rust/C++,则不太可能输出通用代码。这可能会给你一些启示:@MartinGallagher,我相信有一些基本的优化,比如常数折叠、表达式强度降低等。完美的API需要一个选定优化的列表并应用它们。然后我可以选择“内联”并签署“我知道它将改变结果调用堆栈形状”。@MartinGallagher顺便说一句,感谢链接和反馈。您认为为每个Go transcompiler实现简单的优化是浪费还是在某种意义上是不可避免的?恐怕我在这里的能力相当有限,欢迎提供建议。我认为你是正确的,直截了当的,语言不可知/通用优化是可能的(这可能是相关的:)。这仍然是一个挑战;()-LLVM IR甚至可以反转到不同的目标。