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
Ссылки:
Примеры:
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
]]>