Езотерични програмски језици (краће ) су програмски језици дизајнирани да тестирају границе дизајна програмских језика. Користе се као софтверска уметност, као хакерски интерфејс за друге језике (посебно функционални и процедурални програмски језици) или као шала. Реч езотерични прави разлику између ових програмских језика и програмских језика који користе програмери за писање софтвера. Најчешће, ови програмски језици нису намењени за широку употребу, иако неке карактеристике имају практичну примену у уметности. Ови језици су често популарни међу хакерима и програмерима којима је програмирање хоби. Употребљивост је ретко циљ ових програмских језика, често је сасвим супротно. Њихов циљ је да уклоне или замене стандардизоване карактеристике језика док задржавају карактеристику да су Тјуринг потпуни.

Историја Најстарији езотерични програмски језик је INTERCALMatthew FullerSoftware Studies. . Њега су 1972. године дизајнирали Don Woods и James M. Lyon са намером да исмеју тадашње програске језике као што су Fortran, COBOL и асемблерски језици. Годинама је INTERCAL био представљан само копијама приручника INTERCAL-а. Имплементација у C-у под Unix-ом је 1990. године оживела овај језик што је подстакло талас интересовања за езотеричне програмске језике. Године 1993, Wouter van Oortmerssen је креирао FALSE, мали сложени програмски језик, са синтаксом дизајнираном да учини код збуњујућим и нечитљивим. Он је имао компајлер од само 1024 бајтова. Ово је инспирисало Urban Müller-а да креира још мањи језик, сада озлоглашени Brainfuck, који се састоји од само осам препознатљивих карактера. Упоредо са Chris Pressey-овим Befunge-ом (као FALSE, али са дводимензионалним показивачем инструкција), Brainfuck је сада један од најбоље подржаних езотерничних програмских језика. Ово су канонски примери минималног Turing tarpits-а и непотребно помућених језичких карактеристика. Brainfuck је повезан са P′′ фамилијом Тјуринг машина.

Терминологија езотеричних програмских језика

Turing tarpit Тјуринг тарпит () су Тјуринг потпуни програмски језици који су непрактични зато што су минималистички, тј. имају веома ограничен број инструкција.

Кодирање са стањима

Кодирање са стањима () је метод кодирања у коме сваки подстринг кода има улогу у: проналажењу следеће инструкције у листи инструкција извршавању те инструкције, при чему се мења стање програма Обрада инструкција врши се у две фазе: дохватање операције и извршавање те операције. Листе инструкција могу бити : статичнке - као што су reMorse и THRAT динамичке - попут reMorse4ever-а Пример статичке операције:

Select Next Operation in list Perform Operation

Парадигме програмских језика

Парадигме програмских језика се могу сместити у више категорија: императивни језици (нпр. Brainfuck) где инструкције одређују како се мењају подаци функционални језици (нпр. Unlambda) где се примењују само функције, тако што једна функција покреће другу трансформациони језици () (нпр. Thue) где се извршавањем трансформационих функција мења полазно стање програма

Funge

Funge је езотерични програмски језик који креира своје програме као метричке просторе са координатним системом (углавном, али не нужно, Декартовим координатним системом). Програм извршава инструкције које се налазе у простору тако што помера показивач (вектор положаја који иницира тренутно покренуту инструкцију) по том простору. Различите инструкције одређују правац у ком ће се кретати показивач, и самим тим низ инструкција које ће се извршити. Тренутни званични стандард који одређује понашање ових програмских језика је Funge-98 спецификација. Ова спецификација представља генерализацију семантике језика Befunge, који има дводимензионалну торусну топологију. Језици који се држе ових стандарда, као што су Unefunge (једнодимензоналан) и Trefunge (тродимензионлан), се некада називају funges. Док се "даљи сродници" са разликама у значајнијим аспектима, попут Wierd-а, називају fungeoids.

Компјутер са једном инструкцијом

Компјутер са једном инструкцијом () је машина која подржава само једну инструкцију.

Недетерминистички језици

