испускать IL для основных арифметических операций - PullRequest
0 голосов
/ 08 декабря 2011

Я довольно новичок в C # и недавно узнал, что можно использовать IL для реализации простого стека оценки:

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 двойника и вызвать для них унарный, двоичный или троичный оператор или арифметический оператор.

Ваш совет может включать в себя вопрос о том, является ли использование ИЛ хорошей идеей. Выражения - это предположения, поданные в симуляцию Монте-Карло - поэтому есть веская причина подумать об их ускорении, но я не хочу этого делать, если это считается выполнимым, но небезопасным.

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

См. http://msdn.microsoft.com/en-us/library/exczf7b9.aspx для превосходного описания, как это сделать.Очень хорошо прокомментировано и хорошо написано.

0 голосов
/ 08 декабря 2011

Если вы все равно выполняете синтаксический анализ для извлечения операндов и операторов в своих выражениях, почему бы вам просто не вызвать конкретные функции для выполнения различных операций?Это было бы значительно проще, чем создавать и компилировать 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, но это будет значительно сложнее, так как вам все равно придется выполнять весь анализ, управлять всеми входными параметрами и т. д., но вдобавок ко всемуВы также должны испустить IL, а затем выполнить его на лету.

...