是否存在用于转换编译器 IR 指令序列的声明性模式匹配 DSL?

Are there existing declarative pattern matching DSLs for transforming sequences of compiler IR instructions?

最近,我一直在研究 compiler class that has a number of lessons on different optimization passes (dead-code elimination, common-subexpression elimination, etc). The professor (big thank you for making the class videos public) has some highly readable python code 演示各种传递,就像 LLVM 优化传递一样,采用指令序列和 return 另一个优化的指令序列。

问题:不是编写命令式代码来查找和替换特定的指令模式,是否可以使用 common/popular 声明式模式匹配 DSL/function?如果不是,是否有技术原因避免了这种情况?我做了一些挖掘,LLVM 有一些 functions 用于模式匹配,但它似乎更侧重于模式匹配单个指令而不是它们的序列,尽管这可能是我的误读。

我认识的大多数人更愿意使用正则表达式引擎对字符序列进行查找和替换操作,而不是尝试自己编写代码。这既是因为他们编写的代码更少,而且 bug 更难潜入匹配器的实现中。也就是说,我意识到在指令中匹配模式比正则表达式更难class。正则表达式可以分解为确定性有限自动机 (DFA)。因为编译器 IR 感兴趣的模式将取决于特定的目标和参数,所以该语言可能是上下文敏感的语法。

是的,有这样的DSL。

一个是Nanopass, a DSL built on top of Scheme. Another similar DSL is MBase, see an example here.

此类 DSL 背后的想法是,几乎任何编译器传递都由许多较小的传递组成,每个传递都做自己的简单事情。因此,从源语言到完全降低 IR 的路径由大量中间语言组成,中间有特定的小通道。每一次传递都尽可能微不足道,这条链中的语言之间的差异很小。

您还可以使用通用术语重写语言,例如 Maude