За детерминистичне језике је карактеристично да ако је дато тренутно стање програма, следећа фаза се може увек предвидети. Ово не важи за недетерминистичке језике. Највећи део језика је детерминистички, али неки језици попут Befunge-а, подржавају уграђену инструкцију за насумичност. Штавише, језици попут Java2k имају само насумичне инструкције. Стога је добијање поузданог излаза чак и за тривијалне програме скоро немогућ задатак. Недетерминистички програмски језици се могу користити за претраживање великих простора, попут граматике, где је потпуна претрага непрактична. Генератори насумичног текста попут Dada Engine и rmu су примери овог типа недетерминистичких језика. Недетерминистички алгоритми се користе у истрази хиперизрачунљивости.

Примери

У наставку се налазе примери езотеричних програмских језика:

Arnoldc

мини|upright=0.56|Арнолд Шварценегер

Arnoldc је езотерични програмски језик базиран на цитатима Арнолда Шварценегера. У наставку се налази синтакса за програм који исписује "Hello, World!". IT'S SHOWTIME TALK TO THE HAND "Hello, World!" YOU HAVE BEEN TERMINATED Неке од команди у овом програмском језику су: False - I LIED True - NO PROBLEMO If - BECAUSE I'M GOING TO SAY PLEASE ModuloOperator - I LET HIM GO EqualTo - YOU ARE NOT YOU YOU ARE ME Or - CONSIDER THAT A DIVORCE And - KNOCK KNOCK DeclareMethod - LISTEN TO ME VERY CAREFULLY MethodArguments - I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE Return - I'LL BE BACK EndMethodDeclaration - HASTA LA VISTA, BABY CallMethod - DO IT NOW AssignVariableFromMethodCall - GET YOUR ASS TO MARS SetInitialValue - YOU SET US UP BeginMain - IT'S SHOWTIME EndMain - YOU HAVE BEEN TERMINATED Print - TALK TO THE HAND ReadInteger - I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY AssignVariable - GET TO THE CHOPPER SetValue - HERE IS MY INVITATION EndAssignVariable - ENOUGH TALK ParseError - WHAT THE FUCK DID I DO WRONG

АsciiDots

АsciiDots је езотерични програмски језик који је заснован на аски уметности.Следи пример "code-golf" програма.

/#$<. *-[+] \#1/

Befunge Befunge је програм који дозвољава да се показивач инструкција пребаци у више димензије кроз код. На пример, следећи програм приказује "Hello World" избацајући знакове наслагане у обрнутом редоследу и штампајући их у петљи која циркулише у смеру казаљке на сату кроз инструкције [>], [:], [v], [_], [,], и [^]. "dlroW olleH">:v ^,_@

Binary lambda calculus Бинарни ламбда рачун је дизајниран из перспективе алгоритамске информационе теорије која дозвољава најгушћи могући код са најмањим могућим средствима. Програмски језик између осталог укључује 29 бајтова интерпретатора и 112 бајтова Brainfuck интерпретатора.

Brainfuck

Brainfuck је екстремно минимлистички језик који се састоји од 8 карактера и код је обично нечитљив. Овај језик захтева посебан компајлер или интерпретер. Следећи пример исписује "Hello World":

++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++ ..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Chef Chef је стек-оријентисан програмски језик који је David Morgan-Mar дизајнирао да прави програме који изгледају као кухињски рецепти. Програм се састоји од наслова, листе променљивих и њихових вредности података и од листе упутстава са манипулационим инструкцијама. Принцип шаљивог дизајна се састоји у томе да "програмски рецепти не би требало да генеришу само валидан излаз већ да буду и лаки за припремање и укусни". David Morgan-Mar, творац овог програмског језика, напомиње да би један пример Hello World program програма са "101 јајетом" и "111 чаша уља" произвео "много хране за једну особу."

Dark Dark је програмски језик дизајниран да буде суштинско зло. Дизајнирао га је David Catt. Програм је базиран на манипулацији целог света и димензија да би створио што неугоднију стварност. Сваки програм се чита као низ команди са циљем да сваку реч измени што више. У наставку се налази код за програм који исписује "Hello World":

