Programozzunk drámában!

Ezoterikus programnyelvek II.

2016. március 02. - Indie Crawford

A legtöbb programozási nyelvet azzal a céllal hívják életre, hogy valamilyen szempontból, valamilyen új környezetben, vagy valamilyen egyéb új technológia fényében jobb, szebb, hatékonyabb, megbízhatóbb, kényelmesebb fejlesztőeszközzé váljon.

Nem így az ezoterikus programnyelveket! Ezeket inkább azért hozzák létre, hogy mások legyenek…

hipszter_shakespear.jpg
Babits please

Brainfuck, Omgrfofl, Shakespeare, Var'aq, stb., a programnyelvek hippijei rockerei punkjai emosai hipszterei ezek! Legyen szó extravaganciáról, kulturális tiszteletadásról, művészi- vagy tudományos kísérletezésről, a lényeg, hogy nem a fősodrú, „hasznos” programozási nyelvek tartoznak ide, hanem azok, amelyek valamiért kilógnak a sorból. A legtöbbjük tökéletesen alkalmas számítógépek programozására, még ha nem is a megszokott módon, vagy nem is éppen azzal a céllal készültek, hogy ezt a feladatot könnyebbé tegyék.

Ezek közül gyűjtöttem össze még néhány érdekességet válogatásom második részében!

  1. Shakespeare

    Olyan programnyelv létrehozása volt a cél, melynek forráskódja Shakespeare drámák alakját ölti. Nincsenek flancos adat- vagy vezérlőstruktúrák, csak alapvető számtan és goto-k. Mondhatjuk, hogy a BASIC kifejezőképességét az assembly felhasználó barát voltával hoztuk össze.” - via

    Természetesen az irónia beszél a szerzőkből, az adat- és vezérlőstruktúrák hiánya igencsak megnehezíti a programozó életét, a BASIC nyelv pedig kb. annyira kifejező, mint Kósa Lajos félálomban, az assembly programozásnál pedig már csak a gépi kódú programozás jelenti a nagyobb kihívást.

    De ugyan kit érdekel mindez, ha végre elengedhetjük magunkat, és olyan ékes szavakkal írhatjuk meg a legegyszerűbb Hello World programot Shakespeare nyelven, mint az alább látható:

    
    		The Infamous Hello World Program.
    
    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]
    

    A karakterek változókat reprezentálnak, melyek értéke attól függően változik, hogyan inzultálják vagy dícsérik egymást. Adatot bevinni úgy lehetséges, hogy egy karakterrel azt mondtatjuk a másiknak, hogy az hallgasson a szívére. Adatot kiíratni pedig úgy tudunk, hogy arra szólítja föl egyik szereplő a másikat, hogy mondja el mi nyomja a lelkét.

  2. Malbolge

    A Malbolge-nak is vannak irodalmi vonatkozásai, legalábbis ami a nevét illeti, azt ugyanis Dante Poklának 8. köréről kapta, és nem véletlenül… Azzal a céllal jött létre, hogy a lehető legnehezebb legyen benne működő programot írni. Alkotója különböző kreatív módszereket használ e nemes cél elérésére, mint például az önmagát módosító kód, vagy a hármas számrendszer használata. Olyan nehéz e nyelven programot írni, hogy arra csak a nyelv megjelenése utáni második évben került sor először, ráadásul azt sem egy ember alkotta meg, hanem egy kifejezetten erre a célra fejlesztett rejtvényfejtő algoritmus dobta ki! Maga Ben Olmstead, a nyelv megalkotója sem írt soha egyetlen programot se rajta…

    Íme a Hello World program egy változata:

    (=<`$9]7<5YXz7wT.3,+O/o'K%$H"'~D|#z@b=`{^Lx8%$Xmrkpohm-kNi;
    gsedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543s+O<oLm
  3. Befunge

    A Befunge érdekessége, hogy az utasítások nem sorról sorra, de még csak nem is betűről betűre követik egymást, ehelyett a vezérlő karaktereket sorokba és oszlopokba rendezve kell elhelyezni, a kód tehát két dimenzióban írandó. Futás közben a vezérlés aszerint járja be ezt a rácsot, hogy merre küldi őt tovább a két dimenziós térben a jel, amelyen éppen aktuálisan áll. Persze a küldözgetésen kívül értékeket lehet bedobálni a memóriába, műveleteket végezni velük, kiíratni őket, de akár az aktuális karakter, tehát a programkód módosítására is lehetőség van futási időben.

    1993 nagy év volt az Ezoterikus programnyelvek szempontjából, mert a Befunge mellett a Brainfuck születése is ekkorra datálható. Az első verzió Amiga számítógépen született, és újszerű megközelítése miatt hamar népszerűségre tett szert. Úgy tartják, a Befunge a FORTH nevű programnyelv és a Lemmings nevű videójáték szerelemgyermeke…

    lemmings_jatek.jpg
    Kedvenc régi videójátékunk a Lemmings, a képre kattintva újrajátszható!
  4. Piet

    Az előző részben taglalt Velato méltó párja a Piet, melyben azonban nem jazzes hangsorok, hanem absztrakt festményekre hajazó számítógépes grafikák rejtik a program utasításait. A különböző egyszínű területek, illetve a köztük lévő árnyalati és fényerőbeli eltérések adják ki az utasításokat, az előre meghatározott szabályrendszer szerint. Nevét egyébként Piet Mondrian holland festőről kapta.

    piet_mondrian.png
    A festő és festménye, mely akár egy Piet program is lehetne - via

    Szép-szép, de én azért nem cserélném el rá kedvenc színtémámban kilistázott kódomat.

  5. Whitespace

    Nem csoda, hogy bolondok napján álltak elő az alkotók ezzel a nyelvvel. Neve elég beszédes. Ellentétben a legtöbb programnyelvvel, amelyek figyelmen kívül hagyják a különböző nem megjelenített, „üres” karaktereket, mint a space, a tab vagy a sorvégét jelző láthatatlan karakter, a Whitespace kód éppen ezekből épül föl. Trükkös, mi?

    Mivel a legtöbb másik nyelv nemigen veszi számításba ezeket a karaktereket, könnyű elrejteni némi Whitespace kódot egy másik nyelven írt program sorai közé. Ez alkalmassá teszi például úgynevezet polyglotok írására is. Ez olyan programkódokat jelent, amelyek többféle programnyelven lefordítva is ugyan azt az viselkedést eredményezik.

  6. l33t

    Ne ijedj meg, ha még elolvasni sem tudod, segítek! A l33t azt jelenti, leet, csak éppen l33t 5p34k nyelven írva, ami pedig leet speaket takar. Na várj, megpróbálom kicsit érthetőbben! A leet speak egy olyan, a hacker kultúrában elterjedt szimbolikus nyelv, melyben a latin ábécé bizonyos betűit más, azokra némileg hajazó karakterekkel helyettesítjük. Így lesz például 1nd13 cr4wf0rd a blogom nevéből, magából a leet szóból pedig l33t, esetleg 1337, de a k0ck4s1n6 szó fordítását már inkább rád bíznám.

    leet speak képregény
    Beszél itt valaki leetül?!

    Szóval a l33t nyelven írt programok, nos… l33t nyelven íródnak! Maguk az így leírt kifejezések is többnyire az internetes, hacker, warez és játékos szlengből valók, akad itt lol, noob, de suxxor is bőven, természetesen l33t formában írva.

    A nyilvánvalón kívül, a hálózatkezelési kapacitásai tették népszerűvé ezt a nyelvet hacker körökben.

  7. JSFuck

    A sort egy olyan nyelvvel zárnám, amely több szempontból is eltér az eddigiektől, és amely talán közelebb áll sokunk szívéhez. Nem egy önálló nyelvről van szó ugyanis, hanem az igen népszerű, a web programnyelvének is nevezhető JavaScript különös felhasználásáról. Kiderült, hogy bármely tetszőleges JavaScript program kifejezhető a nyelv jelkészletének mindössze 6 karakterének a segítségével. Trükkök százaira van szükség ugyan ehhez, és az eredeti nyelv minden egyes karakterét bonyolult kombinációkkal kell helyettesítenünk, de a dolog működik. Ez a fajta kriptikus és hosszadalmas JavaScript egy igen érdekes reinkarnációját eredményezi e nyelvnek, és tanulmányozása rámutat a JavaScriptben rejlő rejtett lehetőségekre, és segít jobban megérteni azt.

    És hogy mire jó ez a gyakorlatban? Ha a felhasználási mód nem is túl nemes, de JSFuck segítségével sikerült például kártékony kód futtatására rábírni az eBay oldalait. Ez a nemrégiben felfedezett biztonsági rés tette széles körben ismertté a JSFuck nevű technikát.

Egyelőre ennyit tehát az ezoterikus programozási nyelvekről. Természetesen a lista ennél jóval hosszabb, és folyamatosan bővül. A téma végtelen izgalmakat és tanulási lehetőséget rejt magában, mindenki számára, aki az IT-világban keres örömöt és megélhetést magának, de talán a konkrét ismereteknél is fontosabb azonban megszívlelni az ezen nyelvekben megtestesülő mélyebb tanítást.

A hasznosság, a célszerűség korlátain túl, a művészet és a spiritualitás határán egy minőségében magasabb szintű minőség rejlik, mint amit egy adott paradigmán vagy feladaton belül gondolkodva elérni képesek vagyunk. Ne hajtsuk tehát kreativitásunkat a puszta praktikum, a profit, vagy a megszokásos szürke igájába, ellenkezőleg, használjuk inkább emezeket bátran tudásunk és tapasztalataink kiteljesedésére! Húzzuk ki fejünket a dobozból és vessünk egy pillantást a nagy képre, ha valamit meg tudunk tenni, tegyük, még akkor is, ha látszólag nem is jár azonnali haszonnal! Ilyesmiket üzennek nekem ezek az izgalmas nyelvek, a tudományos felfedezés alapvető mintázatát kommunikálva a számítógépes szoftverek fejlesztésének instrumentumán.

A bejegyzés trackback címe:

http://indiecrawford.blog.hu/api/trackback/id/tr438433850

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben.

elemes 2016.03.04. 00:49:40

A brainfuck tulajdonképpen az eléleti Turing-gép egyik lehetséges implementációja. Brainfuck interpreter és példaprogramok is vannak bőséggel.

Éjjeli őr nappal (törölt) 2016.03.04. 10:26:54

Baszki! Minden ilyen nyelv ősanyját és ősapját az INTERCALt kihagytad?

Tessék, itt a faktoriális INTERCALban:

DO .9 <- #17
DO :10 <- #0
DO :11 <- #1

DO :2 <- :10

(1) PLEASE READ OUT :10
PLEASE READ OUT :11

DO :1 <- #1
PLEASE (1509) NEXT
DO :10 <- :3
DO :2 <- :10
DO :1 <- :11
PLEASE (1549) NEXT
DO :11 <- :3

DO (3) NEXT
DO (1) NEXT

(3) DO (4) NEXT
PLEASE GIVE UP

(4) DO .1 <- .9
DO .2 <- #1
PLEASE (1010) NEXT
DO .9 <- .3
DO .1 <- '.9~.9'~#1
PLEASE (1020) NEXT
DO RESUME .1

Futtatva:

XIII
___
mcmxxxMMLMMMDIV

Igen! Római számokkal dolgozik.

Indie Crawford · http://indiecrawford.blog.hu 2016.03.04. 11:10:53

@Az antiochiai szent kézigránát: Köszi, javítva, sajnos az olvasószerkesztőm elfoglaltnak bizonyult, én pedig valamiért vonzódom a indokolatlan elipszilonokhoz... :)

Indie Crawford · http://indiecrawford.blog.hu 2016.03.04. 11:18:55

@$pi$: Jó a kép! =] Mindenesetre a JavaScript - egyik alapnyelvem lévén - nekem közel sem ezoterikus, de ha kétségeid volnának érdemes ránézni az új specifikációra: es6-features.org/

