【发布时间】:2013-06-05 18:56:09
【问题描述】:
我正在尝试优化编译器中的表达式评估。
算术表达式都是 C 风格的,它们可能包含变量。我希望尽可能简化表达式。
例如,(3+100*A*B+100)*3+100 可以简化为 409+300*A*B。
主要取决于分配律、结合律和交换律。
我遇到的主要困难是如何将这些算术定律与传统的堆栈扫描评估算法结合起来。
任何人都可以在编译器构建的上下文中分享与此或类似问题相关的经验吗?
【问题讨论】:
-
只有
+-*/和括号? -
@CaseyChu 其实所有的C操作符都有可能出现。但我认为只考虑 +-*/() 也是可以接受的。我是
trying my best来简化它们。 -
您可能需要开发一个rewriting system,它会依次将重写规则应用于表达式。在此之前,您可以查看一些现有的编译器源代码,了解它如何处理此类优化。听说LLVM源码可读性很强。
-
@BЈовић 谢谢你指出我的错。
-
您要查找的关键术语是“传递闭包”和“范式”。请注意,没有“简单”或“复杂”之类的东西,只有不同的形式。您需要决定要从什么形式开始,以及要翻译成什么形式。
标签: c++ algorithm compiler-construction code-generation