FALSE
FALSE — эзотерический язык программирования, созданный в 1993 году Ваутером ван Ортмерссеном с двумя, по его словам, целями:
- чтобы можно было написать компилятор для него размером не более одного килобайта.
- придумать синтаксис, который бы выглядел шифровкой, случайным набором символов.
FALSE стал одним из первых эзотерических языков программирования, в частности он послужил источником вдохновения для автора знаменитого языка Brainfuck. Не будет большим преувеличением сказать, что именно с FALSE началась мода на эзотерические языки программирования.
Вместе с тем FALSE — всё ещё достаточно практичный язык программирования. Хотя его и отличает write-only синтаксис, он поддерживает разумный набор операций, в отличие от являющегося реализацией варианта
Базовые операции
Арифметические операции +
, -
, *
, и /
берут с вершины стека два верхних элемента и возвращают туда, соответственно, сумму, разность, произведение или частное. Знак подчёркивания _
— это унарная операция изменения знака числа, лежащего на вершине стека. Логические операции в FALSE это бинарные =
, >
, &
, |
и унарная операция логического отрицания ~
.
Достаточно экзотический синтаксис в FALSE имеют стековые операции:
$
- Дублирует вершину стека (в форте DUP): 0 1$ → 0 1 1%
- Удаляет вершину стека (DROP): 0 1% → 0\
- Меняет местами два верхних элемента стека (SWAP): 0 1 2\ → 0 2 1@
- Циклическая перестановка трёх верхних элемента стека (ROT): 0 1 2 3@ → 0 2 3 1ø
- Копирует n-й элемент стека на вершину (PICK): 7 8 9 2ø → 7 8 9 7
Переменные и подпрограммы
Переменные в FALSE обозначаются одной строчной латинской буквой (a-z), все переменные глобальны.
Для присваивания переменной значения (взятого с вершины стека) используется операция двоеточие :
, так 3a:
присваивает переменной a значение 3. Чтобы положить значение переменной на стек используется символ точка с запятой ;
.
Однако поскольку FALSE — стековый язык, переменные редко бывают нужны для хранения обычных числовых значений. Чаще они используются в роли функций — в них сохраняются лямбда-выражения, например:
[1+]i:
Это определение функции инкремент, и ей даётся имя i (всё, что находится между '[' и ']' — это и есть лямбда-выражение). Для выполнения лямбда-выражения используется операция !
, если же оно сохранено в переменной — вызов принимает форму ;!
.
Управляющие конструкции
В FALSE есть две управляющие конструкции if (обозначается ?
) и while — #
. Вот примеры их использования:
a;1=[3b:]?
Если a=1, присвоить b значение 3.
[a;1=][2f;!]#
Пока a=1, применять функцию f к значению 2.
Ввод-вывод
Строки в FALSE — это всё, что заключено между двумя кавычками "
. Строку нельзя положить на стек или сохранить в переменной, однако она может быть частью лямбда-выражения. При выполнении строки она просто выводится. Например:
a;1=["единица"]?
Для вывода целого числа используется операция точка .
, для вывода символа — запятая ,
. Для чтения символа — операция ^
. Операция ß
вызывает сброс (flush) потоков ввода и вывода (
Пример
Пример определения функции факториал на FALSE:
[$1=$[\%1\]?~[$1-f;!*]?]f:
Реализация
FALSE был реализован как написанный на ассемблере для процессоров
Доступна также реализация FALSE на JavaScript[1].
Варианты FALSE
Имеется написанный на ML функциональный вариант языка Strictly False. Ещё одно функциональное расширение FALSE — язык F (Functional False), написанный на K (и реализация «чистого» FALSE на том же языке[2]).
owl
Развитием идей FALSE является язык owl (англ. Obfuscated Weird Language), разработанный Antonio Maschio между 2005 и 2006. От FALSE его отличает бо́льшая практическая направленность, расширенный набор операций (с иным символьным обозначением), наличие работы со строками и т.п.
В частности, owl различает целые переменные и переменные-функции. Первые обозначаются заглавными буквами, вторые строчными. Для присваивания значений и тем и другим используется запятая ,
а для получения значения или запуска функции — @
. Кроме того в виртуальной машине owl присутствует 1 массив, длина которого по умолчанию равна 32Кбайт, для работы с которым используется операции #,
и #@
(а также @,
и @@
для функций).
В качестве if и while используются символы ?
и !
, эти операции различают находится на стеке одно или два лямбда-выражения. Так если лямбда-выражений два, ?
работает как if … then … else.
Операции ^
и :
служат, соответственно, для возведения в степень и извлечение корня. Для работы со стеком используют следующие операции:
команда | стековая нотация | название в форте
|
$
|
( n1 n2 - n2 n1 ) | swap |
%
|
( n - n n ) | dup |
;
|
( n - ) | drop |
'
|
( x*n m - y*n ) | roll |
`
|
( x*n m - x*n n ) | pick |
Символы скобок используются для ввода-вывода: (
и )
ввод и вывод символа, {
и }
— ввод и вывод строки, <
— ввод чисел (операция "больше" отсутствует, вместо неё используется $>
).
owl также позволяет подключать inc файлы _]inc.owl[
, или запускать внешние owl программы _[file.owl]
.
В owl (что более чем необычно для эзотерических языков) даже можно вставлять в программу комментарии: строчные, начинающиеся с #
, или многострочные, помещаемые между (*
и *)
. Строчные комментарии, начинающиеся символом #, позволяют использовать owl для применения в
Интерпретатор owl написан на
_t
для получения текущего времени.
Теперь рассмотрим программу вывода простых чисел на false и её перевод на owl:
- false
999 9 [1-$][\$@$@$@$@\/*=[1-$$[%\1-$@]?0=[\$.' ,\]?]?]#
- owl
999 9[1-%][$%2'%2'%2'%2'$/*=[1-%%[;$1-%2']?0=[$%.32)$]?]?]!
Следующий пример — программа вычисления факториала.
%0>~[?!]?"Factorial of "%." is "%1=[;1.][%1-[%1=~][%2'*$1-]!;.]?
Примечания
- ↑ javascript FALSE interpreter Архивировано 25 ноября 2010 года.
- ↑ False! in K . Дата обращения: 27 октября 2010. Архивировано 26 июня 2021 года.
Ссылки
- Wouter's Wiki : False Language (англ.) — Домашняя страница языка FALSE
- Руководство по языку FALSE (англ.)
- Страница языка owl (англ.)