Esoteerilised programmeerimiskeeled

From ICO wiki
Revision as of 04:25, 5 December 2021 by Mipaat (talk | contribs)
Jump to navigationJump to search

Esoteerilised programmeerimiskeeled


Sissejuhatus

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 ka 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].

Lühidalt esokeelte kategoriseerimisest

NB! Siia võiks võib-olla midagi ülevaatlikku kirjutada esokeelte kategoriseerimise kohta?

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 [5].

The Shakespeare Programming Language

Shakespeare ehk Shakespeare Programming Language ehk SPL on 2001. aastal Karl Wiberg’i and Jon Åslund’i poolt kirjutatud Turingi-täielik esokeel, mille loomiseesmärk oli, et loodava esokeele lähtekood sarnaneks Shakespeare’i näidenditekstile [3][6]. 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" [7].

Näiteks üks SPL’i stseen, mis „hüppab“ stseeni, mille nimi on „scene IV“, juhul kui Juliet’i (Julia) väärtus on suurem kui Hamlet’i väärtus:

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 [8][9]. Üks Chef’i disainipõhimõtetest ütleb, et Chef’i retseptid peaksid lisaks korrektse väljundi genereerimisele olema ka lihtsalt valmistatavad ja maitsvad [9].

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, mis 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 [9].

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 [9]. 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 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 [10].

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 numbritekasutamist 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 110 [11]. Taolisi võimalusi loovalt kasutades saab muljetavaldavalt laululaadseid programme kirjutada.

Näiteks lõik Rockstar'is kirjutatud FizzBuzz programmist[11]:

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

Artistlikud keeled

NB! Siia tuleb Taeri osa

Multicoded keeled

todo: kirjutada veidi multicoded keeltest (ehk mida need endast kujutavad ja millised juba mainitud keeltest nende hulka kuuluvad).

Pseudonatural keeled

todo: sama, mis multicoded keeltega

Minimaalsed keeled?

Võimalikult keerulised keeled?

Code golfing keeled?

Veel mõned kategooriad (ühe peatüki all, lühidalt), mida eelnevad peatükid ei katnud?

Allikad