2011-12-08 3 views
0

에 대한 IL을 방출하고, 최근 간단한 계산 스택을 구현하는 IL을 방출 할 수 있다고 배웠습니다 :내가 C 번호에 비교적 새로운 해요 기본 산술 작전

stack [ B C * A + ] ==> push B, push C, DO MULT, push A, DO ADD, POP return value 

this example arises from the string "A + (B * C)" 

누군가가 조언 및/또는를 제공 할 수 기본 연산의 샘플 IL 조각 - 즉 1,2 또는 3 개의 double을 푸시하고 단항, 2 진 또는 3 항 함수 또는 산술 연산자를 호출합니다.

귀하의 충고에는 일리노이 방출이 좋은 아이디어인지 여부가 포함될 수 있습니다. 표현은 몬테카를로 시뮬레이션에 공급 된 가정이므로 - 속도를 높이는 것에 대해 생각할 충분한 이유가 있지만, 실행 가능하지만 안전하지 않은 것으로 간주되는 경우이를 수행하고 싶지 않습니다.

답변

0

구문에서 피연산자와 연산자를 추출하기 위해 구문 분석을 수행하는 경우 다양한 연산을 수행하기 위해 특정 함수를 호출하는 것이 어떻습니까? 즉각적으로 IL을 컴파일하는 &을 내보내는 것보다 훨씬 간단합니다. 귀하의 예제를 사용하면이 작업을 수행 할 수 있습니다 :

MyStack<object> m_oStack = new MyStack<object>(); 

double Add() // takes 2 params from stack 
{ 
    return (m_oStack.Pop() + m_oStack.Pop()); 
} 

double Multiply() // takes 2 params from stack 
{ 
    return (m_oStack.Pop() * m_oStack.Pop()); 
} 

// during evaluating the expression: 
... // parse 

m_oStack.Push (fB); 

... // parse 

m_oStack.Push (fC); 

... // parse 

m_oStack.Push (Multiply()); 

... // parse 

m_oParamStack.Push (fA); 

... // parse 

m_oParamStack.Push (Add()); 

// you're done with evaluating the expression, the result is 
// on top of the stack 

을 당신이 당신의 표현의 다양한 부분을 평가하고 그래서, 당신은 스택에 값을 유지하고 다양한 하위 표현을 구문 분석으로 자신의 함수를 호출.

이것은 일리노이를 발생시킴으로써 모두 가능하지만 아직 모든 구문 분석을 수행하고 모든 입력 매개 변수를 관리해야하기 때문에 훨씬 더 복잡해 질 것입니다.하지만 그 중에서도 꼭 필요한 것은 IL을 방출 한 다음 즉시 실행하십시오.

+0

구문 분석은 한 번 수행되지만 평가는 백만 번 (위와 같이) 수행됩니다. 따라서 아이디어는 의사 코드 속도에서 JIT 속도로 평가 루틴의 속도를 높이는 것이 었습니다 (권장하지 않는 한). 너무 털이 많다). – tpascale

관련 문제