如何解决是否存在用于转换编译器 IR 指令序列的声明式模式匹配 DSL?
最近,我一直在研究一个 compiler class,它有许多关于不同优化过程(死代码消除、公共子表达式消除等)的经验教训。教授(非常感谢您公开课程视频)有一些可读性很强的 python code 演示了各种传递,就像 LLVM 优化传递一样,采用一系列指令并返回另一个优化的指令序列。
问题:不是编写命令式代码来查找和替换特定的指令模式,而是可以使用通用/流行的声明式模式匹配 DSL/函数吗?如果没有,是否有技术原因可以避免这种情况?我已经做了一些挖掘,LLVM 有一些 functions 用于模式匹配,但它似乎更侧重于模式匹配单个指令而不是它们的序列,尽管这可能是我的误读。
我认识的大多数人更喜欢使用正则表达式引擎对字符序列进行查找和替换操作,而不是尝试自己编写代码。既是因为他们编写的代码更少,而且错误更难潜入匹配器的实现中。也就是说,我意识到指令中的匹配模式比正则表达式要困难得多。正则表达式可以分解为确定性有限自动机 (DFA)。由于编译器 IR 感兴趣的模式将取决于特定的目标和参数,因此该语言可能是上下文敏感的语法。
解决方法
是的,有这样的 DSL。
一个是 Nanopass,一个建立在 Scheme 之上的 DSL。另一个类似的 DSL 是 MBase,参见示例 here。
此类 DSL 背后的想法是,几乎任何编译器传递都由许多较小的传递组成,每个传递都做自己简单的事情。因此,从源语言到完全降低的 IR 的路径由大量中间语言组成,中间有特定的小通道。每一关都尽可能的琐碎,这个链中的语言之间的差异很小。
您还可以使用通用术语重写语言,例如 Maude
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。