**Esoteeriline programmeerimiskeel** (inglise keeles *Esoteric programing language* või *Esolang*) on programmeerimiskeel, mis pole mõeldud praktiliseks kasutamiseks. Sellised keeled on näide arvutihuumorist.

Esoteerilised keeled on loodud lõbu pärast, sageli parodeerivad need "päris" või on "tõsiste" programmeerimiskontseptsioonide absurdsed kehastused. Mõned esoteerilised keeled on tahtlikult piiratud (nt HQ9+), teised on universaalsed ja nad on Turing-täielikud (inglise keeles *Turing-complete*). Iga esoteerilise keele ühine omadus on see, et programmi tekst on arusaadav ainult "valgustatutele" või üldse arusaamatu, sest "töötava" ja "mõistetava" programmi koostamiseks on vaja kirjutada algoritm standardiseeritud laialdaselt kasutatavas programmeerimiskeeles. 
Üleüldiselt esoteerilised programmeerimiskeeled on kasutud, kuid mõni neist võib kasutada programmeerimiskoolitusena või suurepärase lõbustusmeetodina. Esoteerilised keeled on sageli programmeerimisvõistlustel lubatud.

Klassifikatsioon
----------------

### Turingi täielikkus

**Turingi täielikkus** (inglise keeles *Turing-complete*) tähendab masina jõudu (ehk arvuti), mis suudab piisava ajaga, mäluga ja koos vajalike juhistega lahendada mis tahes arvutusprobleemi, olenemata sellest, kui keeruline see on. Seda terminit kasutatakse tavaliselt tänapäevaste programmeerimiskeelte kirjeldamiseks, kuna enamik neist on Turingi täielikud (C++, Python, JavaScript jne).

Keelte eesmärgid
----------------

### Keeled, mis on loodud konkreetse probleemi lahendamiseks

Kui keel suudab lahendada mis tahes konkreetse probleemi, isegi kui see lahendab looja probleemi, on keel ikkagi väärtuslik.
Näiteks esoteeriline keel Thue (nimetatud Norra matemaatiku Axel Thue järgi) – loodud Chomsky hierarhias nulltüübi demonstreerimiseks.

### "Segased keeled" või "musta kasti" keeled

Need on loodud selleks, et muuta kood asjatundmatute jaoks võimalikult loetamatuks ja raskendada koodi kirjutamist. "Musta kasti" kõige silmatorkavam omadus on hägusus. See tähendab konkreetse koodilõigu tegeliku väärtuse tahtlik varjamine.

### Keeled, mis on loodud konkreetse kontseptsiooni elujõulisuse kinnitamiseks

Need keeled võivad ise olla ebamugavad ja mittetoimivad, kuid need on ümberlükkamatu tõend selle kohta, et kontseptsioonil on õigus eksisteerida. Sellised keeled hõlmavad näiteks Funge keeleperekonda (nt Befunge, Brainfuck, Malbolge), mis kasutab programmide mitmemõõtmelisi esitusi.

Keelenäited
-----------

### INTERCAL

Ilma hääldatava akronüümita kompilaatorikeel ehk INTERCAL on programmeerimiskeel, mille töötasid välja 1972. aastal Princetoni üliõpilased Don Woods ja James Lyon. Erinevalt teistest omaaegsetest arvutikeeltest see keel loodi paroodiana, mis sisaldas palju tarbetuid ja segadusse ajavaid elemente. Eesmärk on selle aja tarkvara disaini konventsioonide üle nalja heita. Isegi nimi INTERCAL on paroodia, kuna keele tegelik nimi ei vasta kuidagi akronüümi tähtedele. 
Keeledokumentatsioon on täis epigraafe filmist "Alice Imedemaal" ja labaseid kommentaare. Veakoode pole võimalik ilma teatmeraamatuta dešifreerida. Näiteks viga **E127** - "Ilma võluvitsata on täiesti kasutu ütlemine" - vihjab, et standardne teek pole ühendatud. **E252**: "Ma unustasin, mida tahtsin öelda" - mälu ületäitumisel sisend- ja väljundtoimingute ajal. 
Samuti esineb INTERCALile ainulaadseid veakoode – näiteks **E079**: "Programmeerija pole piisavalt viisakas." Või **E099**: "Programmeerija on liiga viisakas." Mõlemad ilmuvad siis, kui koodis on liiga palju või liiga vähe PLEASE-käsku.
Igale INTERCALi käsule saab määrata täitmise tõenäosuse ja mõned avaldused mis blokeerivad teiste käskude täitmise või keelavad muutujate muutmise.

