调车码算法用于将表达式从infix转换为后缀符号(反向波兰符号),以便由编译器计算它们。例如,2 + 3 * 2将被转换为2 3 2 * +。在维基百科中,提到了该算法在许多应用程序中使用,包括
任何面向堆栈的编程语言,如:第四,因子,PostScript页面描述语言,Befunge,Joy
我看不到C#,甚至没有任何流行的高级语言。那么,C#是否将此算法用于表达式?如果不是,C#编译器是如何编译和计算表达式的?
发布于 2012-09-22 00:53:04
是的,C#被转换成面向堆栈的编程语言- 电子邮件.当编译器将表达式转换为内部语言时,它会列出遵循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的基本思想是存在的。
https://stackoverflow.com/questions/12539679
复制相似问题