FALSE
FALSE | |
---|---|
Дата появи | 1993[1] |
Розробник | Ваутер ван Ортмерссенd[1] |
FALSE — езотерична мова програмування, яку створив 1993 року Ваутер ван Ортмерссен з двома, за його словами, цілями:
- Щоб можна було написати компілятор для неї розміром не більше одного кілобайта.
- Придумати синтаксис, який би виглядав шифровкою, випадковим набором символів.
FALSE став однією з перших езотеричних мов програмування, зокрема він став джерелом натхнення для автора знаменитої мови Brainfuck. Вважають, що саме з FALSE почалася мода на езотеричні мови програмування.
Разом з тим FALSE — достатньо практична мова програмування. Хоча її й відрізняє непрочитний синтаксис, мова підтримує розумний набір операцій, на відміну від Brainfuck, який є реалізацією варіанту машини Тюрінга, не кажучи вже про такі «жахливі» мови як INTERCAL і Malbolge. Джерелом ідей для FALSE була мова Forth, її синтаксис також нагадує синтаксис відомого калькулятора dc для UNIX (зі зворотною польською нотацією). Одним з основних джерел складності під час програмування на FALSE є використання екзотичних знаків пунктуації (не розділюваних пропусками) замість форт-слів.
Арифметичні операції +
, -
, *
, і /
беруть із вершини стека два верхні елементи і повертають туди, відповідно, суму, різницю, добуток або частку. Знак підкреслення _
— це унарна операція зміни знака числа, яке лежить на вершині стека. Логічні операції у FALSE це бінарні =
, >
, &
, |
і унарна операція логічного заперечення ~
.
Досить екзотичний синтаксис у FALSE мають стекові операції:
$
— дублює вершину стека (у Forth 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:
[$1=$[\%1\]?~[$1-f;!*]?]F:
FALSE реалізовано як написаний на асемблері для процесорів 68000 компілятор розміром 1024 байти і переносний інтерпретатор, написаний на Сі (на сайті доступна виконувана версія для DOS). Є також реалізація інтерпретатора і компілятора для 386 DOS на ANSI Forth.
Доступна також реалізація FALSE на JavaScript.
Є написаний на ML функціональний варіант мови Strictly False [Архівовано 9 квітня 2020 у Wayback Machine.]. Ще одне функціональне розширення FALSE — мова F [Архівовано 14 березня 2021 у Wayback Machine.] (Functional False), написана на K (і реалізація «чистої» FALSE тією ж мовою[2]).
Розвитком ідей FALSE є мова owl (англ. Obfuscated Weird Language), яку розробив Antonio Maschio між 2005 і 2006. Від FALSE її відрізняє значна практична спрямованість, розширений набір операцій (з іншим символьним позначенням), наявність роботи з рядками тощо.
Зокрема, owl розрізняє цілі змінні і змінні-функції. Перші позначаються великими літерами, другі малими. Для присвоювання значень і тим, і іншим використовується кома ,
а для отримання значення або запуску функції — @
. Крім того, у віртуальній машині owl є 1 масив, довжина якого за замовчуванням дорівнює 32 КіБ, для роботи з яким використовують операції #,
і #@
(а також @,
і @@
для функцій).
Як if і while використовують символи ?
і !
, ці операції розрізняють, міститься на стеку один чи два лямбда-вирази. Так, якщо лямбда-виразів два, ?
працює як if … then … else.
Операції ^
і :
слугують, відповідно, для піднесення до степеня і добування кореня. Для роботи зі стеком використовують такі операції:
Команда | Стекова нотація | Назва у Forth |
$
|
(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-]!;.]
- Wouter's Wiki: False Language [Архівовано 27 червня 2021 у Wayback Machine.](англ.) — Домашня сторінка мови FALSE
- Керівництво по мові FALSE(англ.)
- Сторінка мови owl [Архівовано 15 травня 2021 у Wayback Machine.](англ.)