FALSE

Материал из Википедии — свободной энциклопедии

FALSE — эзотерический язык программирования, созданный в 1993 году Ваутером ван Ортмерссеном с двумя, по его словам, целями:

  1. чтобы можно было написать компилятор для него размером не более одного килобайта.
  2. придумать синтаксис, который бы выглядел шифровкой, случайным набором символов.

FALSE стал одним из первых эзотерических языков программирования, в частности он послужил источником вдохновения для автора знаменитого языка Brainfuck. Не будет большим преувеличением сказать, что именно с FALSE началась мода на эзотерические языки программирования.

Вместе с тем FALSE — всё ещё достаточно практичный язык программирования. Хотя его и отличает write-only синтаксис, он поддерживает разумный набор операций, в отличие от являющегося реализацией варианта

). Одним из основных источников сложности при программировании на 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) потоков ввода и вывода (

stdout
).

Пример

Пример определения функции факториал на FALSE:

[$1=$[\%1\]?~[$1-f;!*]?]f:

Реализация

FALSE был реализован как написанный на ассемблере для процессоров

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

Символы скобок используются для ввода-вывода: ( и ) ввод и вывод символа, { и } — ввод и вывод строки, < — ввод чисел (операция "больше" отсутствует, вместо неё используется $>).

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-]!;.]?

Примечания

  1. javascript FALSE interpreter Архивировано 25 ноября 2010 года.
  2. False! in K. Дата обращения: 27 октября 2010. Архивировано 26 июня 2021 года.

Ссылки