Эзотерический язык 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.



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

    » Интерпретатор на С++ .
    » Интерпретатор на Ruby.
    » Интерпретатор на AuotHotkey.
    » Текстовый файл интерпретатора Пита на Пайтоне — задача усложняется.
    » Интерпретатор для Piet на Перле , документация. На английском языке.
    » Ещё инструменты.
    • +29
    • 13,4k
    • 8
    Поделиться публикацией

    Комментарии 8

      +1

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


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


      image


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



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


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

        +2
        Зато можно будет сказать Заказчику: «а я так вижу!» :)
        0
        Не Эвклидов, а Евклидов.
          +3
          Выяснилось ./npiet ест только квадратные картинки. Ждем на стаковерфлоу:

          Программа не работает!

          Код



          Логи



          :)
            +2

            Можно выкладывать в instagram.

            0
            Есть похожий язык, brainloller.
              0
              К эзотерическим языкам примыкают некоторые образовательные языки (educational programming language). Так Н. Вирт в книге Алгоритмы + структуры данных = программы. М.: Мир, 1985 предложил минимизированный язык PL/0 для иллюстрации принципов построения трансляторов. Не смотря на то, что его описание на EBNF очень компактное, этот язык выглядит «объемнее», чем большинство эзотерических языков. Однако ассемблер процессора PL/0 (гипотетическая машина) содержит всего семь инструкций, и ИМХО может рассматриваться как эзотерический язык программирования.
                0
                Извините: перепутал похожие темы.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое