Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What type of algorithm is used for C# expressions? [closed]

Shunting-yard algorithm is used to convert expressions from infix to postfix notation (Reverse Polish notation), so that it is eaiser to evaluate them by a compiler. For example, 2 + 3 * 2 would be converted to 2 3 2 * +. In Wikipedia, it is mentioned that this algorithm is used by many applications including

Any stack-oriented programming language, such as: Forth, Factor, PostScript page description language, Befunge, Joy

I don't see C# or even any popular high-level language. So, does C# use this algorithm for expressions? If no, how does C#-compiler compile and evaluate expressions?


1 Answers

Yes, C# is converted to a stack-oriented programming language -- IL. When the compiler converts an expression to the internal language, it makes a list of operations that follow RPN.

For example, this method

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

gets converted to this internal language (see comments for explanation of what is going on):

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

As you can see, the operands are pushed onto stack in the order that makes it convenient to perform operations by working from the back of the expression to its front - exactly the way the article explains it.

The exact algorithm of the conversion is compiler-dependent (strictly speaking, the end result is compiler-dependent as well, because there are multiple ways to convert an expression to a valid RPN sequence) but the basic idea of RPN is there.

like image 172
Sergey Kalinichenko Avatar answered Jan 01 '26 21:01

Sergey Kalinichenko



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!