Illetve a másik irányba, az alacsonyabb szintű nyelvek felé is van JavaScriptes példa: asmjs.org/

$pi$ 2016.03.04. 13:11:28

@Indiecrawford: Írtam már javascript interpretert. :)

Hogy is van azzal a ';' karakterrel? :)

Indie Crawford · http://indiecrawford.blog.hu 2016.03.04. 13:13:12

@$pi$: Egyszerű! Mindig kiteszed és nem érnek meglepetések. :D De jogos!

azszép 2016.03.04. 13:29:36

Úgy látom eljött az ideje, hogy tanítsak neked a magyar nyelvről valamit, amit magától O.G. Babits Pleasetől sem leshettél volna el.
Érdekes, hogy nem ismered a következő trükköt, pedig igazán nerdhez méltó lenne:
google keresés a j-s és a ly-s szóalakra is és amire több találat van az lesz a helyes. Többnyire elég nagy különbség van a találatok száma között.

Indie Crawford · http://indiecrawford.blog.hu 2016.03.04. 13:39:14

@azszép: Köszönöm! Sajna (salyna) a helyesírási hibákat többnyire úgy vétem, hogy nem veszem észre őket, tehát nem is keresek rá az írásmódra, öntudatlanul továbbsiklok a leírt ly fölött. Ha tudatosul a dolog akkor már félig nyert ügyem van, ilyenkor az említett módszert használom, illetve sokszor sajnos ez sem kielégítő, ilyenkor a 'helyesírása' szót szoktam még hozzábiggyeszteni a kérdéses szóhoz vagy kifejezéshez, ráadásúl erre teljesen magamtól jöttem rá! :)

