Стек-ориентированное программирование - Stack-oriented programming - Wikipedia

Стек-ориентированное программирование или программирование на основе стека, это парадигма программирования который опирается на штабелеукладчик модель для прохождения параметры. Стек-ориентированные языки работают с одним или несколькими стеки, каждый из которых может служить разной цели. Программные конструкции на других языках программирования необходимо модифицировать для использования в стек-ориентированной системе.[1] Некоторые стек-ориентированные языки работают в постфикс или же Обратная польская запись. Указываются любые аргументы или параметры для команды. перед эту команду. Например, постфиксная запись будет записана 2, 3, умножить вместо умножить, 2, 3 (префикс или же Польская нотация ), или же 2 умножить 3 (инфикс обозначение ). Языки программирования Четвертый, РПЛ, PostScript, BibTeX язык дизайна стиля[2] и много языки ассемблера соответствуют этой парадигме.

Алгоритмы на основе стека

PostScript - это пример языка на основе стека постфиксов. Пример выражения на этом языке: 2 3 муль. Вычисление выражения требует понимания того, как работает ориентация стека.

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

Человеческий stack.svg

Взять тарелку 2 и положите в стопку, затем возьмите тарелку 3 и положите в стопку. Далее возьмите мул пластина. Это инструкция к выполнению. Затем снимите со стопки две верхние пластины, умножьте их метки (2 и 3), и запишите результат (6) на новой тарелке. Выбросьте две старые тарелки (2 и 3) и пластина мул, и положите новую тарелку в стопку. Если на конвейере больше не осталось пластин, результат расчета (6) показан на пластине над стопкой.

Это очень простой расчет. Что делать, если требуется более сложный расчет, например (2 + 3) × 11 + 1? Если он сначала написан в постфиксной форме, то есть 2 3 прибавить 11 мул 1 прибавить, расчет можно выполнить точно так же и получить правильный результат. Шаги расчета показаны в таблице ниже. В каждом столбце отображается элемент ввода (пластина в конце конвейера) и содержимое стопки после обработки этого ввода.

Вход23Добавить11мул1Добавить
Куча23
2
511
5
551
55
56

После обработки всего ввода стек содержит 56, что и есть ответ.

Из этого можно сделать следующее заключение: язык программирования на основе стека имеет только один способ обработки данных, взяв один фрагмент данных из вершины стека, называемый попping и помещает данные обратно в стек, называемый толкатьing. Любое выражение, которое можно написать условно, или на другом языке программирования, могут быть написаны в постфиксной (или префиксной) форме и, таким образом, могут быть интерпретированы стек-ориентированным языком.

Управление стеком

Поскольку стек является ключевым средством управления данными в стек-ориентированном языке, такие языки часто предоставляют своего рода операторы управления стеком. Обычно предоставляются обман, чтобы дублировать элемент поверх стека, обменять (или же замена), чтобы обменивать элементы на вершине стека (первый становится вторым, а второй - первым), рулон, чтобы циклически переставлять элементы в стеке или в части стека, поп (или же уронить), чтобы отбросить элемент на вершине стека (push неявно) и другие. Они становятся ключевыми в процедурах изучения.

Диаграммы эффектов стека

Чтобы помочь понять эффект оператора, используется короткий комментарий, показывающий вершину стека до и после оператора. Верхняя часть стопки является самой правой, если элементов несколько. Эта нотация обычно используется в языке Forth, где комментарии заключаются в круглые скобки.

( до после )

Например, описаны основные операторы стека Forth:

обман  (а - а а)уронить (а -)замена (а б - б а)над (а б - а б а)гнить  (а б в - б в а)

И выдумать функция описана ниже:

