FALSE
FALSE — эзотерический язык программирования, созданный в 1993 году Ваутером ван Ортмерссеном с двумя, по его словам, целями:
- чтобы можно было написать компилятор для него размером не более одного килобайта.
- придумать синтаксис, который бы выглядел шифровкой, случайным набором символов.
FALSE стал одним из первых эзотерических языков программирования, в частности он послужил источником вдохновения для автора знаменитого языка Brainfuck. Не будет большим преувеличением сказать, что именно с FALSE началась мода на эзотерические языки программирования.
Вместе с тем FALSE — всё еще достаточно практичный язык программирования. Хотя его и отличает write-only синтаксис, он поддерживает разумный набор операций, в отличие от являющегося реализацией варианта машины Тьюринга Brainfuck, не говоря уже о таких чудовищных языках как INTERCAL и Malbolge. Источником идей для FALSE был язык Forth, его синтаксис также напоминает синтаксис известного калькулятора dc для UNIX (с обратной польской нотацией). Одним из основных источников сложности при программировании на FALSE является использование экзотических знаков пунктуации (не разделяемых пробелами) вместо форт-слов.
Базовые операции
Арифметические операции +
, -
, *
, и /
берут с вершины стека два верхних элемента и возвращают туда, соответственно, сумму, разность, произведение или частное. Знак подчёркивания _
— это унарная операция изменения знака числа, лежащего на вершине стека. Логические операции в 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) потоков ввода и вывода (stdin, stdout).
Реализация
FALSE был реализован как написанный на ассемблере для процессоров 68000 компилятор размером 1024 байта и переносимый интерпретатор, написанный на Си (на сайте доступна исполняемая версия для DOS). Имеется также реализация интерпретатора и компилятора для 386 DOS на ANSI Forth.
Доступна также реализация 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 |
Символы скобок используются для ввода-вывода: (
и )
ввод и вывод символа, {
и }
— ввод и вывод строки, <
— ввод чисел (операция меньше отсутствует, вместо неё используется __SUB_LEVEL_SECTION_7__gt;
).
owl также позволяет подключать inc файлы _]inc.owl[
, или запускать внешние owl программы _[file.owl]
.
В owl (что более чем необычно для эзотерических языков) даже можно вставлять в программу комментарии: строчные, начинающиеся с #
, или многострочные, помещаемые между (*
и *)
. Строчные комментарии, начинающиеся символом #, позволяют использовать owl для применения в шелл-скриптах.
Интерпретатор owl написан на Си и кроссплатформенен. Под Windows не поддерживаются возможности отладки и профилирования, не работает функции _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
Ссылки
- Wouter's Wiki : False Language (англ.) — Домашняя страница языка FALSE
- Руководство по языку FALSE (англ.)
- Страница языка owl (англ.)