суббота, 10 сентября 2011 г.

Создаем эзотерический язык программирования за 5 минут.

Изучая вики по эзотерическим языкам я наткнулся на интересный язык программирования Piet. Отличительной особенностью которого является графическое представление программы. Например, эта программа выводит "Hello World!"
image
И показалось мне, что данная программа похожа на QR-Code.
  image
Только Piet использует цветовую кодировку. А QR-Code использует комбинацию расположения точек.

"Да это же готовая программа" подумалось мне. Разбиваем поле на квадраты, так, чтобы в каждом квадрате поместилось 4 точки. Это дает нам 16 комбинаций. Огромное количество по сравнению с тем же Brainfuck! Раз комбинаций много, то можно не сдерживать себя в выборе команд ЯП. Далее, смотрим на PATH, и видим, что он как нельзя лучше ложится в основу нового языка. Потому как состоит из 15 команд. Остается только закодировать команды языка PATH комбинациями точек и немного изменить правила работы интерпретатора.
Словарь языка.
В скобках указан эквивалент языка PATH
(#) - прекратить выполнение программы.
(+) -увеличить на единицу текущую ячейку памяти.
(-) - уменьшить на единицу текущую ячейку памяти.
(}) - перейти к следующей ячейке памяти.
({) - перейти к предыдущей ячейке памяти.
(,) - ввести символ из стандартного ввода в текущую ячейку памяти.
(.) - напечатать символ из текущей ячейки памяти.
(/) - поменять направление движения указателя в зависимости направления движения:
  1. вправо - начинаем идти вверх
  2. вниз - начинаем идти влево
  3. влево - начинаем идти вниз
  4. вверх - начинаем идти вправо
(\) - поменять направление движения указателя в зависимости направления движения:
  1. вправо - начинаем идти вниз
  2. вниз - начинаем идти влево
  3. влево - начинаем идти вверх
  4. вверх - начинаем идти влево
(^) - если текущая ячейка равна нулю начинаем идти вверх.
(<) - если текущая ячейка равна нулю начинаем идти влево.
(>) - если текущая ячейка равна нулю начинаем идти вправо.
(v) - если текущая ячейка равна нулю начинаем идти вниз.
(!) - перепрыгнуть через ячейку.
- команда, которая ничего не делает, но хорошо заполняет пустое место.

Программа размещается в шаблоне QR-code, который представлен на рисунке ниже.



Здесь зеленым квадратом обозначено поле, где можно безопасно вписывать программу. Размер поля, в принципе не ограничен, но лучше использовать стандартные размеры, принятые в стандарте на QR код. Программа начинает выполняться с места, обозначенного красным квадратом. Оставшееся место в поле программы можно заполнить рандомно чтобы было более похоже на QR-Code. При запуске программы интерпретатор читает код программы начиная с верхнего левого угла и движется слева направо выполняя команды. И двигаться будет пока не встретит команду остановки.

Название языка также составим из частей исходных технологий - QR-PATH.

PS. В данный момент это концепт языка. Интерпретатора не существует.

PPS. В качестве основы можно было взять Data-Matrix. Но QR-коды более узнаваемы, поэтому программа на QR-PATH будет производить более неожиданный эффект.

А теперь первая программа на новом языке.
Программа выводит Hello
Текст программы на PATH.

$\/\   /\        /\ /\
 +++   ++        ++ ++
 +++   ++ /++++\ ++ ++ /++++\
 ++\++\++ +    + ++ ++ +    +
 ++   +++ +/+++/ ++ ++ +    +
 ++   +++ ++     ++ ++ +    +
 \/   \/\ /\+++  /\ /\ /++.+/ 

 /+++++++++++++++++++++/
 \++++++.+++++++..+++.#


Тоже самое, но уже закодированное на QR-PATH



При помощи генератора получили QR-код слова hello


И "вставили" программу в QR-код. Теперь у нас QR-код и программа должны выводить почти одинаковый текст.


К, сожалению, проверка в онлайн декодере показала, что код программы испортил данные, закодированные в QR-code.

Комментариев нет: