管理范式是代码的中间表示形式,适合编译器使用,逻辑上等同于单静态赋值,但有一些优点。例如,检查程序是否是有效的 SSA 形式是关于通过图形的可能路径集的存在性问题。然而,检查程序是否是有效的 ANF 表达式只是本地语法问题。
从严格的功能代码生成 ANF 非常容易,但我对从包含变量更新、循环等的命令式代码生成它感兴趣。
有一些简单的算法可以将 SSA 转换为 ANF。然而,如果您想快速完成,那么首先生成 SSA 就变得很重要。看起来直观的是,如果您最终想要的是更直接、更透明的格式,那么直接生成它应该比通过更不透明的形式更有效。
是否有已发布的算法可以直接从命令式代码生成 ANF?
我知道这个问题很老了,但是......
您指定的方式正是我们在“通过静态单一赋值推断类型和效果”论文中所做的(免责声明:我是作者之一)。我们首先使用 Cytron 的算法 将类似命令式的表面语言(具有控制流、本地赋值等)转换为 SSA 中间表示,然后继续从 SSA 形式转换为 ANF:最后一步非常简单!您可以按照该论文并采取类似的方法,但这似乎不是您想要的。事实上,我们选择这条路主要是因为分析各个步骤和比较表示更容易。不过,还有一个捷径:您可以改为实现布劳恩算法。
Braun 的算法不依赖于控制流图,线性地运行程序(所以它很快)。虽然它被设计为生成 SSA 形式的代码,但论文本身指出,对其进行细微修改即可生成 CPS 代码。类似的修改实际上允许您直接从源语法生成 ANF,而不需要先转换为 SSA。请注意,该算法还为具有可简化控制流图的程序生成最小 SSA:因此,除非允许 goto,否则生成的代码会针对 φ 节点的数量(或局部函数的参数数量,在以下情况下进行优化) ANF)。我已经在另一个项目中实现了这一点(直接生成 ANF 的 Braun 算法)并验证了它的工作原理,但恐怕我无法再访问该代码了。 P.s.:名称“ANF”代表“A-范式”,其中
“A”是一组公理