FALSE

мова програмування

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

  1. Щоб можна було написати компілятор для неї розміром не більше одного кілобайта.
  2. Придумати синтаксис, який би виглядав шифровкою, випадковим набором символів.
FALSE
Дата появи 1993[1]
Розробник Ваутер ван Ортмерссенd[1]

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.

Варіанти FALSE ред.

Є написаний на ML функціональний варіант мови Strictly False [Архівовано 9 квітня 2020 у Wayback Machine.]. Ще одне функціональне розширення FALSE — мова F [Архівовано 14 березня 2021 у Wayback Machine.] (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.

Операції ^ і : слугують, відповідно, для піднесення до степеня і добування кореня. Для роботи зі стеком використовують такі операції:

Команда Стекова нотація Назва у 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-]!;.]

Див. також ред.

Примітки ред.

  1. а б FALSE — 2005.
  2. False! in K. Архів оригіналу за 26 червня 2021. Процитовано 26 червня 2021.

Посилання ред.