FALSE
FALSE | |
---|---|
Дата появи | 1993[1] |
Розробник | Ваутер ван Ортмерссенd[1] |
FALSE—езотеричнамова програмування,яку створив1993року Ваутер ван Ортмерссен з двома, за його словами, цілями:
- Щоб можна було написатикомпілятордля неї розміром не більше одногокілобайта.
- Придуматисинтаксис,який би виглядавшифровкою,випадковим набором символів.
FALSEстав однією з перших езотеричних мов програмування, зокрема він став джерелом натхнення для автора знаменитої мовиBrainfuck.Вважають, що саме зFALSEпочалася мода на езотеричні мови програмування.
Разом з тимFALSE— достатньо практична мова програмування. Хоча її й відрізняєнепрочитнийсинтаксис, мова підтримує розумний набір операцій, на відміну відBrainfuck,який є реалізацією варіантумашини Тюрінга,не кажучи вже про такі «жахливі» мови якINTERCALіMalbolge.Джерелом ідей дляFALSEбула моваForth,її синтаксис також нагадує синтаксис відомого калькулятораdcдляUNIX(зізворотною польською нотацією). Одним з основних джерел складності під час програмування наFALSEє використання екзотичних знаків пунктуації (не розділюваних пропусками) замість форт-слів.
Арифметичні операції+
,-
,*
,і/
беруть із вершинистекадва верхні елементи і повертають туди, відповідно, суму, різницю, добуток або частку. Знак підкреслення_
— це унарна операція зміни знака числа, яке лежить на вершині стека. Логічні операції уFALSEце бінарні=
,>
,&
,|
і унарна операція логічного заперечення~
.
Досить екзотичний синтаксис уFALSEмають стекові операції:
$
— дублює вершину стека (уForthDUP): 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). Є також реалізація інтерпретатора і компілятора для386DOSнаANSIForth.
Доступна також реалізація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.](англ.)