Езотеричний мова Piet



У категорії графічних езотеричних мов найбільш відомий Piet. Програми на ньому виглядають як картини абстракціонізму: в якості операторів використовуються різнокольорові зображення. Квітчасті алгоритми виглядають красиво, але зважаючи эзотеричной природи мови для вирішення реальних практичних завдань пристосовані поки слабо.


Довідка
Езотеричні мови програмування (ЭЯП) створюються в якості експерименту або дослідження. Так розробники досліджують можливості мов. Іноді вони просто розважаються. У будь-якому випадку це тренування для мозку, яка мало кому заважає.



ЭЯП бувають специфічними і загального призначення. Эзотерика мови як раз полягає в тому, що його розуміє, найчастіше, тільки автор. Що знову ж таки повертає нас до того, що вивчати мову слід виключно для наукових цілей. Наприклад, можна вирішити завдання особливо красиво на конкурсі з програмування — там можна. Сайт esolangs.org містить інформацію про більше, ніж тисячі таких мов.

Отже, Piet: історія

Мова придумав Девід Морган-Мар і назвав його по імені художника Піта Мондріана (в оригіналі — Piet Mondrian). Задумка була така, щоб програми на мові виглядали як абстракціонізм.

Опис
Мова специфічний. Доступні декілька реалізацій. Переходи між 20-ю доступними квітами — це команди. Кожна програма на Піті являє собою двомірну картинку, яка ділиться на пікселі. Цікава подробиця: помилки просто ігноруються. Тобто якщо написати неможливу команду, компілятор не буде стопоритися на ній. У деяких випадках час налагодження може скоротитися.

Елементи моделі мови

Модель мови містить три елементи:
Програма є двомірним зображенням, складених з пікселів. Останні можуть бути будь-якого кольору. У програмі беруть участь лише 20.



В Піті є блоки. Це зв'язкові безлічі пікселів одного кольору. Блок — мінімальна частина в побудові тексту програм. Групи пікселів, які відповідають одному блоку при збільшенні, — це кодел. Збільшення необхідно для детального розгляду та точності.

Пам'ять Піта організована у вигляді стека. Тип даних мови — цілі числа. Це єдиний тип. Обробка символів відбувається у вигляді їх ASCII-кодів.

У цієї мови покажчик інструкцій зі складною структурою:

  • вказівник на поточний блок;
  • покажчик напрямку (всього чотири, стандартні);
  • покажчик вибору коделов (два відносних напрямку вправо і вліво);


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

Наступна команда — це зміна кольору при зміні поточного блоку. Напрямок покажчиків залишається колишнім для загального випадку зміни блоку. Зміна напрямку відбувається, коли вказівник «стикається» з чорним блоком. Вони відіграють роль природних обмежувачів і структур управління в програмах, написаних на Піті.

Так при зустрічі покажчика з чорним блоком відбувається зміна напряму. Пошук припустимого виконується до тих пір, поки програма не побачить блок з кольором. Змінити напрямок можна і «вручну». Це роблять команди: switch і pointer.

Відповідність переходів між командами і квітами
У першій колонці — зміна відтінку, в інших — зміна яскравості. Нульова, на одиницю темніше і на дві темніше відповідно.








0 - push pop 1 add subtract multiply 2 divide mod not 3 greater pointer switch 4 duplicate roll in(int) 5 in(char) out(int) out(char)


Список базових команд з поясненнями

push — додати в стек число пікселів з попереднього блоку;
pop — витягнути і викинути з стека елемент;
subtract, add, divide, multiply, mod — арифметичні операції виконуються з двома верхніми елементами стека, результат записується в стек;
not — зчитує значание верхнього елемента в стеку, замінює його на нуль (якщо значення не нульове) або на одиницю в інших випадках;
greater — витягти верхні елементи в кількості двох штук і додати в стек 1 при більшому першому і 0 при більшому другому;

Інші команди є тут.

Введення в Піт читайте тут.

Приклади


Числа Фібоначчі






Програма з зображення виводить першу сотню чисел Фібоначчі. На одній картинці в кожному коделе 1 піксель, а на іншій 121. Чорна лінія показує проходження програми. Початок у верхньому лівому кутку. Може містити помилки. Зможете знайти, яку?

Эвклидов алгоритм



Автор — Клінт Херрон. Мета програми — визначити найбільший загальний дільник в парі цілих чисел. Номери ліній — це власні теги автора, в середині знаходиться операція, а в правій колонці — приблизне значення стека.

Лістинг програми
01: m = in(number) m
 
02: n = in(number) nm
 
03: dup nnm
 
04: push 3 3nnm
 
05: push 1 13nnm
 
06: roll nmn
 
07: r = m % n rn
 
08: dup rrn
 
09: push 1 1rrn
 
10: greater 0rn
 
11: not 1rn
 
12: switch (stay left if it's not greater than 1, otherwise turn right)
 
rn
 
LEFT PATH
 
L1: dup rrn
 

 
GUIDE TO OLD CODE AT 03:
 

 
RIGHT PATH
 
R1: pop n
 
R2: out(number)


А так виглядає код для обчислення факторіала.



Ще трохи цікавих абстрактних малюнків тут.

Інтерпретатори, написані з допомогою різних мов
На З — npiet.

Npiet — це інтерпретатор, який обробляє програми у форматах ".gif", ".ppm" і ".png". Дистрибутив містить візуальний програмний редактор — називається npietedit.



З ним можна вибирати наступний колір в блоці автоматично. Редактор враховує колір поточного блоку і необхідної команди. Ще в архіві є транслятор forgol->Piet.

Інтерпретатор на С++ .
Інтерпретатор на Ruby.
Інтерпретатор на AuotHotkey.
Текстовий файл інтерпретатора Піта на Пайтоне — завдання ускладнюється.

Інтерпретатор для Piet на Перлі , документація. Англійською мовою.
Ще інструменти www.dangermouse.net/esoteric/piet/tools.html.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.