Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[ЭМЛ] Лекция 14.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
811.52 Кб
Скачать

[Править] Оптимизация выражений

Если вы пишете интерпретатор, то выходная строка, полученная после преобразования исходного выражения в обратную польскую нотацию, может храниться вместо исходного выражения для последующей интерпретации. Обратная польская нотация также позволяет компьютеру упрощать выражения.

[Править] Пример алгоритма упрощения выражения

Рассмотрим алгоритм, который осуществляет предвычисление констант в выражении. Дано выражение в ОПН. Нам понадобится стек для хранения смешанных данных (чисел и операторов).

Алгоритм подобен тому, который применяется для вычисления выражений. Мы просматриваем выражение слева направо.

Пока есть символы для чтения:

  • Читаем очередной символ.

  • Если символ является числом, помещаем его в стек.

  • Если символ является переменной, считая что переменная имеет значение null, помещаем символ в стек.

  • Если символ является оператором:

  • 1) (если все аргументы оператора, лежащие в стеке, имеют значение, отличное от null) выталкиваем аргументы оператора из стека и помещаем в стек результат операции;

  • 2) (если хотя бы один из аргументов имеет значение null) считая что результат операции null, кладём символ оператора в стек.

После того, как всё выражение просмотрено, то, что осталось в стеке, является оптимизированым выражением (операторы выражения лежат в стеке в обратном порядке).

[Править] Пример работы алгоритма

Выражение

Инфиксая нотация: exp(-1/2*x)

Обратная Польская нотация: -1 2 / x * exp

Читаем: «-1»

Кладём «-1» в стек

Стек: -1

Читаем: «2»

Кладём «2» в стек

Стек: -1 2

Читаем: «/»

Вычисляем частное, результат кладём в стек

Стек: -0.5

Читаем: «x»

Кладём «x» в стек со значением null

Стек: -0.5 x(null)

Читаем: «*»

Кладём «*» в стек со значением null

Стек: -0.5 x(null) *(null)

Читаем «exp»

Кладём «exp» в стек со значением null

Стек: -0.5 x(null) *(null) exp(null)

Результат оптимизации: -0.5 x * exp

Данный метод, очевидно, не включает всех возможных способов оптимизации.

[править] Примеры реализации

В статье «Обратная польская запись: примеры реализации» собраны примеры реализации обратной польской записи на различных языках программирования.

[править] Практические реализации

В качестве практического применения данной методики можно привести организацию байт-кода конфигураций прикладных решений системы 1С:Предприятие. Официального подтверждения компания не дает, но использующие данную систему программисты на специализированных форумах приводят доказательства и алгоритмы, позволяющие декомпилировать исходные тексты.

[править] Литература

Т. Пратт, М. Зелковиц Языки программирования: разработка и реализация = Terrence W. Pratt, Marvin V. Zelkowitz. Programming Languages: Design and Implementation. — 4-е издание. — Питер, 2002. — 688 с. — (Классика Computer Science). — 4000 экз. — ISBN 5-318-00189-0

[править] Примечания

  1. А. В. Ахо, Р. Сети, Д. Д. Ульман. Компиляторы: принципы, технологии и инструменты. М.: «Вильямс», 2003. С. 51.

[править] Ссылки

Языки программирования, использующие ОПН в качестве основной:

  • Forth

  • Factor

  • Postscript

  • Язык стилей оформления BibTeX

Другие ссылки:

  • Обратная польская нотация

  • http://www.univer.omsk.ru/students/m84/docs/pol_zap.html

  • Мини-лекция, посвящённая ОПН (на англ., с анимацией) — Автор: Bob Brown

  • Реализация Польской Инверсной Записи (ПОЛИЗа) на PHP

  • Преобразование выражения из инфиксной нотации в ПОЛИЗ с помощью алгоритма Дейкстры на C#

Источник — «http://ru.wikipedia.org/w/index.php?title=Обратная_польская_запись&oldid=52219380»

Категории:

  • Калькулятор

  • Математические обозначения

Стек

[править]

Материал из Википедии — свободной энциклопедии

Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 5 декабря 2012; проверки требуют 26 правок.

Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 5 декабря 2012; проверки требуют 26 правок.

Перейти к: навигация, поиск

У этого термина существуют и другие значения, см. Стек (значения).

Иллюстрация организации стека

Стек (англ. stack — стопка) — структура данных, представляющая из себя список элементов организованных по принципу LIFO (англ. last infirst out, «последним пришёл — первым вышел»).

Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.

В цифровом вычислительном комплексе стек называется магазином — по аналогии с магазином в огнестрельном оружии (стрельба начнётся с патрона, заряженного последним)

В 1946 М. Тьюринг ввел понятие стека[1]. А в 1957 году немцы Клаус Самельсон и Фридрих Л. Бауэр запатентовали идею[2].

В некоторых языках(например, Lisp, Python[3]) стеком можно назвать любой список, т.к. для них доступны операции pop и push. В языке C++ стандартная библиотека имеет класс с реализованной структурой и методами[4]. И т.д.

Содержание

[убрать]

  • 1 Программный стек

    • 1.1 Организация в памяти

    • 1.2 Операции со стеком

  • 2 Аппаратный стек (Hardware stack)

  • 3 Область применения

    • 3.1 Аппаратный стек

    • 3.2 Программный стек

  • 4 Примечания