草庐IT

c# - 有效消除 .NET 表达式树中的公共(public)子表达式

我已经编写了一个DSL和一个从中生成.NET表达式树的编译器。树中的所有表达式都是无副作用的,并且表达式保证是“非语句”表达式(没有局部变量、循环、block等)。(编辑:树可能包括文字、属性访问、标准运算符和函数调用——它们可能在内部做一些奇特的事情,比如内存,但在外部没有副作用)。现在我想对其进行“公共(public)子表达式消除”优化。例如,给定一棵对应于C#lambda的树:foo=>(foo.Bar*5+foo.Baz*2>7)||(foo.Bar*5+foo.Baz*2...我想生成树等效项(忽略一些短路语义被忽略的事实):foo=>{varlocal1=foo.Bar*5