C#表达式使用什么类型的算法?

时间:2012-09-22 00:23:17

标签: c# compiler-construction expression postfix-notation

Shunting-yard algorithm用于将表达式从中缀转换为后缀表示法(反向波兰表示法),因此编译器对它们进行评估是更准确的。例如,2 + 3 * 2将转换为2 3 2 * +。在Wikipedia中,提到该算法被许多应用程序使用,包括

  

任何面向堆栈的编程语言,例如:       向前,       因子,       PostScript页面描述语言,       Befunge,       喜悦

我没有看到C#甚至任何流行的高级语言。那么,C#是否将此算法用于表达式?如果不是,C#编译器如何编译和计算表达式?

1 个答案:

答案 0 :(得分:4)

是的,C#被转换为面向堆栈的编程语言 - IL。当编译器将表达式转换为内部语言时,它会生成一个遵循RPN的操作列表。

例如,这个方法

int x(int a, int b, int c, int d) {
    return a+b*(c+d);
}

转换为这种内部语言(请参阅注释以了解正在发生的事情):

IL_0001:  ldarg.0 // Push a on the stack
IL_0002:  ldarg.1 // Push b on the stack
IL_0003:  ldarg.2 // Push c on the stack
IL_0004:  ldarg.3 // Push d on the stack
IL_0005:  add     // Add d+c, push the result
IL_0006:  mul     // Multiply (d+c) by b
IL_0007:  add     // Add b*(d+c)+a

正如您所看到的,操作数按顺序被推入堆栈,这样可以方便地从表达式的后面到其前面进行操作 - 正如文章解释的那样。

转换的确切算法依赖于编译器(严格来说,最终结果也是编译器相关的,因为有多种方法可以将表达式转换为有效的RPN序列)但RPN的基本思想是