2012-09-22 3 views
3

Shunting-yard algorithm은 중위에서 후치 표기법 (역 폴란드어 표기법)으로 표현식을 변환하는 데 사용되므로 컴파일러에서 평가할 수 있습니다. 예를 들어 2 + 3 * 22 3 2 * +으로 변환됩니다. Wikipedia에서는,이 알고리즘은 같은C# 식에 어떤 알고리즘이 사용됩니까?

모든 스택 지향 프로그래밍 언어를 포함하여 많은 응용 프로그램에서 사용되는 것을 언급한다 : 넷째, 요인, 포스트 스크립트 페이지 설명 언어, 비 펀지, 기쁨

C#이나 인기있는 고급 언어가 표시되지 않습니다. C#에서는이 알고리즘을 표현식에 사용합니까? 그렇지 않다면, C# - 컴파일러는 어떻게 표현식을 컴파일하고 평가합니까?

+0

귀하의 위키 피 디아 견적은 언어가 프로그램을 내부적으로 나타내는 방식을 말하는 것이 아니라, 역 폴란드어를 프로그래머가 프로그램을 작성하는 방식으로 사용하는 언어에 관한 것입니다. 귀하의 질문은 실제로 의미가 없습니다. – Barmar

+0

@Barmar 좋아, C#이 알고리즘을 너무 사용하는 것이 좋습니다. –

+2

중대한 질문이 아닙니다. 모든 컴파일러는 다르게 작동합니다. 왜 중요한지, C# 컴파일러의 내부 설계에 따라 해결해야 할 문제는 무엇입니까? – Barmar

답변

4

예, C#은 스택 지향 프로그래밍 언어 (IL)로 변환됩니다. 컴파일러가 표현식을 내부 언어로 변환하면 RPN을 따르는 연산 목록을 만듭니다. 당신이 볼 수 있듯이

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 

, 피연산자을 누르면됩니다 예를 들어

,

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

이 내부 언어로 변환됩니다이 방법 (무슨 일이 일어나고 있는지에 대한 설명에 대한 의견을 참조) 표현식의 뒤에서부터 앞쪽으로 작업하여 작업 수행을 편리하게하는 순서대로 스택에 놓습니다.

변환의 정확한 알고리즘은 컴파일러에 따라 다르지만 (정확한 표현식을 유효한 RPN 시퀀스로 변환하는 여러 가지 방법이 있기 때문에 최종 결과는 컴파일러에 따라 다르지만) RPN의 기본 개념은 다음과 같습니다. 그곳에.

+0

갑자기 내가 지금까지 해왔 던 문제는 내가 여기 보이는 것을 멀리서 3D와 관련이있다. 관련이없는 +1! – spender

관련 문제