+hello hell hello$twist sign hws hello$twist stalker io io$stalk io$personal hws$scrawl " Hello, world! hws$read io$echo hello$empty hello$apocalypse

FALSE

FALSE је стек-оријентисан програмски језик (енг. Stack-oriented programming) чије се команде и променљиве састоје од једног карактера. На пример 3 + 1 се може написати на следећи начин (λ x → x + 1)(3). 3[1+]!

Fim++

Fim++ је објектно-оријентисан програмски језик који је инспирисан телевизијским програмом "Moj mali poni". FiM++ програми се пишу у стилу "friedship reports" .Следећи пример исписује "Hello world": Dear Princess Celestia: Hello World!

Today I learned how to say Hello World! I said "Hello World!". That's all about how to say Hello World.

Your faithful student, Twilight Sparkle.

FRACTRAN

Програм FRACTRAN је уређена листа позитивних разломака са иницијалним позитивним целобројним улазом n. Програм се покреће множењем броја n са првим разломком f на листи за који је nf цео број. Број n је тада замењен са nf и правило се понавља. Ако ниједан разломак у листи не производи цео број када се помножи са n, онда се програм заустави. Математичар John Conway, творац овог програмског језика, је написао следећи програм за исписивање простих бројева: 17/91, 78/85, 19/51, 23/38, 29/33, 77/29, 95/23, 77/19, 1/17, 11/13, 13/11, 15/14, 15/2, 55/1

.Gertrude .GertrudeGertrude - Esolang је осмислио Gerson Kurz. Програми написани у овом језику имају елементе поезије Gertrude Stein, по којој је овај програмски језик назван. Програм се састоји од реченица на било ком језику. Програм израчунава просечну дужину речи у свакој реченици, а затим се број речи дужих од просечне дужине дели са бројем речи краћим од просечне дужине. Добијене вредности представљају инструкције и операнде.

GolfScript

GolfScript се састоји од листа које се смештају у стек, а променљиве су представљене помоћу блокова кода. Овај програмски језик подржава опсег типова података укључујући прецизне целе бројеве, и већи опсег стандардних операција од осталих езотеричних програма.

Grass Grass је функционалан програмски језик који користи једино карактере "W", "w", и "v". Према томе, програми у Grass-у изгледају као трава. Grass има формалне спецификације засноване на неутврђеном ламбда рачуну и SECD машини. Grass не треба мешати са GRASS-ом, другачијим програмским језиком.

INTERCAL

INTERCAL, скраћено од "Compiler Language With No Pronounceable Acronym", је настао 1972. године као пародија са намером да сатирично исмеје разне програмске језике тадашњег времена.

Jsfuck

Jsfuck је езотерични ЈаваСкрипт, где се код састоји од 6 карактера: [, ], (, ), !, +. За разлику од Brainfuck-a, Jsfuck је валидан ЈаваСкрипт код што значи да се сви програми који се напишу у овом језику могу покренути у било ком интернет претраживачу који интерпретира ЈаваСкрипт.JSFuck. Због малог броја валидних карактера, за писање обичног "Hello World!" програма је неопходно више од 10000 карактера.

LOLCODE LOLCODE је често критикован што није толико езотеричан, већ више личи на обичан процедурални језик са необичним речником. Следећи пример је "Hello,World!" HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE

Malbolge

Malbolge (Дантеов осми круг пакла) је дизајниран да буде најтежи и најезотеричнији програмски језик. Креирао га је Ben Olmstead in 1998. године. Између осталог, код се сам модификује по дизајну, а дејство инструкције зависи од њеног места у меморији.

Modiscript

Modiscript је езотеричан програмски језик који се састоји од цитата индијског министра Нарендра Моди. Овај језик садржи много његових идеологија као на пример цитат "No important rule" који је део његове кампање "Make in India". Следећи код исписује "Mandir Wahin Banayenge": mitrooon UP "BJP governed state hai" SP "opposition me hai" agar ye sach hai bhaiyo aur behno "Mandir wahin banayenge" nahi toh bhaiyo aur behno "Abhi decision nahi liya gaya hai"