FALSE

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

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

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

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.

ВаріантиFALSE

[ред.|ред. код]

Є написаний на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-]!;.]

Див. також

[ред.|ред. код]

Примітки

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

Посилання

[ред.|ред. код]