Bónusz kérdés a mai poszt helyesírási vetüléhez: Vajon (valyon) "Babits, please" vagy "Babits please"?

$pi$ 2016.03.04. 15:35:18

@Indiecrawford: "Egyszerű! Mindig kiteszed és nem érnek meglepetések."
Jah, nekem a másik oldalról volt szerencsém hozzá. Csinálni egy nyelvtant ami megengedi, hogy kitedd és megengedi, hogy elhagyd elég nehéz, na de amikor akarsz csinálni egy programot, ami pont úgy hibázik mint egy másik, az egy rémálom. :)

Indie Crawford · http://indiecrawford.blog.hu 2016.03.04. 16:08:27

@$pi$: Uhh, értelek, és megértelek. :) De akkor végül is sikerült? Szabad érdeklődnöm, hogy miért írtál saját js interpretert?

azszép 2016.03.04. 16:09:01

@Indiecrawford: a bónusz kérdéshez. attól függ, hogy az író van e olyan jó, hogy megillesse a művészi szabadság e téren. az angolok kevesebb vesszővel tagolják a mondandójukat, ezt kissé nehezebben érzem, pedig lehet egyszerű

azszép 2016.03.04. 16:12:20

js interpreter, hmm, nem is tudom, szerintem szórakozásból, vagy kókányolásból, hogy áttuszkoljon rajta valamit
annyira nem bonyolult nyelv a js, hogy egy érdeklődő ne próbálkozzon ilyesmivel bármilyen okból. habár különösebb ok nélkül én se látom értelmét.
a poszt érdekes, valamikor gondolkodtam rajta, hogy szakdolgozatként bearcolok egy valamilyen fentiekhez hasonló, kicsit programnyelvre azért jobban hasonlító, de azért humoros nyelvvel és azon írt kóddal, de az, hogy mai nyelvnek is tűnjön és humoros is legyen az azért meleg lehet

Indie Crawford · http://indiecrawford.blog.hu 2016.03.04. 16:56:49

@azszép: kókányolás? ezt javaslom foglalt szónak! ;)

cousin333 · http://magyaropera.blog.hu 2016.10.29. 19:53:16

Mindkét listából kimaradt az Arnold C: lhartikk.github.io/ArnoldC/
A név nem véletlen... :)