Система программирования Piet

Автор работы: Пользователь скрыл имя, 03 Февраля 2013 в 16:37, курсовая работа

Описание работы

Давно минули времена, когда программирование вычислительных машин выражало строгий язык математики и было уделом профессионалов, представлявших с помощью компьютерных программ се¬рьезные технические задачи. Еще 20-30 лет назад мало кто мог подумать о том, чтобы написать программу, не несущую ника¬кой, с виду, практической пользы.

Содержание работы

Введение. 2
Глава 1. Описание языка Piet. 3
Что такое язык PIET? 3
Бесполезные или эзотерические? 3
Простой ЭЯП, не полный по Тьюрингу 4
Классификация полных ЭЯП 4
Многомерное программирование 5
Программист Пит Мондриан 6
Основы языка Цвета 6
Коделы 7
Стек 7
Исполнение программ на Piet 8
Другие элементы синтаксиса 9
Глава 2. Программирование на Piet 12
Интерпретатор npiet 12
Среда npietedit 12
Первая программа 12
Как читать трассировку 15
Более сложные программы 16
Заключение 17
Список литературы. 21
Приложения 22

Файлы: 1 файл

Курсовая.docx

— 380.19 Кб (Скачать файл)

Белые блоки. Блоки коделов белого цвета совершенно прозрачны для интерпретатора: он проходит сквозь них по прямой линии в направлении DP до тех пор, пока не встретится не белый блок. Если этим блоком будет блок черного цвета или граница изображения, то регистр направления СС меняется, a DP при этом также меняет направление на 90 градусов по часовой стрелке (поскольку внутри белого блока выборки крайних коделов не производится). Такой цикл выполняется до тех пор, пока интерпретатор не повторит свой путь внутри белого блока. Если это случится, программа завершится.

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

Команды. Система команд языка Piet очень похожа на упрощенный набор слов Forth или систему команд стекового калькулятора. Код команды всецело определяется расстоянием между цветами в двух циклах отношений, приведенных выше, при переходе интерпретатора из одного цветового блока в другой. Если переход был совершен через белый блок, то не выполняется никакая команда. Схема кодирования команд дана в таблице.

Приведем список команд Piet с пояснениями:

push: кладет на стек число, соответствующее числу коделов в цветовом блоке, из которого интерпретатор только что вышел;

pop: выкидывает одно число с вершины стека;

add, sub, mul, div, mod: арифметические команды. Снимают два числа с вершины стека, складывают/вычитают/умножают/нацело делят /вычисляют остаток деления их и кладут результат на стек;

Таблица. Кодирование команд в языке Piet

 

Изменение яркости

Изменение

Нет

На один

На два

оттенка

 

шаг

шага

Нет

 

push

pop

На 1 шаг

add

sub

mul

На 2 шага

div

mod

not

На 3 шага

greater

pointer

switch

На 4 шага

dup

roll

in (число)

На 5 шагов

in (символ)

out (число)

out (символ)


not: заменяет значение на вершине стека на О, если оно было ненулевым, и на 1 в противоположном случае;

greater: снимает со стека два числа и кладет туда единицу, если второе число от вершины стека больше, чем число, которое было на вершине, и ноль в противном случае;

pointer: снимает число с вершины стека и меняет направление DP по часовой стрелке данное число раз. Если снятое число отрицательно, то вращение происходит против часовой стрелки;

switch: снимает число с вершины стека и меняет направление СС данное число раз;

dup: копирует число на вершине стека и кладет его на стек (создает копию вершины);

roll: снимает два числа — тг (вершина) и т (второе число после вершины) со стека и производит с оставшимися на стеке числами следующую операцию: вращает т чисел от вершины стека п раз. Вращение т чисел один раз производится так: вершина стека кладется на глубину т, а глубина всех элементов, располагавшихся на глубине меньшей или равной т, уменьшается на единицу. Если п отрицательно, то вращение производится в противоположном направлении. Если т отрицательно, то команда просто игнорируется;

in, out: команды ввода-вывода; in читает из входного потока число (или символ) и кладет его на стек, out снимает число со стека и выводит его в выходной поток в виде числа или символа Юникода.

Как можно видеть, программирование на Piet является довольно нетривиальным занятием и требует в первую очередь некоторого навыка общения со стеком.

 

 

 

 

 

 

Глава 2. Программирование на Piet

Каким бы удивительным это  ни казалось, но для Piet написаны полноценные интерпретаторы и даже среды удобного интерактивного редактирования программ. Мы рассмотрим одну такую среду, предоставляемую проектом npiet. К сожалению, полноценная работа npiet гарантируется только под ОС семейства GNU/Linux, а пользователям Windows придется несколько помучиться.

Интерпретатор npiet

