- PVSM.RU - https://www.pvsm.ru -
В категории графических эзотерических языков [1] наиболее известен Piet. Программы на нём выглядят как картины абстракционизма: в качестве операторов используются разноцветные изображения. Цветастые алгоритмы смотрятся красиво, но ввиду эзотеричной природы языка для решения реальных практических задач приспособлены пока слабо.
Эзотерические языки программирования (ЭЯП) создаются в качестве эксперимента или исследования. Так разработчики исследуют возможности языков. Иногда они просто развлекаются. В любом случае это тренировка для
ЭЯП бывают специфическими и общего назначения. Эзотерика [3] языка как раз состоит в том, что его понимает, чаще всего, только автор. Что опять же возвращает нас к тому, что изучать такой язык следует исключительно для научных целей. Например, можно решить задачу особенно красиво на конкурсе по программированию — там можно. Сайт esolangs.org содержит информацию о более, чем тысяче [4] таких языков.
Язык придумал Дэвид Морган-Мар и назвал его по имени художника Пита Мондриана (в оригинале — Piet Mondrian [5]). Задумка была такова, чтобы программы на языке выглядели как абстракционизм.
Язык специфический. Доступны несколько реализаций. Переходы между 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 при большем втором;
Остальные команды есть здесь [6].
Введение в Пит читайте здесь. [7]
Программа с изображения выводит первую сотню чисел Фибоначчи. На одной картинке в каждом коделе 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)
А так выглядит код для вычисления факториала.
Еще немного занимательных абстрактных картинок здесь [8].
На С — npiet [9].
Npiet — это интерпретатор, который обрабатывает программы в форматах ".gif", ".ppm" и ".png". Дистрибутив содержит визуальный программный редактор — называется npietedit.
С ним можно выбирать следующий цвет в блоке автоматически. Редактор учитывает цвет текущего блока и необходимой команды. Еще в архиве есть транслятор forgol->Piet.
Интерпретатор на С++ [10].
Интерпретатор на Ruby [11].
Интерпретатор на AuotHotkey [12].
Текстовый файл интерпретатора Пита на Пайтоне [13] — задача усложняется.
Интерпретатор для Piet на Перле [14], документация [15]. На английском языке.
Ещё инструменты www.dangermouse.net/esoteric/piet/tools.html [16].
Автор: Nuteralie
Источник [17]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/201566
Ссылки в тексте:
[1] графических эзотерических языков: https://esolangs.org/wiki/Category:Two-dimensional_languages
[2] мозга: http://www.braintools.ru
[3] Эзотерика: https://ru.wikipedia.org/wiki/%D0%AD%D0%B7%D0%BE%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%BC
[4] тысяче: https://esolangs.org/wiki/Category:Languages
[5] Piet Mondrian: https://www.google.ru/search?q=piet+mondrian+paintings&oq=piet+mondrian&aqs=chrome.1.69i57j0l5.7685j0j4&sourceid=chrome&ie=UTF-8
[6] здесь: http://www.dangermouse.net/esoteric/piet.html
[7] читайте здесь.: http://homepages.vub.ac.be/~diddesen/piet/index.html
[8] здесь: http://www.dangermouse.net/esoteric/piet/samples.html
[9] npiet: http://www.bertnase.de/npiet/npiet-1.2a.tar.gz
[10] Интерпретатор на С++ : https://github.com/ducin/piet
[11] Интерпретатор на Ruby: https://github.com/enebo/rpiet
[12] Интерпретатор на AuotHotkey: https://github.com/G33kDude/Piet
[13] интерпретатора Пита на Пайтоне: http://www.dangermouse.net/esoteric/piet/Piet_py.txt
[14] Интерпретатор для Piet на Перле : http://search.cpan.org/author/MAJCHER/Piet-Interpreter-0.03/
[15] документация: http://www.majcher.com/code/piet/Piet-11Interpreter.html
[16] www.dangermouse.net/esoteric/piet/tools.html: http://www.dangermouse.net/esoteric/piet/tools.html
[17] Источник: https://habrahabr.ru/post/313152/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.