Користувач:Armen gamletovich/Чернетка

Компонентно-орієнтоване програмування

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

Найпоширеніший конкатенативного мова - це мова опису сторінок 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) стековий ефект: кількість аргументів та результатів слова - постійні величини.

Див. такожРедагувати

ПриміткиРедагувати