Чтобы ответить на этот вопрос, давайте сосредоточимся на концепциях, которые вы упомянули, infix notation
, Shunting-Yard
и evaluation
, а затем связать их с компиляцией.
Для начала нам необходимо понять, как компьютер обрабатывает выражение. Выражение преобразуется в значение abstract syntax tree (AST), которое затем используется для создания кода. Процесс преобразования дерева в код меняется, но прогулка по АСТ такая же, как и оценка выражения.
АСТ для 1 + 2:
+
/\
1 2
Postfix: 1 2 +
Это оценивается посещение левой ветви, 1
,
Визитной правая ветвь, 2
,
и затем применяя оператор, +
, двум операндам.
АСТ 1 * 2 + 3^4:
+
/ \
^ *
/\ /\
3 4 1 2
Postfix: 3 4^1 2 * +
Это оценивается посещения левой ветви 3^4
,
затем посетить его левой ветви 3
,
затем посетите нужный филиал 4
,
затем посещение оператора, ^
, и оценки 3^4
и постановив, что в качестве нового левой ветви для `+», то есть 81
затем посетить правую ветвь 1*2
,
затем посетить его левую ветвь 1
,
затем посетить это правая ветвь 2
,
затем посетить оператор, *
, и оценки 1*2
и постановив, что в качестве нового правой ветви для `+», то есть 2
затем посетить оператор, +
, и оценки 81+2
и возвращение в результате 83
Теперь инфикс обозначения syntactic sugar сделать с помощью выражения легче читать для людей. Чтобы помочь преобразовать инфикс-нотацию в AST, алгоритм преобразования должен знать операторы precedence и associativity. Алгоритм также использует стек, который является одним из основных ключей алгоритма Шунтин-Ярда.Каждое средство, которое я знаю для преобразования infix в стратегию оценки, использует стек каким-то образом.
В то время как компилятор явно не оценивает выражение, которое может быть выполнено с помощью приложения калькулятора, компилятор преобразует хождение по дереву для оценки в код, который будет преформировать оценку.
Примечание: Поскольку я не знаю каждого компилятора для каждого языка, я могу дать вам ответ на основе общих понятий. Нет правила, которое требует, чтобы это соблюдалось, и я не удивлюсь, если некоторые компиляторы пропустит AST и перейдут от кода ввода к скомпилированному коду без использования AST.
Также, поскольку вы упоминаете компилятор, я только говорил о скомпилированном коде и не касался языков сценариев.
Теперь, чтобы вернуться на свои вопросы:
Использует ли это сегодняшние современные компиляторы для арифметического выражения оценки?
Я бы специально не использовал алгоритм Шунтин-Ярда, а понятия использования стека, который является одним из ключевых понятий алгоритма, который я буду использовать. Вы можете выбрать для себя, если использование понятий алгоритма такое же, как с использованием алгоритма.
Действительно ли это достаточно эффективно или другие методы (или алгоритмы) являются ?
Надеюсь, к настоящему времени вы знаете ответ на этот вопрос. Важным является не алгоритм Шунтин-Ярда, а концепция использования стека для перевода инфиксной нотации, которая важна, и это то, что используется с компиляторами. Помните, что скомпилированные языки обычно делают больше, чем оценивают выражения, они работают с типами, выражают условное выражение процесса, сохраняют значения и создают более высокие типы, такие как методы/функции, классы и модули.
В какой части компилятора вы говорите? Парсер? Промежуточное представление (IR) кода? Оценка времени компиляции IR в оптимизаторах? Процесс генерации кода из IR? Или способ оценки не константных выражений во время выполнения в оцениваемом коде? Для каждого из этих вариантов есть разные ответы. Добавьте некоторый контекст. – delnan