Конкатенативна мова програмування

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Конкатенативні або стекові мови програмування — це мови, в яких конкатенація двох фрагментів коду описує їх композицію. Ці мови використовують стек для зберігання аргументів і значень операцій.

Найпоширеніша конкатенативна мова — це мова опису сторінок PostScript, обмежена підмножина якого використовується в PDF. Однак, PostScript код зазвичай генерується програмами, написаними на інших мовах. Інша, досить широко відома конкатенативна мова — це Forth.

Також слід зазначити мову мікрокалькуляторів Hewlett-Packard HP-28 і HP-48 — RPL. Цей конкатенативного мову зі складанням сміття як і реалізують його калькулятори досить популярні серед інженерів. Споріднену йому мову радянських ПМК Б3-21, Б3-34, МК-54, МК-61, МК-52, хоча і відносять до стекових мов, через її крайню примітивність (по суті це машинний код) складно віднести до конкатенативної.

Серед інших конкатенативних мов можна відзначити Joy, Cat, Factor і FALSE.

Конктенативні мови можна розглядати як сімейство мов, на зразок Лісп-мов. Так між усіма діалектами Ліспа (включаючи Scheme), є сильна «сімейне схожість». Однак є велика різниця в дизайні, реалізації та призначенні цих мов. Мови мікрокалькуляторів і багато хто з версій Форта призначені для вбудовування в невеликі мікропроцесорні системи; PostScript також є вбудовуваною мовою, тільки мікропроцесорні системи, що інтерпретують його називаються принтерами. Однак інші конкатенативні мови, такі як Joy або Cat розроблені як мови програмування загального призначення або в дослідницьких цілях.

Історія та визначення[ред. | ред. код]

Forth була першою мовою даного плану, але тільки Joy стала тією мовою, яка отримала назву конкатенативної. Творець мови Joy, Manfred von Thun, багато писав про конкатенативну теорію.

Строго кажучи, мову програмування можна назвати конкатенативною коли:

  • Елементарний правильно-побудований вираз мови це унарна функція з одним аргументом та одним значенням, що повертається.
  • Якщо X та Y — правильно-побудовані вирази, конкатенація X та Y — також правильно побудована.
  • Якщо Z — конкатенація X та Y — значення Z це композиція функцій X та Y.

У цьому визначенні стек не згадується; але всі конкатенативні мови використовують цю структуру даних як найпростіший спосіб передавати від однієї операції до іншої. Термін «конкатенативний» не загальноприйнятий, багато користувачів таких мов воліють називати їх «стековими (stack-based)».

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

Постфіксний нотація[ред. | ред. код]

Програми на конкатенативного мовах мають подібність з постфіксною нотацією або польським інверсійним записом (RPN) арифметичних виразів. Аргументи, або програмний код, чиїм результатом є аргументи передують слову, котрі використовують дані аргументи. Літерали, такі як числа, поміщають значення на стек; інші слова можуть брати зі стека одні значення та поміщати на нього інші.

Наприклад:

2 3 + .

У мовах Forth та Factor це — коректна програма:2 и 3 — слова літерали, що поміщають на стек подаються ними значення.+ — це математичний оператор; він знімає зі стека два верхніх значення та поміщає на нього їх суму. Нарешті, оператор.(точка) знімає вершину стека та друкує її значення на дисплеї. Так ця програма виведе число 5.

Управління послідовністю дій[ред. | ред. код]

В рамках повноти по Тьюрингу, мова повинна мати деякі засоби управління послідовністю дій — можливість робити переходи або здійснювати той чи інший вибір на підставі значення виразу. Конкатенативної мови реалізують управління послідовністю дій різними способами. Порівняємо два приклади з мов Forth та Factor:

= IF 23 ELSE 17 THEN
= [ 23 ] [ 17 ] if

Обидва приклади роблять одне і те ж: порівнюють два верхні елементи стека і, якщо вони рівні, залишають на стеку значення 23; в іншому випадку — значення 17. В Форті слово IF — спеціальне; воно призводить до того, що програмний код попередній слову ELSE буде виконаний якщо умова істинна, якщо ж воно хибна, виконується код після ELSE. У мові Factor, у словаif інша функція; воно приймає умова і дві цитати (quotations) — програмних фрагмента взяті в лапки; слово if виконує першу або другу «цитату», в залежності від того, чи є вираз істинним. Приблизно так само працює оператор ifelse мови PostScript.

Формалізація цитування коду, засоби, повністю успадковані з Лиспа, відрізняє пізні конкатенативні мови, такі як Factor або PostScript, від ранніх, таких як Forth. Слова, які оперують цитатами, іноді називають комбінаторами.

Визначення та лексичний аналіз[ред. | ред. код]

Конкатенативні мови можуть значно відрізнятися в плані синтаксису, використовуваного для визначення нових слів. Наступні фрагменти коду на мовах Cat, Forth або Factor, та Joy роблять одне й те ж саме: визначають нове слово з ім'ям add100, яке додає 100 до значення на вершині стека.

define add100  { 100 + }
: add100  100 + ;
DEFINE add100 ==  100 + .

У всіх фрагментах тіло визначення однаково — це слова 100 +. Різниця полягає в словах парсеру (parsing words), використовуваних, щоб вказати транслятору мови, що має місце визначення нового слова. Слова парсеру — це свого роду аналог ключових слів C або спеціальних операторів в Ліспі: замість того, щоб виконувати операції на стеку, вони управляють тим, як парсер буде обробляти наступні слова.

Це і дозволяє визначення нових слів. Слова парсеру дають конкатенативним мовам аналог Ліспівські макроси: програміст може визначати новий синтаксис.

Стековий ефект[ред. | ред. код]

Конкатенативні мови програмування використовують нотацію стекового ефекту слова. Стековий ефект слова — це опис того, які значення слово бере зі стека, а які залишає на ньому як результат свого виконання. Як правило, слова мають стійкий (consistent) стековий ефект: кількість аргументів та результатів слова — постійні величини.

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]