"Hello World" INTERCALi keeles:

```
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
PLEASE DO ,1 SUB #7 <- #48
DO ,1 SUB #8 <- #26
DO ,1 SUB #9 <- #244
PLEASE 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
```

### False

1993. aastal loodud False'i keel käivitas massilise huvilaine esolangi vastu. Kui Wouter van Ortmerssen lõi False'i, siis tema eesmärgiks oli teha kõige keerulisema süntaksiga, kompilaatoriga võimsaim keel, mis saaks kergesti hägustada inimesi ja mille maht on 1 kilobait. False on üsna praktiline esolang, mida saab kasutada rakendusprobleemide lahendamiseks. Kapoti all temal on kõik põhilised aritmeetilised ja loogilised toimingud. Muutujaid tähistatakse ühe väikese ladina tähega, **if** konstruktsioon kirjutatakse küsimärgiga (**?**), **while** tsükkel - **#**.

Näiteprogramm, mis prindib välja algarvud vahemikus 0–100:

```
{ writes all prime numbers between 0 and 100 }
99 9[1-$][$@$@$@$@/*=[1-$$[%1-$@]?0[$.' ,]?]?]#
```

### Brainfuck

Brainfucki looja Urban Müller sai inspiratsiooni False'i esolangist. Ta tegi keele segasemaks ja väga tillukese kompilaatoriga. Mõned Brainfucki kompilaatorid on väiksemad kui 200 baiti. Keeles on kokku kaheksa käsku, millest igaüks on tähistatud ühe sümboliga:`<,>, +, -, [,]` ja `,.`. Brainfucki programmi lähtekood koosneb nende kaheksa märgi jadast ilma eraldajate ja taandeta. Inimeste jaoks tavapärasel kujul tinglikke operaatoreid, korrutamis- ja jagamistehteid keeles ei ole.

  

"Hello World" Brainfucki keeles:

```
+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+++++++++++++++++
++++++++++++.+++++++..+++.-------------------
---------------------------------------------
---------------.+++++++++++++++++++++++++++++
++++++++++++++++++++++++++.++++++++++++++++++
++++++.+++.------.--------.------------------
---------------------------------------------
----.-----------------------.

```

### Shakespeare

See esolang maskeerib koodi Shakespeare'i näidenditeks. Programmi esimene lõik on alati epigraaf. Tähemärkide loendit kasutatakse pinu arvu deklareerimiseks ja kangelaste fraasid on I/O operatsioonid. Kui Shakespeare’i tegelased esitavad küsimusi, siis lisatakse tingimuslik operaator. Programmi üksikuid plokke nimetatakse aktideks (vaatusteks), mis on jagatud väiksemateks Rooma numbritega nummerdatud stseenideks.

"Hello World" Shakespeare'i keeles:

```
Romeo, a young man with a remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Ophelia, a remarkable woman much in dispute with Hamlet.
Hamlet, the flatterer of Andersen Insulting A/S.

                    Act I: Hamlet's insults and flattery.

                    Scene I: The insulting of Romeo.

[Enter Hamlet and Romeo]

Hamlet:
 You lying stupid fatherless big smelly half-witted coward!
 You are as stupid as the difference between a handsome rich brave
 hero and thyself! Speak your mind!

 You are as brave as the sum of your fat little stuffed misused dusty
 old rotten codpiece and a beautiful fair warm peaceful sunny summer's
 day. You are as healthy as the difference between the sum of the
 sweetest reddest rose and my father and yourself! Speak your mind!

 You are as cowardly as the sum of yourself and the difference
 between a big mighty proud kingdom and a horse. Speak your mind.

 Speak your mind!

[Exit Romeo]

                    Scene II: The praising of Juliet.

[Enter Juliet]

Hamlet:
 Thou art as sweet as the sum of the sum of Romeo and his horse and his
 black cat! Speak thy mind!

[Exit Juliet]

                    Scene III: The praising of Ophelia.

[Enter Ophelia]

Hamlet:
 Thou art as lovely as the product of a large rural town and my amazing
 bottomless embroidered purse. Speak thy mind!

 Thou art as loving as the product of the bluest clearest sweetest sky
 and the sum of a squirrel and a white horse. Thou art as beautiful as
 the difference between Juliet and thyself. Speak thy mind!

[Exeunt Ophelia and Hamlet]

                    Act II: Behind Hamlet's back.

                    Scene I: Romeo and Juliet's conversation.

[Enter Romeo and Juliet]

Romeo:
 Speak your mind. You are as worried as the sum of yourself and the
 difference between my small smooth hamster and my nose. Speak your
 mind!

Juliet:
 Speak YOUR mind! You are as bad as Hamlet! You are as small as the
 difference between the square of the difference between my little pony
 and your big hairy hound and the cube of your sorry little
 codpiece. Speak your mind!

[Exit Romeo]

                    Scene II: Juliet and Ophelia's conversation.

[Enter Ophelia]

Juliet:
 Thou art as good as the quotient between Romeo and the sum of a small
 furry animal and a leech. Speak your mind!

Ophelia:
 Thou art as disgusting as the quotient between Romeo and twice the
 difference between a mistletoe and an oozing infected blister! Speak
 your mind!

[Exeunt]
```

### Piet

|  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- |
| #FFC0C0light red | #FFFFC0light yellow | #C0FFC0light green | #C0FFFFlight cyan | #C0C0FFlight blue | #FFC0FFlight magenta |
| #FF0000red | #FFFF00yellow | #00FF00green | #00FFFFcyan | #0000FFblue | #FF00FFmagenta |
| #C00000dark red | #C0C000dark yellow | #00C000dark green | #00C0C0dark cyan | #0000C0dark blue | #C000C0dark magenta |
| #FFFFFF white | #000000 black |

Piet on programmeerimiskeel, milles programmid näevad välja nagu abstraktsed maalid. Keel on nime saanud Piet Mondriani järgi, kes oli geomeetrilise abstraktse kunsti valdkonna teerajaja. Pietis kasutatakse teksti asemel mitmevärvilisi pilte. Pietil on 20 eri tooni ja heledusega värviplokki.

"Hello World" Pieti programmeerimiskeeles

Viited
------

1. ↑  , Экзотические языки программирования
2. ↑  , Turing Complete
3. ↑  , 5-минутный гид по эзотерическим языкам программирования: попробуем их классифицировать, itmo, 14. detsember 2014
4. ↑  , The INTERCAL Resources Page, 11. märts 2021
5. ↑  , The FALSE Programming Language, Wouter van Ortmerssen
6. ↑  , The Brainfuck Programming Language, Brian Raiter
7. ↑  , Shakespeare Programming Language, New Mexico Tech, 29. april 2021
8. ↑  , Piet, David Morgan-Mar, 27. september 2018

Välislingid
-----------

|  |  |
| --- | --- |
|  | Pildid, videod ja helifailid Commonsis: **Esoteerilised programmeerimiskeeled**
 |

* Esolang – esoteeriliste programmeerimiskeelte teemaline viki