我可以将 AST 转换为 SSA,还是需要先转换为 CFG 再转换为 SSA?

Can I translate an AST to SSA, or do I need to translate to a CFG then to SSA?

我能否将抽象语法树直接转换为 SSA 形式,或者我是否需要创建一个控制流图,然后从所述 CFG 创建静态单一分配形式?

并且在控制流图的上下文中:我如何为类 C 程序表示它?我在想我可以为每个函数中的所有基本块存储一个 CFG 图,但是当我调用一个函数时,这可能会使事情复杂化。我能想到的另一种方法是整个程序的 CFG,即所有源文件,但是我将如何存储有关函数的信息?我可以在基本块(即父节点)中存储指向函数的指针吗?

如果我从 CFG 生成 SSA,我是否需要担心 CFG 表示语句的控制流?我想我只需要表示基本的块控制流。

是的,您可以在不先构建 CFG 的情况下创建 SSA 表单,但是您不能使用 Cytron 等人的经典 SSA 构建算法来完成此操作。论文 Simple and Efficient Construction of Static Single Assignment Form (disclaimer: I'm one of the authors). This algorithm is used in libFirm、OpenJDK 和 Go 编译器中描述了另一种算法。

大多数编译器 (afaik) 使用一个 CFG-per-function 模型。每个基本块都是一个节点。语句(aka operations/instructions/etc)属于一个基本块。一些存储指令作为每个基本块中的列表。一些存储指令作为类似于 CFG 的部分有序图。