Piet — эзотерический язык программирования, разработанный Давидом Морган-Маром. Язык Piet использует разноцветные изображения в качестве программ. Программа на Piet выглядит как постживописная абстракция. Piet получил своё название от имени нидерландского художника Пита Мондриана.
Программный код в языке Piet представлен в форме абстрактного рисунка.
#FFC0C0 light red |
#FFFFC0 light yellow |
#C0FFC0 light green |
#C0FFFF light cyan |
#C0C0FF light blue |
#FFC0FF light magenta |
#FF0000 red |
#FFFF00 yellow |
#00FF00 green |
#00FFFF cyan |
#0000FF blue |
#FF00FF magenta |
#C00000 dark red |
#C0C000 dark yellow |
#00C000 dark green |
#00C0C0 dark cyan |
#0000C0 dark blue |
#C000C0 dark magenta |
#FFFFFF white | #000000 black |
Используется 20 различных цветов (таблица справа). 18 цветов первых трёх строк в таблице связаны циклически двумя следующими циклами:
При этом подразумевается, что светлый темнее, чем тёмный, и наоборот. Белый и чёрный цвета не входят в циклы.
Дополнительные цвета также могут использоваться, хотя их эффект зависит от реализации. В простейшем случае нестандартные цвета рассматриваются интерпретатором языка как белый (в другом случае они могут использоваться как аналогичный чёрному).
Код на языке Piet представляет собой форму графики, собранной из распознаваемых цветов. Отдельные цветные пикселы важны в языке, поэтому правило распространяется на программы, подлежащие увеличению, для того чтобы стали видны детали. В таких увеличенных программах термин Кодел используется для описания блока с цветом, эквиалентного одному пикселу кода, для того, чтобы избежать путаницы с фактическими пикселами увеличенной графики, которые в действительности могут быть одним коделом.
Основной элемент языка Piet — цветной блок. Цветной блок — это блок любого числа смежных коделов одного цвета, ограниченных блоками другого цвета либо краем графики программы. Цветные блоки, смежные только диагонально, не считаются смежными. Цветной блок может быть любой формы и может иметь «дыры» других цветов внутри, которые не являются частью блока.
Пиет использует стек для хранения всех данных. Данные существуют только как целые числа, хотя они могут быть прочитаны или выведены как символы Юникода соответствующими командами.
DP | CC | Выбранный кодел |
---|---|---|
вправо | влево | самый верхний |
вправо | самый нижний | |
вниз | влево | самый правый |
вправо | самый левый | |
влево | влево | самый нижний |
вправо | самый верхний | |
вверх | влево | самый левый |
вправо | самый правый |
Интерпретатор языка Piet начинает выполнять программу в цветном блоке, который содержит верхний левый кодел программы. Интерпретатор содержит Указатель Направления Direction Pointer (DP), который вначале указывает вправо. DP может указывать вправо, влево, вверх, вниз. Интерпретатор также содержит «Выбирающего Коделы» Codel Chooser (CC), вначале указывающего влево. CC может указывать влево или вправо. Направления DP и CC обычно часто меняются во время выполнения программы.
Во время выполнения программы интерпретатор пересекает цветные блоки по следующим правилам:
Интерпретатор продолжает выполнять эти действия, пока программа не завершится.
Каждый не чёрный и не белый цветной блок в языке Piet представляет собой целый эквивалент числу коделов в данном блоке. Заметьте, что отрицательные целые числа не могут быть представлены, хотя они могут быть построены операторами. Когда интерпретатор кодирует число, не обязательно делать что-либо с ним. В частности, он не помещает его в стек автоматически — есть специальная команда для этого (смотри ниже).
Чёрные блоки и границы программы ограничивают течение программы. Если интерпретатор программы Piet пытается двигаться в чёрный блок или за границу, он останавливается и CC переключается. Далее интерпретатор пытается перемещаться с этого текущего блока снова. Если не удаётся во второй раз, DP изменяется в соответствии с направлением движения часовой стрелки на 90 градусов. Эти попытки повторяются, в то время как CC и DP изменяются между чередующимися попытками. Если после восьми попыток интерпретатор не сможет покинуть текущий блок, не существует пути выхода и программа завершается.
Белые блоки — свободные сквозные зоны, которые интерпретатор пропускает беспрепятственно. Если он передвигается из цветного блока в белое пространство, интерпретатор двигается через белые коделы в направлении DP пока не наткнётся на не белый блок. Если интерпретатор наткнётся на чёрный блок или границу, он считается ограниченным, иначе он двигается в цветной блок, на который наткнулся. Передвижение сквозь белый блок в новый цветной не вызывает выполнение команды (смотри ниже). В этом случае белые блоки могут использоваться для изменения текущего цвета без выполнения команд, что очень полезно для кодирования циклов.
Уточнение относительно белого блока
Передвижение по белому блоку ведёт интерпретатор по прямой линии до того, как он наткнётся на цветной пиксел или границу. Он не использует процедуру, описанную выше, для определения того, где интерпретатор выйдет из небелого цветного блока.
Точнее, что произойдёт, когда интерпретатор передвигается по белому блоку и натыкается на чёрный блок или границу, не было ясно по оригинальной спецификации. Интерпретация следует из буквального чтения следующего текста:
Смена яркости | |||
---|---|---|---|
Смена оттенка | Нет | Темнее на 1 | Темнее на 2 |
Нет | push | pop | |
1 шаг | add | subtract | multiply |
2 шага | divide | mod | not |
3 шага | greater | pointer | switch |
4 шага | duplicate | roll | in (number) |
5 шагов | in (char) | out (number) | out (char) |
Команды определены переходом из одного цветного блока в другой в соответствии с перемещением по программе. Число шагов по циклу цветов и циклу яркости в каждом переходе определяет выполняемую команду, как показано на таблице справа. Если переход осуществляется через белый блок, команда не выполняется.
Отдельные описаны ниже.
Невыполнимые операции игнорируются (пример: извлечение из стека несуществующего значения).
![]() |
Piet на Викискладе |
---|
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .