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
]]>