Эзотерический язык Piet

bf3c2103821b44e4ab7fe2db2fd1f36d.jpg

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

Справка


Эзотерические языки программирования (ЭЯП) создаются в качестве эксперимента или исследования. Так разработчики исследуют возможности языков. Иногда они просто развлекаются. В любом случае это тренировка для мозга, которая мало кому мешает.

86052f40ea4d499bae0c07acf5ce7983.jpg

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

Итак, Piet: история

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

Описание


Язык специфический. Доступны несколько реализаций. Переходы между 20-ю доступными цветами — это команды. Каждая программа на Пите представляет собой двухмерную картинку, которая делится на пиксели. Интересная подробность: ошибки просто игнорируются. То есть если написать невозможную команду, компилятор не будет стопориться на ней. В некоторых случаях время отладки может сократиться.

Элементы модели языка


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

dc589fc9c7f64760994aff0b75e22167.png

В Пите есть блоки. Это связные множества пикселей одного цвета. Блок — минимальная часть в построении текста программ. Группы пикселей, которые соответствуют одному блоку при увеличении, — это кодел. Увеличение необходимо для детального рассмотрения и точности.

Память Пита организована в виде стека. Тип данных языка — целые числа. Это единственный тип. Обработка символов происходит в виде их 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 при большем втором;

Остальные команды есть здесь.

Введение в Пит читайте здесь.

Примеры

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

50bb80fc390d4e5e9bae935f561aa48d.gif

da56f2f4996d4362ab4811fa3fbc7ca9.gif

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

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

9f5c91704def49799d35c2172740baca.png

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

Листинг программы
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)

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

0ec23383be8b4ff5a35071d917f51c47.png

Еще немного занимательных абстрактных картинок здесь.

Интерпретаторы, написанные с помощью разных языков


На С — npiet.

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

7f338fbf0f5c4f6186d56303e0dc64e5.png

С ним можно выбирать следующий цвет в блоке автоматически. Редактор учитывает цвет текущего блока и необходимой команды. Еще в архиве есть транслятор forgol→Piet.

Интерпретатор на С++ .
Интерпретатор на Ruby.
Интерпретатор на AuotHotkey.
Текстовый файл интерпретатора Пита на Пайтоне — задача усложняется.

Интерпретатор для Piet на Перле, документация. На английском языке.
Ещё инструменты www.dangermouse.net/esoteric/piet/tools.html.

Комментарии (1)

  • 21 октября 2016 в 22:43

    0

    впервые узнал что существует что-то подобное, точнее — чтобы код записывался не текстом. программирование как визуальное искусство! кодер может почувствовать себя художником-фриком, заказать себе картины или обои своего же кода, которые понимать будет только он, а остальные — поражаться абстракционизму


    начал гуглить — например, здесь чувак предлагает как можно красивее вывести на экран число 42, и, конечно же, ответ на языке Piet -


    image


    и конечно, же, начал гуглить про quine.
    На самой вики есть Piet-программа, печатающая слово «Piet»


    8efc00f5a9c44d90b814e0eedd6606bb.gif


    Первая ссылка в гугле с негрузящейся картинкой — не понятно, что там за квайн.


    Вот вопрос — еще нет либ или кода, чтобы рисовать графику, или уже есть? Т.е. можно написать настоящий куайн?

© Habrahabr.ru