Интерпретатор npiet является полноценной реализацией языка Piet и в качестве программ на нем принимает изображения в форматах PNG, PNM или GIF. Изображения JPEG не поддерживаются в силу того, что могут быть искажены из-за сжатия. Важной особенностью npiet является возможность как текстовой, так и графической трассировки Piet- программ, что существенно облегчает жизнь экспериментаторам. Мы рассмотрим эти возможности, когда будем писать (рисовать) первую программу.

Среда npietedit

В комплект npiet входит также простейшая среда разработки на Piet, позволяющая с удобством редактировать изображения попиксельно и подсказывающая нужный цвет относительно текущего для создания необходимой команды.

Первая программа

В качестве первой программы  на Piet рассмотрим программу, читающую из входного потока число и возвращающую результат умножения этого числа на два (без символа перевода строки), оставив само число на стеке. Один из вариантов такой программы приведен на рис.( Приложение 3)

Для начала такую программу  надо записать в виде текста с использованием вышеописанных команд Piet:

in (число)

dup

push 2

mulout (число)

Сначала мы вводим число  командой in и копируем его с помощью dup, после чего помещаем на стек двойку и вызываем mul. Полученный результат должен быть выведен командой out. Вы могли заметить, что приведенная на рис. 2 программа явно избыточна. Действительно, для записи вышеприведенного алгоритма достаточно использовать всего 9 коделов. Однако нам необходим еще способ выхода из программы. Выход — не самое простое действие в Piet, но для его организации существуют некоторые устоявшиеся шаблоны, и я буду использовать один из них, который условно можно назвать "Крест". Упрощенная версия программы приведена на рис.(Приложение 4), а ее оттрассированная с помощью npiet версия — на рис. (Приложение 5).

Согласно некоторым "правилам хорошего тона", программа на Piet должна быть как можно более квадратной и как можно более художественной. Ориентировочно, возьмем для нашей программы поле 8 на 8 коделов, затем выберем какой-нибудь начальный цвет, например, желтый. Изначально интерпретатор будет находиться в точке (0,0), в блоке желтого цвета, его DP будет указывать на восток, а СС — влево.

Последовательность из первых двух команд проста — это первые три кодела в верхней строке рис. (Приложение 4) (можете проверить это сами по таблице). Чтобы не удлинять программу, поставим после них черный кодел, заставив интерпретатор повернуться на юг.

Почему он поворачивается именно на юг? Первый раз интерпретатор  пытается войти в черный блок и меняет направление СС, однако после этого он все равно будет пытаться войти в этот же черный блок, следовательно, ему придется повернуть еще и DP.

Теперь нам нужно положить на стек число 2. Чтобы закодировать двойку, нужно перейти в какой-нибудь блок из двух коделов, при этом нам  не нужно лишнее выполнение команды, поэтому сделать это надо через  белый блок. Выберем красный в  качестве цвета для блока, кодирующего  двойку. Поскольку интерпретатор пока находится в точке (2,0) и смотрит на юг, оставим кодел (2,1) белым. Затем создадим какой-нибудь блок из двух коделов одного (красного, как мы выбрали) цвета, содержащий точку (2, 2). Пусть это будет блок [(1, 2); (2, 2)]. Поскольку DP указывает на юг, а СС — вправо (он изменился, когда интерпретатор пытался войти в кодел (3,0)), интерпретатор выберет кодел (1,2) и попытается перейти в блок, расположенный южнее. Поместим в точку (1, 3) кодел темно-красного цвета для кодирования команды push, а в точку (1, 4) — кодел желтого цвета для кодирования команды mul.

Опять же, чтобы чересчур не удлинять код программы, поместим в точку (1, 5) черный кодел, заставив интерпретатор изменить СС (теперь он будет указывать влево) и повернуть DP, чтобы он указывал на запад. После этого поместим в точку (0, 4) темно- красный кодел для кодирования команды out.

Теперь приступим к  самой сложной части — выходу из программы. Как уже говорилось выше, будем использовать для этого технику "креста". Суть этого метода заключается в том, чтобы "завести" интерпретатор в крестообразный цветовой блок, лучи которого ограничены черными коделами. На рис. (Приложение 4) такой блок синего цвета можно увидеть в нижнем правом углу. Он может иметь и более простой вид, но для целей наглядности оставим его как есть. Вспомним, что наш интерпретатор находится в точке (0, 4), DP указывает на запад, а СС — влево. Два раза "стукнувшись" о западную границу изображения, интерпретатор изменит значения как СС, так и DP (на "Север") и пойдет в кодел (0, 3). Черный кодел в точке (0, 2) снова повернет интерпретатор на 90 градусов — на "Восток", значение СС при этом снова будет "Слева". Безболезненно пройдя через темно-красный кодел в (1, 3) и белый в (2, 3), интерпретатор попадется в нашу ловушку — синий крестообразный блок, из которого и не сможет выйти, заставив программу завершиться.