выдумать  (п - п ')

Это эквивалентно предварительные условия и постусловия в Логика Хоара. На оба комментария также можно ссылаться как на утверждения, не обязательно в контексте языков на основе стека.

Стеки PostScript

PostScript и некоторые другие языки стека имеют другие отдельные стеки для других целей.

Переменные и словари

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

Реализация переменных в стек-ориентированных языках, таких как PostScript, обычно включает отдельный специализированный стек, который содержит словари пар ключ-значение. Чтобы создать переменную, сначала необходимо создать ключ (имя переменной), с которым затем будет связано значение. В PostScript к объекту данных имени добавляется префикс /, так /Икс это объект данных имени, который может быть связан, например, с числом 42. В определять команда def, так

/ x 42 деф

ассоциируется с именем Икс с номером 42 в словаре наверху стека. Существует разница между /Икс и Икс - первый - это объект данных, представляющий имя, Икс означает то, что определено в /Икс.

Процедуры

Процедура в стековом языке программирования рассматривается как самостоятельный объект данных. В PostScript процедуры обозначаются между { и }.

Например, в синтаксисе PostScript

{dup mul}

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

Поскольку процедуры рассматриваются как простые объекты данных, можно определять имена с процедурами. Когда они получены, они выполняются напрямую.

Словари предоставляют средства для управления областью видимости, а также для хранения определений.

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

Анатомия некоторых типичных процедур

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

Чтобы изучить Число Фибоначчи программа на PostScript:

  / fib  {     обман обман 1 экв обменять 0 экв или же нет     {        обман 1 суб выдумать        обменять 2 суб выдумать        Добавить     } если  } def

В стеке используется рекурсивное определение. Функция числа Фибоначчи принимает один аргумент. Сначала он проверяется на 1 или 0.

Декомпозиция каждого из ключевых шагов программы, отражающая стек, предполагая расчет фиб (4) :

                стек: 4 стека дублирования: 4 4 стека дублирования: 4 4 4 1 стек эквалайзера: 4 4 ложных стека exch: 4 ложных 4 0 стека эквалайзера: 4 ложных ложных или стек: 4 ложных не стек: 4 истина

Поскольку выражение истинно, оценивается внутренняя процедура.

                стек: 4 дублирования стек: 4 4 1 дополнительный стек: 4 3 fib
(здесь рекурсивный вызов)
                стек: 4 F (3) стек стек: F (3) 4 2 подстека: F (3) 2 fib
(здесь рекурсивный вызов)
                стопка: F (3) F (2) добавить стопку: F (3) + F (2)

что и является ожидаемым результатом.

Эта процедура не использует именованные переменные, а использует только стек. Именованные переменные могут быть созданы с помощью / a exch def построить. Например, {/ n exch def n n mul}

это процедура возведения в квадрат с именованной переменной п. При условии, что / sq {/ n exch def n n mul} def и 3 кв. называется, процедура кв анализируется следующим образом:

               стек: 3 / n exch stack: / n 3 def stack: пустой (было определено) n стек: 3 n стек: 3 3 муль стека: 9

что и является ожидаемым результатом.

Контроль и поток

Поскольку существуют анонимные процедуры, управление потоком может возникнуть естественным образом. Для если-то-еще инструкция: условие, процедура, которую необходимо выполнить, если условие истинно, и процедура, которую необходимо выполнить, если условие ложно. Например, в PostScript

 2 3 gt { (2 больше трех) = } { (2 не больше трех) = } если еще

выполняет почти эквивалент в C:

 если (2 > 3) { printf("2 больше трех п"); } еще { printf("2 не больше трех п"); }

Циклы и другие конструкции похожи.

Анализ языковой модели

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

Хотя способность затенять преобладающий встроенные и другие определения могут затруднить отладку программ, а безответственное использование этой функции может вызвать непредсказуемое поведение, оно может значительно упростить некоторые функции. Например, при использовании PostScript showpage Оператор может быть заменен пользовательским, который применяет определенный стиль к странице, вместо того, чтобы определять пользовательский оператор или повторять код для создания стиля.

Смотрите также

Рекомендации

  1. ^ Люервег, Т. (2015). Парадигмы программирования на основе стека. Концепции языков программирования - CoPL’15, 33.
  2. ^ Орен Паташник, Разработка стилей BibTeX (PDF)[мертвая ссылка ]