]]> ]]>
Править | Обсудить | История

Whirl

Дата создания:
9 июля 2004
Парадигма:
Типизация:
Принятые расширения файлов:
.wrl
Реализации и версии (свернуть все | развернуть все):
Язык программирования

Whirl — эзотерический язык программирования со своеобразным подходом к переводу символов программы в команды.

Whirl был создан Сином Хебером (Sean Heber) в 2004 году. Благодаря своей необычности язык стал достаточно популярным (как для эзотерического): существует ряд реализаций и инструментов для работы с ним.

Важной частью интерпретатора являются два кольца, на которых расположены по 12 команд, сгруппированные по темам — “математика” и “операции”. У каждого кольца есть указатель на текущую команду на нем (изначально каждый указатель установлен в Noop, то есть пустую команду), направление вращения (изначально по часовой стрелке) и своя ячейка памяти (value). Кроме того, есть указатель на активное кольцо (изначально это кольцо операций).

Все действия, которые выполняет программа, связаны с этими кольцами и изменением их состояния. Символы программы изменяют состояние колец следующим образом. 1 всегда поворачивает активное кольцо на одну команду в направлении вращения, 0 — меняет направление вращения активного кольца на противоположное. Кроме того, если перед 0 был 0, который не запустил выполнение команды, то текущая команда на активной кольце выполняется, и активное кольцо меняется. Все символы программы, кроме 0 и 1, игнорируются.

Команды языка

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

Кольцо операций:

  • Noop Пустая команда
  • Exit Остановить выполнение программы
  • One Присвоить value значение 1
  • Zero Присвоить value значение 0
  • Load Присвоить value значение memval
  • Store Присвоить memval значение value
  • PAdd Безусловный переход: увеличить указатель текущего символа в программе на value
  • DAdd Увеличить указатель текущей ячейке памяти на value
  • Logic Логическое И: присвоить value значение (memval AND value)
  • If Условный переход: если memval не равно 0, увеличить указатель текущего символа в программе на value
  • IntIO Если value равно 0, прочитать целое число из потока ввода и присвоить его memval, иначе напечатать значение memval как число
  • AscIO Если value равно 0, прочитать символ из потока ввода и присвоить его ASCII-код memval, иначе напечатать значение memval как символ

Кольцо математики:

  • Noop Пустая команда
  • Load Присвоить value значение memval
  • Store Присвоить memval значение value
  • Add Присвоить value значение value + memval
  • Mult Присвоить value значение value * memval
  • Div Присвоить value значение value / memval
  • Zero Присвоить value значение 0
  • < Присвоить value значение 1, если value < memval, и 0 в противном случае
  • > Присвоить value значение 1, если value > memval, и 0 в противном случае
  • = Присвоить value значение 1, если value = memval, и 0 в противном случае
  • Not Присвоить value значение 1, если value = 0, и 0 в противном случае
  • Neg Умножить value на -1

Схематическое изображение интерпретатора Whirl
Схематическое изображение интерпретатора Whirl

Примеры:

Hello, World!:

Пример для версий Whirl

Программа написана Kang Seonghoon.

110011100111000001111100000001000011111000011111100000000010
000011001111100001100010000010011111000100000000000001001111
100000111110001000000000000000001000111110010000001100001111
100011000000000100111110011100111000111000001000111000001111
100000111110010000011111000110011111100001111000001111000001
110011111100001111000110011100000111000100011111000001111100
100000110000000111000001110001111100011111000111000001000001
000011000111110001000001000000011100000111001000111110001111
000001111000011111100001111110000011110000000000000000011110
000011100111000011110011111000111110001111100000100000000000
000000000000111110001110000001110000011100011100111110001000
100000000011100001111100110000000010011111000111100000111100
111100010011100000111110000011111001100111100010001111000000
000001000111110010000010011110011001110001000111110001100000
100011111000011110011100111111000111100000111100011111000000
011110000011100100001111000100011111001100011111000111100000
111001110001100111100100000000000000011111000001111100010010
000011100001111100100000100011100000111000110011110001001111
110001100000111100011111000111100000111001000011110001001111
100000111110000000011110000011110000000000000000111000001110
000011000001100000111000111000001100111110000111111001001110
000011111000001100011000001001111110000011100110011111000000
000111000001110000111100001100
 

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам