Esoteerilised programmeerimiskeeled: Difference between revisions
(→Tree) |
|||
Line 88: | Line 88: | ||
=====Tree===== | =====Tree===== | ||
Kunstilise lähtekoodiga on ka Tree, mille autoriks on [https://esolangs.org/wiki/User:Hiato Tslil Clingman]. Clingman soovis luua keelt, mille kood näebki välja nagu puu ning mis samaaegselt ei oleks Turingi-täielik. Enda missiooni sooritas Clingman edukalt ning valmiski esokeel, mille lähtekood meenutab puud. Kood, nagu ka puud, koosnevad okstest, lehtedest ja ei saa unustada ka putukaid. Igal elemendil on nii koodis kui puu eluviisis oma roll. Näiteks putukad on esokeel Tree puhul kahe elemendi võrdlejad, kes vaatavad, kas kaks elementi on võrdsed (=), ei ole võrdsed (!=) või kas esimene on teisest suurem (>). Nii nagu igal puul, peab ka Tree koodis olema olemas peamine vertikaalne “oks” ehk tüvi ning lehed võivad olla ainult okste otsas. Kuigi looduses ei määra keegi, mitu putukat ühel oksal pesitseb, tohib neid Tree esokeele puhul kahe oksa kohta olla ainult üks.<ref name="Tree">https://esolangs.org/wiki/Tree</ref> Kuna keele toimimine pole nii keerukas nagu on Hexagony oma, piisab programmi mõistmiseks keelt tutvustavast [https://esolangs.org/wiki/Tree Esolangs leheküljest]. | Kunstilise lähtekoodiga on ka Tree, mille autoriks on [https://esolangs.org/wiki/User:Hiato Tslil Clingman]. Clingman soovis luua keelt, mille kood näebki välja nagu puu ning mis samaaegselt ei oleks Turingi-täielik. Enda missiooni sooritas Clingman edukalt ning valmiski esokeel, mille lähtekood meenutab puud. Kood, nagu ka puud, koosnevad okstest, lehtedest ja ei saa unustada ka putukaid. Igal elemendil on nii koodis kui puu eluviisis oma roll. Näiteks putukad on esokeel Tree puhul kahe elemendi võrdlejad, kes vaatavad, kas kaks elementi on võrdsed (=), ei ole võrdsed (!=) või kas esimene on teisest suurem (>). Nii nagu igal puul, peab ka Tree koodis olema olemas peamine vertikaalne “oks” ehk tüvi ning lehed võivad olla ainult okste otsas. Kuigi looduses ei määra keegi, mitu putukat ühel oksal pesitseb, tohib neid Tree esokeele puhul kahe oksa kohta olla ainult üks.<ref name="Tree">https://esolangs.org/wiki/Tree</ref> Kuna keele toimimine pole nii keerukas nagu on Hexagony oma, piisab programmi mõistmiseks keelt tutvustavast [https://esolangs.org/wiki/Tree Esolangs leheküljest]. | ||
"Hello, World!" Tree keeles:<ref name="Tree /> | |||
<pre> | <pre> | ||
^ | ^ | ||
Line 108: | Line 110: | ||
| | | | ||
</pre> | </pre> | ||
====Mittetekstilise lähtekoodiga keeled==== | ====Mittetekstilise lähtekoodiga keeled==== |
Revision as of 05:21, 6 December 2021
Sissejuhatus
Mis on esoteerilised programmeerimiskeeled?
Esoteerilised programmeerimiskeeled ehk esokeeled (ingl k esolangs) on programmeerimiskeeled, mis pole loodud praktiliseks kasutamiseks, vaid hoopis näiteks veidrate ideedega eksperimenteerimiseks, programmeerija elu võimalikult raskeks tegemiseks või lihtsalt nalja pärast. Näiteks võivad esokeeled olla äärmiselt keerulised kirjutada, proovida kasutada võimalikult vähe käske või hoopis lähtekoodi kujul näha välja nagu Shakespeare’i näidend.[1] Kuigi esokeeltega tegelemine võib olla paeluv ka lihtsalt nende absurdsuse või omapära tõttu, võib neist huvituda ka seepärast, et need justkui kombivad ja venitavad programmeerimiskeeleks olemise piire – piire, mille paindlikkust katsetama praktiliseks kasutuseks mõeldud programmeerimiskeeled tavaliselt ei kipu.
Lühike ajalugu
Programmeerimiskeeled, mida võib lugeda esoteerilisteks, eksisteerisid juba enne 1960. aastat. Taoliste nii-öelda eelajalooliste esokeelte eripära on see, et need olid tegelikult mõeldud tõsiseks kasutamiseks – nende veidrus tulenes lihtsalt sellest, et veel ei teatud, mida korralikud programmeerimiskeeled endast üldse kujutama peaksid. Tänapäevased programmeerimiskeelte (ja ka programmeerimise enda) disainipõhimõtted polnud veel välja töötatud ning nende keelte näol on tegemist tõsiste katsetega programmeerimiskeelte võimalusi avastada ja piire avardada.[2] Esimeseks "tõeliseks" esokeeleks peetakse 1972. a loodud INTERCAL’i.[1] Erinevalt eelnenud proto-esokeeltest oli INTERCAL’i loomisel mittepraktiline eesmärk – mitte omada ühtegi sarnasust ühegi olemasoleva programmeerimiskeelega – ning just tänu INTERCAL’ile levis idee, et kahtlase süntaksi ja semantikaga keeli võiks eraldi nähtusena lähemalt uurida.[2][1]
Mõne teise arvamuse järgi on esimene „tõeline“ esokeel hoopis 1993. aastal kirjutatud FALSE.[3] Oma autori meelistõeväärtuse järgi nime saanud FALSE loodi eesmärkidega 1) omada väikseimat võimalikku kompilaatorit ja 2) olla võimalikult raskesti mõistetav.[3][4] FALSE’i poolt on inspireeritud muuhulgas ka kaks samuti 1993. aastal kirjutatud ülipopulaarset esokeelt brainfuck ja Befunge, milledest omakorda on inspireerunud paljude teiste esokeelte autorid.[1][3][4]
Turingi-täielikkusest
Programmeerimiskeelt kutsutakse Turingi-täielikuks (Turing-complete), kui see suudab läbi viia kõiki arvutusi, mida suudab universaalne Turingi masin. [5] Antud omaduse olulisus tuleneb sellest, et Turingi masin on justkui algoritmi kontseptsiooni kehastus - tegemist on realistlike arvutusklasside võimekaima versiooniga, milles on võimalik implementeerida kõiki konkreetseid algoritme. [5][6] Tasub mainida, et Turingi-täielikud saavad olla vaid abstraktsed süsteemid (nt programmeerimiskeeled) - reaalsetel süsteemidel (nt arvutitel) on kindlad füüsilised piirangud, mistõttu nad ei saa olla Turingi-täielikud.[5]
Kuigi tihti soovitakse esokeeli kirjutades neid ka Turingi-täielikeks luua, pole see kuidagi vajalik tingimus esokeel olemiseks. Esiteks, arvatavasti eelistaksid paljud esokeelte entusiastid huvitavat, kuid mitte Turingi-täielikku esokeelt esokeelele, mis on Turingi-täielik, kuid ebahuvitav. Teiseks motiveerib Turingi-täielikkuse nõude puudumine inimesi looma keeli, mille kohta ei teata, kas need on Turingi-täielikud või mitte - see saab tõstatada lahendamata küsimusi, mille lahendamine võib heita valgust arvutamise olemuse tundmatutele aspektidele. Kui demonstreeritakse, et mingi esokeel pole Turingi-täielik, soovitakse tihti luua sellest keelest Turingi-täielik versioon. Seetõttu võivad mõne esokeele varased versioonid mitte olla Turingi-täielikud, kuigi hilisemad seda on. Ka saab ühest esokeelest välja kujuneda mitmeid väikeste muudatustega haruversioone, mille tekkimise üheks põhjuseks võib olla Turingi-täielikkuse poole püüdlemine.[5]
Populaarsed probleemid
Esoteerilistel programmeerimiskeeltel on tuntud nimekiri probleemidest, nende probleemide lahendatavus esokeeles näitab selle keele küpsust ja mingil määral ka täielikkust. Tegelikult niinimetatud populaarsed probleemid peegeldavad keele funktsionaalsusi ja võimekusi. Enamikel juhtudel esokeeled, mis antud probleemid lahendavad, on ka vastuvõetavad kui reaalsed esoteerilised programmeerimiskeeled. [7]
Osad esokeelte populaarsed probleemid:
- "Hello, world!" printimine;
- Fibonacci jada printimine kasutades selleks rekursiooni või iteratsiooni;
- Faktoriaali funktsioon;
- Algarvude eristamine etteantud vahemikust;
- Lõputu silmus (ingl. k infinite loop);
- FizzBuzz programm.
Temaatilised keeled
Temaatiliste esokeelte omapära seisneb selles, et need pole loodud mingi kindla programmeerimisparadigma avastamiseks, vaid hoopis kindla (enamasti mõnest inimkultuuri kontseptsioonist pärit) teema esindamiseks.[8]
Pseudonaturaalsed keeled
Pseudonaturaalsed keeled on esokeeled, mis sarnanevad süntaksi poolest mingisugusele loomulikule inimkeelele. Näib, et selle liigituse nimetuse sobivuses kaheldakse: näiteks sisaldab see kategooria ka tehiskeeltel põhinevaid esokeeli, mis ei sobi nimetuse "naturaalse" osaga hästi kokku. Samuti tundub selle kategooria lehekülg esokeelte vikis üsna puudulik - mitmed esokeeled, mis peaksid olema pseudonaturaalsed, pole seal loetletud. Sellest hoolimata sobivad pseudonaturaalsed keeled mõistlikuks alamjaotuseks temaatilistele keeltele; mainitud probleemidest tasub olla teadlik, kuid need ei tähenda, et pseudonaturaalsus poleks käesolevas töös temaatiliste keelte kontekstis asjalik kategooria.[9]
The Shakespeare Programming Language
Shakespeare ehk Shakespeare Programming Language ehk SPL on 2001. aastal Karl Wiberg’i ja Jon Åslund’i poolt kirjutatud Turingi-täielik esokeel, mille loomiseesmärk oli, et loodava esokeele lähtekood sarnaneks Shakespeare’i näidenditekstile.[3][10] Tõepoolest, SPL’is kirjutatud programmid kipuvad väga näidendilaadse välimusega olema. Iga programm algab nõndanimetatud pealkirjaga (tegelikult on tegemist esteetilistel eesmärkidel nõutud kommentaariga). Muutujad SPL’is on tegelaskujud Shakespeare’i näidenditest ning neile omistatakse väärtusi repliikide kaudu – kindlad sõnatüübid muudavad omistatavat väärtust erineval moel. Näiteks nimisõnad on alati kas konstant 1 või -1, sõltuvalt sellest, kas tegemist on "kena" nimisõnaga või mitte. (Muutujate väärtused on alati täisarvud, kuid kasutades lauset "Speak your mind", saab väljundisse printida ka nendele arvudele vastavaid tähemärke. Samuti pole tegelaste "mälu" piiratud vaid nende väärtuse talletamisega – iga tegelane saab "meelde jätta" mitmeid väärtusi, käitudes pinuna.) Ka struktuuri poolest on kood näidendilaadne; programm jaguneb vaatusteks, need omakorda stseenideks ning stseenid omakorda repliikideks. Vaatusi ja stseene saab kasutada goto-lausetes nendeni "hüppamiseks".[11]
![](/images/thumb/9/95/Shakespeare_example.png/600px-Shakespeare_example.png)
Chef
Chef (ingl. k kokk) on 2002. aastal David Morgan-Mar’i poolt loodud Turingi-täielik esokeel, milles kirjutatud programmid näevad välja nagu toiduretseptid.[12][13] Üks Chef’i disainipõhimõtetest ütleb, et Chef’i retseptid peaksid lisaks korrektse väljundi genereerimisele olema ka lihtsalt valmistatavad ja maitsvad.[13]
Iga retsept sisaldab koostisosasid, mis hoiavad endas andmeväärtusi. Sarnaselt SPL’iga on Chef’is kõik koostisosad arvuliste väärtustega, kuid neid saab interpreteerida ka Unicode’i tähemärkidena – nimelt vedelad koostisosad muudetakse väljundis tähemärkideks. Samuti on võimalik kasutada piiramatut arvu segamis- ja küpsetusnõusid, mis täidavad andmestruktuuride – täpsemalt pinude – rolli. Taaskord sarnaselt SPL’iga peab iga Chef’i programm algama pealkirjaga, kuigi pealkirja sisu programmi funktsionaalsust ei mõjuta. Pealkirjale võib järgneda koostisosade nimekiri, kus deklareeritakse koostisosade nimed ja mõõtühikud (mis määravad ära, kas see koostisosa on vedel, kuiv või ükskõik kumb) ning võib ka omistada koostisosadele algsed väärtused. Koostisosade nimekirjale võivad järgneda küpsetusaeg ja/või ahjutemperatuur, kuid need ei mõjuta programmi funktsionaalsust ja ei pea programmis üldse leiduma.[13]
Programmi peamine osa (method) koosneb lausetest. Üldiselt eraldatakse laused reavahetustega, kuid interpreteerides neid ignoreeritakse. Laused valitakse piiratud juhiste hulga seast, mis kõik meenutavad päris toiduretsepti juhiseid. Näiteks "Put sugar into 2nd mixing bowl." paneb "sugar"-nimelise koostisosa väärtuse teise segamisnõusse ja "Add dry ingredients to 4th mixing bowl." lisab kõikide kuivade koostisosade väärtuste summa neljandasse segamisnõusse. Retseptides saab kasutada tsükleid ja lisaretsepte. Et retsept annaks väljundit, tuleb see lõpetada "Serves number-of-diners." lausega, mispeale väljundisse pannakse esimese number-of-diners arvu küpsetusnõude sisu.[13] Kuigi suvaliselt kirjutatud Chef’i programmi retseptina interpreteerimisel arvatavasti ei oleks tulemuseks midagi maitsvat või isegi väga söödavat, on veidi pingutades täiesti võimalik luua Chef’i programmi, mis ka süüa kõlbab. Üks hea näide sellest on Mike Worth’i kirjutatud (ja küpsetatud) "Hello World'i kook".
Rockstar
Rockstar on 2018. a Dylan Beattie' poolt loodud Turingi-täielik esokeel, milles kirjutatud programmide lähtekood peaks meenutama lauluteksti. Rockstar loodi eesmärgiga ajada segadusse värbajaid, kes tööpakkumistes otsivad kedagi, kes võiks olla "rockstar developer" - piinlikult naeruväärne ja ebamäärane fraas, mis siiski näis tööpakkumistes populaarne nõue olevat. Nalja mõte seisneb selles, et kui tegelikult leidub lihtsalt õpitav keel nimega "Rockstar", siis saab igaüks panustada paar minutit sellega tutvumisele ning seejärel end tõsimeeli nimetada "rockstar developeriks". Seega tulenes keele rokklaulu teksti meenutav välimus keele nimest, mitte vastupidi.[14]
Rockstar on mõeldud "andma programmeerijale enneolematult suure poeetilise vabaduse oma programmide struktuuri ja koosseisu osas". Poeetiline vabadus aga ei tähenda tingimata muud sorti vabadust. Näiteks ei saa avaldistes kasutada sulge - sulud on mõeldud kommentaaride jaoks, kuigi kommentaaride kasutamist soovitatakse tungivalt vältida -, mistõttu võib keerulisemate avaldiste korral olla vaja kasutada mitmeid ridu koodi. Võrreldes näiteks äsja käsitletud SPL'i ja Chef'iga sisaldab Rockstar mõnevõrra rohkem tööriistu: sõned on implementeeritud eraldi andmetüübina, keelde on sisseehitatud kasulikud funktsioonid nagu ümardamine ja ühevõrra suurendamine... Nagu võib arvata, on Rockstar'i võtmesõnad laulusõnadesse sobivad ning mitmetel on ka alternatiive, et võimaldada vähem monotoonse lüürika loomist. Näiteks võib Tommy
-nimelisele muutujale null-väärtuse omistamiseks kasutada nii lauset Tommy was nobody
kui ka Tommy is gone
. Muidugi, ka aritmeetilised operatsioonid esinevad sõnade kujul: näiteks My world is nothing without your love
määrab My world
-nimelise muutuja väärtuseks 0
'i ja your love
-nimelise muutuja vahe. Vältimaks liigset numbrite kasutamist saab muutujatele arvulisi väärtusi määrata sõnades olevate tähemärkide arvu (moodul 10-ga) järgi: Tommy was a lovestruck ladykiller
seab Tommy
väärtuseks 100
.[15] Taolisi võimalusi loovalt kasutades saab muljetavaldavalt laululaadseid programme kirjutada.
Lõik Rockstar'is kirjutatud FizzBuzz programmist:[15]
Desire is a lovestruck ladykiller My world is nothing Fire is ice Hate is water Until my world is Desire, Build my world up If Midnight taking my world, Fire is nothing and Midnight taking my world, Hate is nothing Shout "FizzBuzz!" Take it to the top
English
English (mitte ajada segamini ~English'iga!) on väga hea näide sellest, kui kaugele saab esokeelte põhimõtteid viia. English ongi põhimõtteliselt lihtsalt inglise keel. English'is kirjutatud programmid on ingliskeelsed kirjeldused sellest, mida see programm tegema peab. Näiteks Hello World programm English'is näeb välja selline: This program writes "Hello World" (without quotes) to the output.
. Kuigi mingil määral on selleks suudetud kasutada ka masinõpet, on English'i kompilaatorid enamasti programmeerijad (ehk inimesed), kes kipuvad olema aeglased ja tegema palju vigu. Samuti on English'is kirjutatud programme vahel võimalik interpreteerida mitmel erineval korrektsel viisil ning arvutamatuid English'i programme ei suuda ka inimesed kompileerida. Üheks arvutamatu English'i programmi näiteks on This program solves the halting problem.
.[16]
Artistlikud keeled
Artistliku lähtekoodiga keelte kategooria ei ole küll kõige traditsioonilisem ja levinum viis esokeeli kategoriseerida, kuid selle osa autori silmis on see paslik. Tegu on otseses mõttes artistlike keeltega. Olgu selleks artistlikuks osaks see, et kood meenutab sõna otseses mõttes kunsti[17], noodilehte[18] või näeb lihtsalt esteetiline välja. Lähtekoodiga on võimalik kunsti teha erinevatel viisidel. Lihtsam ja ilmselgem viis oleks luua kunsti tekstiga.
Tekstipõhise lähtekoodiga keeled
Hexagony
Üheks lihtsama välimusega esokeele näiteks oleks Hexagony, mille autoriks on Martin Ender. Selles keeles loetakse juhiseid kuusnurkses võrestikus, mälu on kuusnurkne ning lähtekood on kuusnurkne. Paistab, et kõik, mis vähegi võimalik, on tehtud selle keele puhul kuusnurkseks. Hexagony nimetus on kombinatsioon sõnadest “hexagon” (kuusnurk) ja “agony” (agoonia), sest selles keeles programmeerimine võib just viimast põhjustada. Hexagony on ka Turingi-täielik esokeel.[19] Keele autor on koostanud ka Hexagony interpreteerimise seletuse, kui kellegi mõistus seda hoomab, on sellest kindlasti palju kasu.
"Hello, World!" Hexagony keeles:[19]
H ; e ; l ; d ; * ; r ; o ; W l ; ; o ; * 4 3 3 ; @ . > ; 2 3 < \ 4 ; * /
Tree
Kunstilise lähtekoodiga on ka Tree, mille autoriks on Tslil Clingman. Clingman soovis luua keelt, mille kood näebki välja nagu puu ning mis samaaegselt ei oleks Turingi-täielik. Enda missiooni sooritas Clingman edukalt ning valmiski esokeel, mille lähtekood meenutab puud. Kood, nagu ka puud, koosnevad okstest, lehtedest ja ei saa unustada ka putukaid. Igal elemendil on nii koodis kui puu eluviisis oma roll. Näiteks putukad on esokeel Tree puhul kahe elemendi võrdlejad, kes vaatavad, kas kaks elementi on võrdsed (=), ei ole võrdsed (!=) või kas esimene on teisest suurem (>). Nii nagu igal puul, peab ka Tree koodis olema olemas peamine vertikaalne “oks” ehk tüvi ning lehed võivad olla ainult okste otsas. Kuigi looduses ei määra keegi, mitu putukat ühel oksal pesitseb, tohib neid Tree esokeele puhul kahe oksa kohta olla ainult üks.[20] Kuna keele toimimine pole nii keerukas nagu on Hexagony oma, piisab programmi mõistmiseks keelt tutvustavast Esolangs leheküljest.
"Hello, World!" Tree keeles:[20]
^ ^^|^^ ^^\|/^^ H^ |/^^^ \| e |/ ol~| \| , 32| \/ | \ | W l \| / \ d |/ o \/ !|r / \/ |\/ \ |/ \| |
Mittetekstilise lähtekoodiga keeled
Piet
Kõige tuntum, otse visuaalsest kunstist inspireeritud esokeel on Piet[17]. Pieti autoriks on David Morgan-Mar ning nagu keele nimest juba paista võib, on see inspireeritud Piet Mondriani kunstist. Morgan-Mar lootis esialgu enda esokeele nimeks panna hoopis Mondrian, kuid see nimi oli juba kellegi teise poolt võetud[21] ning Morgan-Mar ei pea Mondrian keelest eriti suurt lugu, pidades seda liiga igavaks[17]. Piet'i lähtekood on abstraktse kunsti vormis. Nimelt koosneb kood 20 erinevast värvist (soovi korral võib sinna implementeerida ka teisi värve, muidu koheldakse neid värve samamoodi nagu valget, mis on tühjus).
![](/images/thumb/d/d4/PietColors.jpg/400px-PietColors.jpg)
Värvid on üksteisega tsükliliselt seotud värvitooni ning heleduse järgi, valge ja must ei kuulu neisse tsüklitesse. Kood algab üleval vasakus nurgas ning jookseb alumise parema nurgani, muutes musta värviblokini (nö. seinani) jõudes suunda päripäeva. Värvitooni ning heleduse-tumeduse muutumise sammude arv määrab, millist käsku täidetakse. Põnevaid Pieti programme on võimalik näha David Morgan-Mari enda kodulehelt.[17]
![](/images/5/57/Piet_helloworld.gif)
*Selle osa autor sai Piet'i autorilt isikliku loa tema lehelt näidisprogrammide pilte selles töös kasutada, autoriõiguseid pole rikutud.
Floater
Esokeelte viki kasutaja Zom-B, kelle kasutajakonto on praeguseks kustunud, oli Pietist inspireeritud ning soovis luua uue keele, mille kasutamiseks ei pea kõiki Piet'i tsükleid meelde jätma ning mille programmeerimine ja jooksutamine oleksid lihtsamad. Sedasi sündiski Floater. Tõsi, kuigi esmatarvilikke instruktsioone on keeles vähe, on Floater siiski kohati üsna keeruline. Tema keerulisus seisneb nö. eksootilistes instruktsioonides, millega saab erinevaid keerukamaid lahenduskäike läbi viia (logaritmid, trigonomeetria ja muu selline).[23] Kõik Floater'i instruktsioonid on välja toodud esokeelte vikis.
![](/images/thumb/6/62/Floater_helloworld.gif/500px-Floater_helloworld.gif)
Ülaltoodud näide on kohati aegunud, töötamiseks peaksid pruunid kastid olema hallid.[23]
Fugue
Kuigi Fugue pole nö. visuaalse kunsti esindaja, on ta selle peatüki autori silmis siiski artistliku lähtekoodiga keel. Nimelt on Nikita Ayzikovsky loodud esokeele Fugue lähtekoodiks muusika, täpsemalt noodid. Keel jagab instruktsioone sama autori loodud keelega Prelude. Fugue koodi kompilaator genereerib 80x86 koodi MIDI failist ning oskab samuti MIDI faili inimestele mõistetavasse formaati muuta. [18]
![](/images/thumb/b/b6/Fugue_hworld.png/500px-Fugue_hworld.png)
Veel temaatilisi keeli
Huvitavaid ja omapäraseid esokeeli võib alati juurde leida ning nende kõigi üksikasjalik kirjeldamine pole käesoleva kirjatöö eesmärk. Siiski, andmaks lugejale laiema arusaama sellest, milliseid erinevaid temaatilisi esokeeli leidub, mainib siinne alapeatükk põgusalt veel mõnda huvitavat näidet temaatilistest esokeeltest.
4
"Pii viimase komakoha" järgi nimetatud 4 sisaldab kümmet operatsiooni, millest igaühele vastab üks kümnendsüsteemi number. Iga 4's kirjutatud programm peab algama 3.
ga ja lõppema 4
ga - programmeerimine toimub nende vahele numbreid (mis käituvad nii operatsioonide kui operandidena) kirjutades. Näiteks 4's kirjutatud Hello World näeb välja selline: 3.6000160103602136033260433605446067260787008070200908000120902111120111011015065095105105115055035075115125105085044
Mittenumbrilisi tähemärke võib koodi vahele suvaliselt sisestada ilma funktsionaalsust mõjutamata, kuid see on esteetiliselt taunitav.[25]
Quipu
Inkade poolt andmekandjana kasutatud sõlmnööri poolt inspireeritud Quipu näebki välja nagu hulk sõlmitud ja punutud nööre.[26]
"0 1 2" 1& 1& 1& [] ++ [] /\ 1% \n -- /\ 3& == 0& ??
Quipu programm, mis prindib välja arvud 0-st 99-ni.[26]
var'aq
Esokeeled võivad olla inspireeritud ka tehiskeeltest, nagu fiktsionaalsel Klingoni keelel põhinev var'aq. Näide: var
-nimelisele muutujale väärtuse 1
omistamine: 1 lI'moH var cher (* var = 1 *)
.[27]
Fishing
Fishing erineb senistest näidetest mõnevõrra, kuna see ei proovi sarnaneda mingile kultuurilisele teosele või objektile, vaid hoopis jäljendab üht tegeliku elu tegevust - kalapüüki. Programmi peamiseks osaks on kai peal kõndiv kalamees, kes saab õnge heita ja kalu püüda. Käsklusi saab programmile anda kai ja kalade kaudu.[28]
v+CC[vCCCCCCCC?!CCCCCCCCCC?!CCCCCCCCCCCCCCCCC?!CCCCCC?!CCCCCC?!CCCCCC?!CCCCCCD_ n{D E`-1`n} = {E`256`n} = { E`>>`PEI{E`i`}= {E`d`}= {E`s`}= {E`o`}= {{N}} D D _DDDDDDDDDDD] D D D D D D < D D D D D D D < < < < D D EC }C }C }C }C D D `C iC dC SC NC D D 0C {C {C {C {C D D `C D D D D D D nC D D D D D D {C D D D D D |DDDDDDDDD]DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD]DDDDDDD]DDDDDDD]DDDDDDD]DDDDDDDD]
Fishing'us kirjutatud interpretaator Deadfish-nimelisele esokeelele.[28]
PokéBattle
PokéBattle imiteerib maailmakuulsast videomänguseeriast pärit Pokémon'ideks kutsutavate olendite lahinguid. Kõik toimub kordamööda käikhaaval, iga Pokémon talletab endas ühe muutuja väärtust (need on tema "elud") ning neid muutujaid saab mõjutada kindlate tegevustega seda Pokémon'i sihtides.[29]
Baba Is You
PokéBattle'i näol oli tegemist videomängust inspireeritud, kuid siiski sellest paljuski erineva esokeelega. Mõnikord aga võib videomäng osutuda juba ise põhimõtteliselt esokeeleks - nagu mõistatusvideomängu Baba Is You korral. Baba Is You toimub kahedimensioonilisel ruudustikul, kus asuvaid blokke ringi liigutades saab muuta mängu enda reegleid. Kuigi mängus üldiselt on ruudustiku paigutus ja selle elemendid juba kindlal viisil asetatud - tegemist on loogikamõistatustega, mida mängija peab lahendama -, on olemas ka režiim, kus mängija saab ise elemente oma soovi järgi paigutada. Tuleb välja, et selles režiimis on võimalik otse mängu sees "kirjutada" erinevaid programme. Tasub mainida, et kui mänguruudustik laiendada lõputuks, on Baba Is You ka Turingi-täielik.[30]
Minimalistlike kompilaatoritega esokeeled
Käsitleme kompilaatorite üht ekstreemumi – väikese jalajäljega kompilaatorid. Minimalistlike kompilaatorite kirjutamine ei ole ainult populaarne osade esokeelte autorite seas. Tuntumate keelte kompilaatoreid on sarnaselt esokeeltele viidud võimalikult minimalistlikule kujule. Motiivid selliste kompilaatorite tegemise taga on erinevad. Mõne arendaja jaoks on olnud põhjuseks isiklik huvi. Teise jaoks aga praktiline vajadus, kui on tarvilik väga väikeste tehnoloogiliste nõuetega kompilaator.
Vaadates korra esokeeltest mööda, siis ühed tuntumad minimalistlikud kompilaatorid on Fabrid Bellardi loodud 100KB suurune "Tiny C Compiler".[31] Tiny C Compiler on niivõrd väikese jalajäljega, et seda on võimalik käitada otse ka esimestel kolmepoole tollistel flopiketastel, mille suurused küündivad vaid paarisaja kilobaidini. Teise minimalistliku kompilaatorina väärib ära märkimist Dennis Allisoni loodud 4KB suurune kompilaator "Tiny BASIC". Tiny BASIC sealjuures on ka BASIC keele üks paljudest dialektidest.[32]
Jätkates kompilaatorite minimaalsuse narratiiviga, siis esoteeriliste keelte autoritel on selles osas eeliseid. Eelnevalt käsitletud kompilaatorite "Tiny C Compiler" ja "Tiny BASIC" autorid pidid arvestama C ja BASIC keelte eripäradega. Esokeelte autoritel, olles ise samal ajal ühe abstraktse keele autoritest, on võimalik sellega mõjutada ka kompilaatori vajadusi ehk siis teisisõnu viia seda võimalikult miinimumi.
FALSE
FALSE on 1993. aastal Wouter van Oortmersseni poolt loodud pinupõhine keel. FALSE keel omab sarnasusi 1970. aastal loodud mitte esoteerilise programmeerimiskeelega Forth.[33] FALSE keele loomisel oli keele autoril kaks peamist eesmärki – luua obfuskeeritud süntaksiga keel ja sellele luua võimalikult minimalistlik kompilaator. Wouteri loodud kompilaator on vaid 1024 baidi suurune, mis on kirjutatud 68000 assemblerkeeles. Kahjuks ei olnud võimalik väikseima kompilaatori tiitlit FALSE-l kaua hoida, sest samal aastal loodi juba uus esokeel veel minimalistlikuma kompilaatoriga. FALSE keel on ka Turingi-täielik esokeel.[4]
FALSE esokeele positiivseks küljeks võib pidada lisaks oma minimalismile ka seda, et Wouter on keelt luues lisanud sinna tavalisest esokeelest rohkem funktsionaalsusi. Näiteks FALSE-s on olemas tugi erinimelistele muutujatele, lambda-funktsioonidele ja silmustele. Nende funktsioonide olemasolu ei ole esokeelte puhul tavapärane ja seetõttu väärib ka ära märkimist.
Noppeid FALSE programmeerimisekeelest:[34]
"Hello, World!"
"Hello, World!"
[$1=~[$1-f;!*]?]f: "calculate the factorial of [1..8]: " ß^ß'0-$$0>~\8>|$ "result: " ~[\f;!.]? ["illegal input!"]?" "
"Faktoriaal"
99 9[1-$][$@$@$@$@/*=[1-$$[%1-$@]?0[$.' ,]?]?]#
"Algarvud vahemikus 0...100"
brainfuck
brainfuck on 1993. aastal Urban Mülleri poolt loodud populaarne Turingi-täielik esokeel, millele aastate jooksul on kirjutatud mitmekümneid dialekte. Oma vulgaarse nimevaliku tõttu viidatakse antud keelele tihtipeale ka kui "brainf***", "brainflakes", "brainoof", "brainfrick", "bf" jne. Mülleri ainueesmärk brainfuck esoteerilist keelt kirjutades oli luua kõige väiksema jalajäljega kompilaator, mis töötaks Amiga OS versiooniga 2.0.[35] brainfuck keele autor Müller on saanud inspiratsiooni teistest esokeeltest FALSE ja P“. Kompilaator, mille Müller Amiga operatsioonisüsteemile kirjutas, oli vaid 240 baidi suurune.[36]
Läbi aastate on brainfuckile kirjutatud ridamisi erinevaid interpretaatoreid, näiteks: bff4[37], bff[38], bff4lnr, dbfi.b[39], sbi.c[40], qdb[41]. Entusiastid on aastate jooksul kõrvutanud erinevaid brainfucki interpretaatoreid omavahel, tehes kiirusteste.[42][37] Senini kiireimaks brainfuck esokeele interpretaatoriks on kujunenud bff4lnr, mis on bff4-l põhinev interpretaator lineaaroptimeerimisega; mõlema autoriks on Oleg Mazonka.
brainfuck keele dialekte, mis pühenduvad brainfuck'i optimeerimisele, on mitmeid, samas nende dialektide autorid ei ole seni fookusesse võtnud väiksema kompilaatori loomist. Märkimist väärivad järgnevad brainfuckil põhinevad kompaktsed esokeeled: Headache[43], bf core[44] ja tinyBF[45].
Noppeid brainfuck programmeerimiskeelest:[36]
+++++ +++ Set Cell #0 to 8 [ >++++ Add 4 to Cell #1; this will always set Cell #1 to 4 [ as the cell will be cleared by the loop >++ Add 4*2 to Cell #2 >+++ Add 4*3 to Cell #3 >+++ Add 4*3 to Cell #4 >+ Add 4 to Cell #5 <<<<- Decrement the loop counter in Cell #1 ] Loop till Cell #1 is zero >+ Add 1 to Cell #2 >+ Add 1 to Cell #3 >- Subtract 1 from Cell #4 >>+ Add 1 to Cell #6 [<] Move back to the first zero cell you find; this will be Cell #1 which was cleared by the previous loop <- Decrement the loop Counter in Cell #0 ] Loop till Cell #0 is zero >>. Cell #2 has value 72 which is 'H' >---. Subtract 3 from Cell #3 to get 101 which is 'e' +++++ ++..+++. Likewise for 'llo' from Cell #3 >>. Cell #5 is 32 for the space <-. Subtract 1 from Cell #4 for 87 to give a 'W' <. Cell #3 was set to 'o' from the end of 'Hello' +++.----- -.----- ---. Cell #3 for 'rl' and 'd' >>+. Add 1 to Cell #5 gives us an exclamation point >++. And finally a newline from Cell #6
"Hello, World!"
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Minimeeritud kujul "Hello, World!"
++++++++++ >++++++++++++++++++++++++++++++++++++++++++++++++ >++++++++++ [ >++++++++++++++++++++++++++++++++++++++++++++++++ >++++++++++ [ <<<. >>.+ <<<. >>>>- ] <---------------------------------------------------------- <<+ > - ]
"0-st 99-ni numbrid"
Võimalikult keerulised keeled
Selle kategooria all olevad esoteerilised keeled on kirjutatud eesmärgiga mõelda välja selline programmeerimiskeel, mis muudaks koodi kirjutamise väga raskeks. Raske koodiarhitektuur ja süntaks ning ebatavaline või ebaloogiline struktuur teevad need keeled väga rasketeks ja kohati absurdseteks. Inimesel kuulub palju aega ja püüdlust, et kirjutada vähemalt üks programm sellises keeles, kui see on üldse võimalik.
Keeruline süntaks
Programmeerimiskeele süntaks on reeglite kogum, mis määrab, millised sümbolite kombinatsioonid võivad moodustada struktuurselt kehtiva programmi.[46] Igal programmeerimiskeelel on oma süntaksi kirjeldus. Selle kategooria keelte autorid tegid selle spetsiaalselt keerukaks või kui mitte spetsiaalselt, siis tuli see nii välja.
Malbolge
Malbolge on nii raske, et esimest programmi inimene ei suutnud ise kirjutada, selle genereeris teine programm keeles Lisp ja esimene programm kirjutati alles 2 aastat pärast keele loomist.[47] Süntaks keeles ei ole struktureeritud, programmeerija võib kirjutada suvalist koodi ja see võib nii töötada, kuid ei pruugi. Keele leiutas Ben Olmstead 1998. aastal. Eesmärk oli luua keel, mis muudaks programmide kirjutamise võimalikult raskeks ja see tal ka õnnestus. Arvatakse, et Malbolge on liiga raske, et inimene seda mõistaks. Huvitav on fakt, et keel nimetati Dante kaheksanda põrguringi järgi.[47] Malbolge on masinkeel, aga erinevalt põhiprotsessorist töötab ta ternaarses arvusüsteemis.[48]
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"
`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
"Hello, World!" keeles Malbolge.[49]
L33t (Leet)
Leet (või L33t) on oma nime saanud selle lähtekoodi sümboolse keelega "L33t 5p34k" sarnasuse järgi. L33t'i arendajateks on Stephen McGreal ja Alex Mole.[50] Peamised sarnasused "L33t 5p34k"-iga: ladina tähtede asendamine sarnaste numbrite ja sümbolitega, kräkkerite ja mängurite slängi imiteerimine, sõnadele lõppu z0r lisamine. Iga lähtekoodi sõna tõlgitakse opkoodiks, liites kõik sõnas olevad numbrid kokku näiteks l33t = 3 + 3 = 6.. Keel kasutab 10 opkoodi.[51] Seetõttu ei pea koodis peale numbrite teisi sümboleid kasutama. Keel on Turingi-täielik.[50]
Gr34t l33tN3$$? M3h... iT 41n't s0 7rIckY. l33t sP33k is U8er keWl 4nD eA5y wehn u 7hink 1t tHr0uGh. 1f u w4nn4be UB3R-l33t u d3f1n1t3lY w4nt in 0n a b4d4sS h4xX0r1ng s1tE!!! ;p w4r3Z c0ll3cT10n2 r 7eh l3Et3r! Qu4k3 cL4nS r 7eh bE5t tH1ng 1n teh 3nTIr3 w0rlD!!! g4m3s wh3r3 u g3t to 5h00t ppl r 70tAl1_y w1cK1d!! I'M teh fr4GM4stEr aN I'lL t0t41_1Ly wIpE teh phr34k1ng fL00r ***j3d1 5tYlE*** wItH y0uR h1dE!!!! L0L0L0L! t3lEphR4gG1nG l4m3rs wit mY m8tes r34lLy k1kK$ A$$ l33t hAxX0r$ CrE4t3 u8er- k3wL 5tUff lIkE n34t pR0gR4mm1nG lAnguidGe$... s0m3tIm3$ teh l4nGu4gES l00k jUst l1k3 rE41_ 0neS 7o mAkE ppl Th1nk th3y'r3 ju$t n0rMal lEE7 5pEEk but th3y're 5ecRetLy c0dE!!!! n080DY unDer5tAnD$ l33t SpEaK 4p4rT fr0m j3d1!!!!! 50mE kId 0n A me$$4gEb04rD m1ghT 8E a r0xX0r1nG hAxX0r wH0 w4nT2 t0 bR34k 5tuFf, 0r mAyb3 ju5t sh0w 7eh wAy5 l33t ppl cAn 8E m0re lIkE y0d4!!! hE i5 teh u8ER!!!! 1t m1ght 8E 5omE v1rus 0r a Pl4ySt4tI0n ch34t c0dE. 1t 3v3n MiTe jUs7 s4y "H3LL0 W0RLD!!!" u ju5t cAn'T gu3s5. tH3r3's n3v3r anY p0iNt l00KiNg sC3pT1c4l c0s th4t, be1_1Ev3 iT 0r n0t, 1s whAt th1s 1s!!!!! 5uxX0r5!!!L0L0L0L0L!!!!!!!
Programm "Hello, World!" L33t keeles.[51]
INTERCAL
INTERCAL'i (lühend The Compiler Language With No Pronounceable Acronym) lõid 1972. aastal Don Woods ja James Lyon naljaparoodiana paljudele tolleaegsetele programmeerimiskeeltele. INTERCAL on Turingi-täielik, see suudab arvutada kõike mis tavakeel, kuid väga aeglaselt.
Erinevalt tavalistest keeltest on INTERCAL'is krüptiline ja üleliigne süntaks.
Lihtsaim viis väärtuse 65536 salvestamiseks 32-bitisesse INTERCAL muutujasse on
TEE :1 <- #0¢#256
.
INTERCALil on palju funktsioone, mis võivad tunduda häirivad: see kasutab selliseid funktsioone nagu "LOE VÄLJA" ("READ OUT"), "IGNOREERI" ("IGNORE"), "UNUSTAGE" ("FORGET") ja käske, nagu "PALUN" ("PLEASE"). Näiteks viimane loetelust ei tee midagi, programm sellega kuidagi ei muutu, kuid kui "PALUN" ei ilmu piisavalt sageli, peetakse programmi ebapiisavalt viisakaks ja veateade ütleb seda; kui liiga sageli, võidakse programm tagasi lükata kui liiga viisakas.[52]
DO ,1 <- #13 PLEASE DO ,1 SUB #1 <- #238 DO ,1 SUB #2 <- #108 DO ,1 SUB #3 <- #112 DO ,1 SUB #4 <- #0 DO ,1 SUB #5 <- #64 DO ,1 SUB #6 <- #194 DO ,1 SUB #7 <- #48 PLEASE DO ,1 SUB #8 <- #22 DO ,1 SUB #9 <- #248 DO ,1 SUB #10 <- #168 DO ,1 SUB #11 <- #24 DO ,1 SUB #12 <- #16 DO ,1 SUB #13 <- #162 PLEASE READ OUT ,1 PLEASE GIVE UP
Programm "Hello, World!" INTERCAL keeles.[52]
Raske struktuur
Lisaks keerulisele süntaksile peab konkreetses keeles koodi kirjutamisel arvestama mõne muu keele eripäraga, et kirjutada töötav kood. Allpool on toodud mõned näited.
Glass
Keelel Glass on väga raske struktuur. Keeles kasutatakse postfix notationit või Reverse Polish notationit ehk matemaatiliste ja loogiliste avaldiste kirjutamise vormi, milles operandid asuvad enne tehtemärke. See kombineerub raske objektorientatsiooni struktuuriga. Keele lõi Gregor Richards 2005. aastal.[53]
{M[m(_o)O!"Hello World!"(_o)o.?]}
Programm "Hello, World!" Glass keeles.[53]
Fish
Fish leiutati 2009. aastal, autor oli inspireeritud keelest Befunge. Fish on kahemõõtmeline keel, mis tähendab, et koodi ei täideta tingimata lineaarselt ehk kood ei pea täituma selles järjekorras, milles see oli kirjutatud. Kasutades erinevaid juhiseid, saab koodi lugemise suunda muuta kas üles, alla, vasakule või paremale. See on ka pinupõhine keel, seepärast teeb iga käsk midagi pinuga, kui tegu pole lõpetamist märkiva (;) või nihkega seotud käsuga. Huvitav, et Fish on päris ainulaadne, sest see toetab mitut pinu. Programm algab ühe pinuga, kuhu lisatakse väärtusi. Programm võib aga luua algse pinu peale uue, kusjuures teatud hulk väärtusi liigub algsest pinust teise. Programm saab luua nii palju uusi pinusid, kui soovib programmi autor. [54]
8>aa*3-89*6+oo:?!!\3b*aa*a+aa*3-aa*9+bb*5-aa*3-6b*ooooooo; ^ -1/
Programm "Hello, World!" Fish keeles.[54]
Code golfing
Code golfing tähendab lühidalt koodi võistluslikku optimeerimist ruumikuse osas. Nagu ka golfis, on code golfingus põhimõte jõuda enda eesmärgini võimalikult väheste liigutustega, golfi puhul on selleks palli löökide arv, code golfingu puhul tähemärkide arv. Tõsi, kui pärisgolfis peab kohe eesmärgini võimalikult väheste liigutustega jõudma, siis code golfingu puhul võib programmi eelnevalt pikalt välja kirjutada ning siis lõviosa ajast kulutada selle lühemaks tegemisele. Code golfing ei puuduta alati lähtekoodi tähemärkide arvu, vaid golfi eesmärgiks võib olla ka võimalikult väikese kompilaatori loomine. Neist keeltest sai lugeda juba peatükis "Minimalistlike kompilaatoritega esokeeled".[55]
Koodigolfi head ja vead
Enne spetsiifilisemate code golfing keelte poole pöördumist, toon välja mõned code golfingu head ja vead. Positiivsest küljest aitab code golfing programmeerimist harjutada, paneb koodikirjutaja kastist välja mõtlema ning on heaks käeharjutuseks koodi optimiseerimise osas.[56] Samas võib liigne optimiseerimine teha karuteene - nimelt on golfi eesmärgil kirjutatud kood raskesti loetav, sest kasutatakse näiteks ühetähelisi muutujanimesid[57] ning samuti on sellist koodi pea võimatu muuta, sest ta on nii spetsiifiliselt kirjutatud, et tal puudub igasugune paindlikkus.[56] Miinuseid meeles pidades tasubki arvestada sellega, et koodiga golfi mängimine tasub jätta vaid võistluste ja käeharjutuste tarbeks. Praktikas, eriti töökohal, kus keegi teine kirjutatud koodiga töötab, on golfikood väga ebaoptimaalne ning toob endaga kaasa paksu pahandust.[57] Kuigi code golfing on võimalik pea igas programmeerimiskeeles, on loodud nii mõnigi esokeel just golfi eesmärgil. Tuntuimaks neist on GolfScript.
GolfScript
GolfScript on kirjutatud just code golfingu tarbeks. Nimelt on ta kujundatud selliseks, et ta võimaldab kirjutada väga väheste tähemärkidega täisväärtuslikke programme.[58] Olles pinupõhine keel, puudub GolfScript'is otsene muutujate vajadus, mis aitab kirjutada programme väheste tähemärkidega, samas on muutujate kasutus vajadusel täiesti võimalik.[59]
Keele peamine golfi-võimsus seisneb GolfScript'i ulatuslikes teekides, mis tegelikkuses on eriviisiliselt välja kutsutud muutujad. Paljud koodis kasutatavad operaatorid on nö. mitmetähenduslikud, tähendus sõltub tema argumentidest. Näiteks tärn (*) võib tähendada nii korrutamist, kindla koodiosa kordamist või hoopis sõne vähendamist ühe elemendini.[58] Väga hea ülevaade GolfScript'is kasutatavatest instruktsioonidest on saadaval keele kodulehel.
[296,{3/)}%-1%["No more"]+[" bottles":b]294*[b-1<]2*+[b]+[" of beer on the wall\n".8<"\nTake one down, pass it around\n"+1$n+]99*]zip
Programm GolfScript'is, mis esitab laulu "99 bottles of beer" teksti.[58]
Võrdluseks sama eesmärgiga programm Pythonis[60]:
def sing(b, end): print(b or 'No more','bottle'+('s' if b-1 else ''), end) for i in range(99, 0, -1): sing(i, 'of beer on the wall,') sing(i, 'of beer,') print('Take one down, pass it around,') sing(i-1, 'of beer on the wall.\n')
Juhul, kui code golfing ja/või GolfScript huvi pakuvad, on GolfScript'i ametlikul kodulehel olemas ka õpetused GolfScript'i kasutuseks.
Vyxal
Vyxal on võrdlemisi uus keel, mis ilmus alles aastal 2020, autoriks esokeelte viki kasutaja Lyxal. Tegu on järjekordse code golfing keelega, kuid võrreldes teistega tähtsustab Vyxal ka loetavust ja koodi ilu. Nagu ka GolfScriptis, on Vyxal'i puhul samuti operaatorid mitmetähenduslikud, kuid neid on kõvasti rohkem kui GolfScriptis. Parim ülevaade kõigist operaatoritest asub GitHubis.[61]
Kõige populaarsemat näidisprogrammi "Hello, World!" on Vyxal'is võimalik kirjutada mitmel erineval viisil:
`Hello, World!`
Kõige loetavam viis.[61]
`ƈṡ, ƛ€!
See meetod kasutab sõnastiku koondamist.[61]
kH
Lühim viis kirjutada Vyxal keeles "Hello, World!".[61] Tegu on operaatoriga, mille ülesandeks ongi tagastada "Hello, World!".[62]
Selles keeles on ühe sümboliga võimalik kontrollida algarve:
æ
Taaskord on tegu operaatoriga, mis viib läbi kindla funktsiooni.[62]
KL2=
Mõnevõrra pikem algarvude kontroll.[61]
Muud märkimisväärsed code golfing keeled
Jelly on üheks Vyxal'it inspireerinud esokeeleks, mida omakorda inspireeris esokeel J. Jelly kohta on huvi korral võimalik lugeda keele autori, Dennis Mitchelli Jelly GitHub lehelt, kus on olemas keele kasutamiseks vajalik õpetus ja muu tarvilik.
Kuigi 05AB1E[63] pole kirjutatud golfi eesmärgil, on see enda 250 operaatori ning nende poolt tehtava 400+ funktsiooni poolest koodiga golfi mängijate seas küllaltki populaarne. Näiteks käskude kombinatsioon ÅF
prindib listi Fibonacci numbreid, mis on sisendist väiksemad.[63]
Code golfing keeli on loodud ohtralt, tegu on ju ometi põneva enda proovilepanekuga, seda nii koodi optimeerimiseks kui ka sootuks uue keele loomiseks. Esokeelte vikis on kirjeldatud koguni 64 erinevat golfikeelt .
Olulisi esokeelte omadusi
Käesoleva kirjatöö struktureerimiseks kasutati võimalikult inimsõbralikke kategooriaid, eesmärgiga äratada teemaga vähetuttavates lugejates huvi ning anda neile ülevaatlik arusaam esokeelte olemusest ja võimalustest. Kuna aga viise esokeeli liigitada on palju, oleks mõistlik kiirelt tutvustada ka selliseid olulisemaid esokeelte omadusi, mis ühel või teisel põhjusel ei osutunud mõistlikuks kategoriseerimise aluseks ülejäänud töös.
Arvutusklass
Sissejuhatuses käsitletud Turingi-täielikkus on tegelikult vaid üks mitmest arvutusklassist. Esokeele arvutusklass näitab, kus see esokeel asetseb teadaolevate arvutusmudelite hulgas. Arvutusmudelite peamine omadus on see, milliseid probleeme nendega on võimalik lahendada. Mõned mudelid suudavad lahendada täpselt samasugust probleemide hulka nagu teised, mõned muud mudelid aga suudavad lahendada rohkem probleeme kui teised.[6]
Turingi-täielikud arvutusklassid - mudelid, mis suudavad lahendada kõiki probleeme, mida suudab lahendada Turingi masin - suudavad lahendada kõiki algoritmiliselt lahendatavaid probleeme. Turingi-täielikest süsteemidest vähem "võimsaid" mudeleid on palju, kuid Turingi-täielikkuse "maksimaalse" staatuse tõttu huvitutakse Turingi-täielikkusest enamasti kõige rohkem. Leidub ka esokeeli, mille arvutusmudel on "võimsam" Turingi-täielikest süsteemidest - neid kutsutakse arvutamatuteks. Selliseid keeli pole reaalsuses võimalik implementeerida, kuna neid ei saa implementeerida Turingi masinatel.[6] Näiteks English on arvutamatu esokeel, kuna selles saab lahendada halting problem'i.[16]
Turingi tõrvapütid
Turingi tõrvapütid (Turing tarpits) on esokeeled, mis proovivad saavutada Turingi-täielikkust, kasutades vaid väikest arvu lingvistilisi elemente (ideaalis nii vähe kui võimalik).[64] Turingi tõrvapüttide hulka kuulub näiteks Unary, mille programmid koosnevad vaid nullidest.[65] Samuti on lausa omaette kategooria OISC (One Instruction Set Computer) tüüpi keeled, mis sisaldavad vaid ühte käsku ja kipuvad olema madala abstraktsioonitasemega, kuna need on tihti mõeldud olema kasutatavad protsessori käsustikuna.[66] Lihtsaim teadaolev OISC on FlipJump, mille ainuke käsk võtab sisse kaks operandi, kusjuures kumbki operand on bitile viitav mäluaadress; käsk inverteerib (flip) esimese operandi mäluaadressil asuva biti väärtuse ning hüppab (jump) seejärel teise operandi mäluaadressile.[67][68]
Implementeeritus
Implementeeritus tähendab täpselt seda, mida nimest võiks arvata - kas esokeel on implementeeritud või mitte. Keeled, millele on vähemalt üks teadaolev implementatsioon kirjutatud, on implementeeritud keeled[69], kõik ülejäänud on implementeerimata[70]. Nagu arvutusklassi alapeatükis mainitud, ei pruugi iga esokeel olla implementeeritav[6], seega mõned keeled on määratud igaveseks implementeerimata keelte hulka jääma.
Mõõtmelisus
Esokeeled võivad erineda ka oma mõõtmelisuse poolest.[71] Tavalised programmeerimiskeeled (ja ka paljud esokeeled) on ühemõõtmelised - lähtekoodiks on koodiread, millel pole mingit dimensionaalset aspekti juures. Esokeeled aga muidugi vaid sellega ei piirdu. Üsna populaarsed on kahemõõtmelised esokeeled, mille lähtekoodi interpreteerimisel on oluline võtta arvesse kahte mõõdet; käesolevas kirjatööski on neist leidunud mitmeid näiteid: Piet, Fish, Fishing, Quipu...[72] Mõnevõrra vähem populaarsed on mitmemõõtmelised keeled, mis kasutavad rohkem kui kahte mõõdet, näiteks suhteliselt tagasihoidlik 3D või mõnevõrra absurdsem 5D 5D Brainfuck With Multiverse Time Travel With Multiverse Time Travel, milles on kasutusel lausa paralleeluniversumite ja ajarännu mõisted.[73][74][75] Samuti on olemas nullimõõtmelised esokeeled, mille liikmed on tihti abstraktsed mõttemängud nagu NoCode, millel pole lähtekoodi ega süntaksi, kuigi leidub ka veidi "normaalsemaid" nullmõõtmelisi esokeeli, nagu äsja Turingi tõrvapüttide teemaga seoses mainitud Unary.[76][77][65]
Iseenda muutmine
Esokeeli, mis jooksutamise ajal saavad muuta iseenda lähtekoodi, kutsutakse iseend muutvateks keelteks. Juba kirjeldatud keeltest kuuluvad iseend muutvate keelte hulka näiteks FlipJump, Baba Is You ja L33t.[78]
Determinism
Programmeerimiskeel on deterministlik, kui see annab samas olukorras alati sama tulemuse. Praktilistes rakendustes oleks mittedeterministlik programmeerimiskeel üldjuhul täiesti sobimatu, kuid esokeelte korral sellised piirangud puuduvad, mistõttu leidub mitmeid esokeeli, mis ei anna tingimata samas olukorras sama vastust. Mittedeterministlike keelte seas on eristatav ka tõenäosuslike keelte alamkategooria, kuhu kuuluvate keelte peamised käsud sõltuvad juhuslikkusest.[79][80]
Veel liigitusi
Lisaks võib esokeeli jaotada veel mõndade omaduste põhjal, näiteks mälu tüüp (lahter, pinu jne), abstraktsioonitase (kui erinev on esokeel masinkoodist) või kvantsus (kas keel kasutab töötamiseks kvantmehhaanikat või mitte).[71] Kuigi ka need on kindlasti väärt uurimist, ei pidanud käesoleva kirjatöö autorid neid selle töö eesmärgi täitmise jaoks eriti olulisteks.
Huvitavaid linke
https://github.com/Timwi/EsotericIDE/
https://esolangs.org/wiki/Hello_world_program_in_esoteric_languages_(nonalphabetic_and_A-M)
https://esolangs.org/wiki/Hello_world_program_in_esoteric_languages_(N-Z)
https://apps.apple.com/us/app/brainf-ck/id493926421
https://thedailywtf.com/articles/bidding-on-security
https://esoteric.codes/interviews
https://esolangs.org/wiki/Game_of_Life
Allikad
- ↑ 1.0 1.1 1.2 1.3 https://esolangs.org/wiki/Esoteric_programming_language
- ↑ 2.0 2.1 https://esolangs.org/wiki/Prehistory_of_esoteric_programming_languages
- ↑ 3.0 3.1 3.2 3.3 https://www.hillelwayne.com/talks/esolangs/
- ↑ 4.0 4.1 4.2 https://esolangs.org/wiki/FALSE
- ↑ 5.0 5.1 5.2 5.3 https://esolangs.org/wiki/Turing-complete
- ↑ 6.0 6.1 6.2 6.3 https://esolangs.org/wiki/Computational_class
- ↑ https://esolangs.org/wiki/Popular_problem
- ↑ https://esolangs.org/wiki/Category:Thematic
- ↑ https://esolangs.org/wiki/Category:Pseudonatural
- ↑ http://shakespearelang.sourceforge.net/
- ↑ 11.0 11.1 http://shakespearelang.sourceforge.net/report/shakespeare/
- ↑ https://esolangs.org/wiki/Chef
- ↑ 13.0 13.1 13.2 13.3 https://www.dangermouse.net/esoteric/chef.html
- ↑ https://esolangs.org/wiki/Rockstar
- ↑ 15.0 15.1 https://codewithrockstar.com/docs
- ↑ 16.0 16.1 https://esolangs.org/wiki/English
- ↑ 17.0 17.1 17.2 17.3 17.4 https://www.dangermouse.net/esoteric/piet.html
- ↑ 18.0 18.1 18.2 https://esolangs.org/wiki/Fugue
- ↑ 19.0 19.1 https://esolangs.org/wiki/Hexagony
- ↑ 20.0 20.1 https://esolangs.org/wiki/Tree
- ↑ https://link.springer.com/chapter/10.1007/3-540-45337-7_9
- ↑ https://www.dangermouse.net/esoteric/piet/samples.html
- ↑ 23.0 23.1 https://esolangs.org/wiki/Floater
- ↑ https://www.dangermouse.net/esoteric/piet/samples.html
- ↑ https://esolangs.org/wiki/4
- ↑ 26.0 26.1 https://esolangs.org/wiki/Quipu
- ↑ https://esolangs.org/wiki/Var%27aq
- ↑ 28.0 28.1 https://esolangs.org/wiki/Fishing
- ↑ https://esolangs.org/wiki/Pok%C3%A9Battle
- ↑ https://esolangs.org/wiki/Baba_Is_You
- ↑ https://bellard.org/tcc/
- ↑ http://www.ittybittycomputers.com/IttyBitty/TinyBasic/TBEK.txt
- ↑ https://www.forth.com/resources/forth-programming-language/
- ↑ https://strlen.com/false-language/
- ↑ https://amigaos.net/
- ↑ 36.0 36.1 https://esolangs.org/wiki/Brainfuck
- ↑ 37.0 37.1 http://mazonka.com/brainf/
- ↑ https://www.swapped.cc/#!/bff
- ↑ http://www.brainfuck.org/dbfi.b
- ↑ http://www.brainfuck.org/sbi.c
- ↑ http://www.brainfuck.org/qdb.c
- ↑ https://esolangs.org/wiki/Talk:Brainfuck
- ↑ https://esolangs.org/wiki/Headache
- ↑ https://esolangs.org/wiki/Bf_core
- ↑ https://esolangs.org/wiki/tinyBF
- ↑ https://cs.lmu.edu/~ray/notes/syntax/
- ↑ 47.0 47.1 http://progopedia.com/language/malbolge/
- ↑ http://www.lscheffer.com/malbolge.shtml
- ↑ https://gist.github.com/kspalaiologos/a1fe6913aaff8edea515b4af385368fe
- ↑ 50.0 50.1 https://esolangs.org/wiki/L33t
- ↑ 51.0 51.1 http://www.oocities.org/electrodruiduk/l33t.htm
- ↑ 52.0 52.1 https://en.bmstu.wiki/INTERCAL
- ↑ 53.0 53.1 https://esolangs.org/wiki/Glass
- ↑ 54.0 54.1 https://esolangs.org/wiki/Fish
- ↑ https://esolangs.org/wiki/Golf
- ↑ 56.0 56.1 https://analyticsindiamag.com/what-is-code-golfing-and-biggest-such-tournaments/
- ↑ 57.0 57.1 https://www.barrymichaeldoyle.com/code-golf/
- ↑ 58.0 58.1 58.2 https://esolangs.org/wiki/GolfScript
- ↑ http://www.golfscript.com/golfscript/index.html
- ↑ https://rosettacode.org/wiki/99_Bottles_of_Beer/Python
- ↑ 61.0 61.1 61.2 61.3 61.4 https://esolangs.org/wiki/Vyxal
- ↑ 62.0 62.1 https://github.com/Vyxal/Vyxal/blob/old/docs/elements.txt
- ↑ 63.0 63.1 https://esolangs.org/wiki/05AB1E
- ↑ https://esolangs.org/wiki/Turing_tarpit
- ↑ 65.0 65.1 https://esolangs.org/wiki/Unary
- ↑ https://esolangs.org/wiki/Category:OISC
- ↑ https://esolangs.org/wiki/OISC
- ↑ https://esolangs.org/wiki/FlipJump
- ↑ https://esolangs.org/wiki/Category:Implemented
- ↑ https://esolangs.org/wiki/Category:Unimplemented
- ↑ 71.0 71.1 https://esolangs.org/wiki/Esolang:Categorization
- ↑ https://esolangs.org/wiki/Category:Two-dimensional_languages
- ↑ https://esolangs.org/wiki/Category:Multi-dimensional_languages
- ↑ https://esolangs.org/wiki/3D
- ↑ https://esolangs.org/wiki/5D_5D_Brainfuck_With_Multiverse_Time_Travel_With_Multiverse_Time_Travel
- ↑ https://esolangs.org/wiki/Category:Zero-dimensional
- ↑ https://esolangs.org/wiki/NoCode
- ↑ https://esolangs.org/wiki/Category:Self-modifying
- ↑ https://esolangs.org/wiki/Category:Nondeterministic
- ↑ https://esolangs.org/wiki/Category:Probabilistic