Как я уже говорил, графическая  трассировка нашей программы  приведена на рис. (Приложение 4), здесь тонкая черная линия показывает путь интерпретатора, в точности соответствующий тому, который я описал выше.

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

блоки коделов, представляющие числа, должны быть окружены коделами другого цвета;

блоки коделов, служащие для  выхода из программы, подобные нашему "кресту", также должны быть окружены коделами другого цвета;

важно найти все значащие белые коделы и оставить их без  изменения;

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

В нашей программе значащих белых кодела два — в точке (1, 2) и в точке (2, 3). Белый кодел  в точке (0,3) не является значащим. Если посмотреть на трассировку программы, видно, что его можно заменить коделом темно-красного цвета (а можно и не менять), поскольку получающийся при этом блок в виде буквы "Г" не представляет число и не меняет семантику программы. Кодел (2, 3) важно оставить белым, чтобы не совершать вызова лишних команд перед выходом из программы.

Как читать трассировку

Приведенная на рис. (Приложение 4) трассировка показывает полный цикл выполнения программы. Кружки внутри коделов отмечают точки, в которых останавливается интерпретатор перед очередной выборкой кодела, а прямые линии, соединяющие их, — собственно путь интерпретатора. Над кружками записываются числа, обозначающие номер шага интерпретатора. Между цветовыми блоками написаны мнемонические обозначения Piet-команд.

В каждом блоке с помощью  небольших стрелочек отмечаются попытки перехода интерпретатора через границу и соответствующие значения DP и СС. Цифры рядом с этими стрелочками отмечают номер попытки.

 

 

 

Более сложные программы

В качестве примера более  сложной программы, являющейся при  этом действительно образцом некоторого визуального искусства, можно привести один из вариантов "Hello world" на Piet (Приложение 6).

Не будем разбирать ее подробно, поскольку это займет слишком много места, очертим лишь общий принцип ее работы.

Программа на рис.(Приложение 6) развивается по спирали, при этом для поворота на очередной виток применяются команды pointer. В ходе закручивания спирали некоторые символы выводятся сразу, а некоторые формируются заранее и кладутся на стек. В центре изображения можно увидеть еще один шаблон выхода из Piet-программ, очень похожий на "Крест", — "Клетку" (по сути, она является частным случаем "креста"). Будучи заключенным в блок с черной границей, интерпретатор не может найти выход и завершает программу.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Заключение

В данной работе мы рассмотрели тему: “Система программирования Piet”.

Цель работы была следующая: рассмотреть основы эзотерического ЯП Piet.

Для достижения данной цели были решены следующие задачи:

  1. Выявление особенностей эзотерического направления.

   Языки программирования, которые при первом рассмотрении не имеют никакой практической полезности, то есть отходят от всех общепризнанных парадигм программирования, принято называть эзотерическими.

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

  Несмотря на то, что такое разделение привычно для всех, в том числе и не эзотерических, языков программирования, в сфере ЭЯП оно носит более глобальный характер: как правило, тьюринг-неполные ЭЯП вообще непригодны для чего-либо и являются лишь пародиями или утрированными шутками.ЭЯП полные по Тьюрингу обычно представляют собой тьюринговские трясины: несмотря на то, что с их помощью можно вычислить все что угодно, сделать это необычайно трудно — здесь объект нашего рассмотрения, Piet, является ярким примером.

  1. Рассмотрение ЯП Piet.

   ЭЯП Piet  был создан Дэвидом Морганом-Маром, одним из наиболее продуктивных и хитроумных авторов эзотерических языков. Свое название Piet получил в честь голландского художника Пита Мондриана, одного из основателей геометрической абстрактной живописи. Согласно оригинальной задумке, программы на Piet должны выглядеть как абстракционистские картины.

  Согласно первоначальному описанию, используется 20 различных цветов. Восемнадцать цветов в первых трех строках таблицы наделены следующими циклическими отношениями:

Цикл оттенков (слева направо): красный -> желтый -» зеленый -> бирюзовый -» синий —> пурпурный -» красный —» ...

Цикл уровней яркости (сверху вниз): светлый —> обычный —> темный светлый -» ...

  Так как программы на Piet являются изображениями, в них важен каждый отдельный пиксель. Однако подобные изображения могут быть слишком маленькими и неудобными для просмотра, поэтому в Piet введено понятие "кодела". Кодел является группой пикселей одного цвета (в самом простом варианте — одним пикселем) и представляет собой "пиксель" в понимании интерпретатора Piet.

Информация о работе Система программирования Piet