IT-folk som kjeder seg er noe man helst bør unngå. De kan nemlig finne på mye rart. Lage nye og rare programmeringsspråk, for eksempel.
Det finnes hundrevis av eksempler på slike såkalte «esospråk», og her tar vi en titt på de rareste av de rare.
INTERCAL
INTERCAL, en forkortelse for «Compiler Language With No Pronounceable Acronym» (ja, faktisk) er vanligvis betraktet som det første såkalte esoteriske programmeringsspråket, skjønt det finnes andre teorier. Det ble skapt som en parodi av Don Woods og James M. Lyon ved Princeton University i 1972.
Å liste opp hva som er spesielt med INTERCAL er en stor oppgave, men et greit sted å begynne er kanskje med kravet om høflighet i koden. Noe mellom en femdel og en tredel, sånn omtrent, av alle instruksjoner i koden må være høflige. Det vil si at de må kodes med PLEASE før selve instruksjonen. Men det gjelder å ikke overdrive, for da vil instruksjonen bli avvist for trygling eller for å være «for sutrete». For få tilfeller av PLEASE etc. i koden, og instruksjonene vil bli avvist for å være frekke og kravstore.
Instruksjoner kan dermed begynne med for eksempel DO, PLEASE, eller PLEASE DO og gjøre akkurat det samme. Senere versjoner støtter også MAYBE.
Andre moderne tillegg til INTERCAL er ting som «wimpmode» som gjør at input-/output-tall faktisk vises i form av sifre. Normalen er nemlig at input er i engelske tallord (ONE, TWO, THREE, etc), mens output er i romertall (III, XIV, MLCVIII, etc).
En annen nyere versjon lar deg hoppe fra sted til sted i koden - litt som GOTO i Basic for dem som kjenner til det - men bare omvendt med COME FROM, noe som lett kan føre til heller uoversiktlig kode.
C-INTERCAL, en annen variant av originalen, aksepterer forresten også instruksjoner på latin. Det er for øvrig litt kinkig å oppgi versjonsnumrene på alle disse variantene, siden INTERCAL-revisjoner ikke har versjonsnumre, men PERversjonsnumre. Selvsagt.
Et fellestrekk for alle esospråk er for øvrig at de skal fungere, men ikke trenger å fungere godt eller effektivt. I 1992 ble INTERCAL ytelsestestet mot C på en Sun SPARCstation 1, en maskin som var noe av det heftigste som var å få den gang. Oppgaven gikk ut på å regne ut alle primtall under 65536. Programmert i C gikk det unna på under et halvt sekund, mens i INTERCAL tok det over 17 timer.
Her er et eksempel på et vanlig «Hello, world!»-program i INTERCAL:
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
Brainfuck
Brainfuck er nettopp hva det høres ut som. Programmeringsspråket består av kun åtte tegn, og er som du kanskje kunne tippe laget for en ekstrem form for minimalisme. Språket ble oppfunnet av Urban Müller i 1993, da han ble inspirert av FALSE, som har en kompilator på bare 1024 bytes, til å lage et språk som fungerte med en enda mindre kompilator. Han endte opp med en kompilator på kun 240 bytes, laget for Amiga OS v2.0.
Brainfuck fungerer ved at det etablerer en matrise av verdier, der en peker flyttes fra celle til celle, og kan hente frem eller sette inn en verdi der.
Slik ser «Hello, world!» ut i Brainfuck:
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Brainfuck har for øvrig inspirert en hel familie av avarter som mer eller mindre fungerer på samme måte, men med andre kommandosett. Disse kalles «Trivial brainfuck substitution» og du finner en liste her. De mest interessante er disse, kort oppsummert:
- Blub med kommandoer som f.eks.: «Blub. Blub?», «Blub? Blub.», «Blub. Blub.», «Blub! Blub!», «Blub! Blub.», «Blub. Blub!», «Blub! Blub?», «Blub? Blub!»
- Ook! med kommandoer som f.eks.: «Ook. Ook?», «Ook? Ook.», «Ook. Ook.», «Ook! Ook!», «Ook! Ook.», «Ook. Ook!», «Ook! Ook?», «Ook? Ook!»
- Pikalang med kommandoer som f.eks.: «pipi», «pichu», «pi», «ka», «pikachu», «pikapi», «pika», «chu»
- Roadrunner med kommandoer som f.eks.: «meeP», «Meep», «mEEp», «MeeP», «MEEP», «meep», «mEEP», «MEEp»
- SCREAMCODE med kommandoer som f.eks.: «AAAH», «AAAAGH», «FUCK», «SHIT», «!!!!!!», «WHAT?!», «OW», «OWIE»
- Btjzxgquartfrqifjlv med kommandoer som f.eks.: «f», «rqi», «qua», «rtf», «lv», «j», «btj», «zxg»
- Morsefuck med kommandoer som f.eks.: «.--», «--.», «..-», «-..», «-.-», «.-.», «---», «...»
- DetailedFuck med kommandoer som f.eks.: «MOVE THE MEMORY POINTER ONE CELL TO THE RIGHT», «MOVE THE MEMORY POINTER ONE CELL TO THE LEFT», «IF THE CELL UNDER THE MEMORY POINTER'S VALUE IS ZERO INSTEAD OF READING THE NEXT COMMAND IN THE PROGRAM JUMP TO THE CORRESPONDING COMMAND EQUIVALENT TO THE ] COMMAND IN BRAINFUCK», og så videre
For The Worthy
Dette språket aksepterer kun 1 og 0 i koden, og alt annet blir ignorert. Dermed er det ganske enkelt å kommentere koden man skriver, men desto vanskeligere å forstå den uten kommentarer.
Et «Hello world!»-program ser slik ut, i For The Worthy:
0010 00 00001100 01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100 00100001
Derpcode
Derpcode har kun fem kommandoer: herp, derp, a-derp, . og ?. Det fungerer ikke så ulikt brainfuck, men er ikke fullt så ... skal vi si «avansert»?
Funke gjør det likefullt, og slik ser et «Hello, world!»-program ut:
derp a-derp.
derp herp derp derp derp herp a-derp a-derp a-derp a-derp. derp derp herp derp derp herp derp herp derp derp herp a-derp a-derp a-derp a-derp a-derp a-derp a-derp. derp derp derp derp herp derp derp derp herp a-derp a-derp a-derp a-derp a-derp a-derp a-derp. . derp derp derp derp derp derp herp derp herp a-derp a-derp a-derp a-derp a-derp a-derp a-derp.
derp herp derp derp derp herp derp herp derp herp derp herp a-derp a-derp a-derp a-derp a-derp a-derp a-derp. derp herp derp derp herp derp derp herp derp herp derp herp a-derp a-derp a-derp a-derp a-derp a-derp a-derp. derp derp derp herp derp herp a-derp a-derp a-derp a-derp. derp derp derp herp derp herp derp herp derp derp herp a-derp a-derp a-derp a-derp a-derp a-derp a-derp. derp derp derp herp derp herp derp herp derp herp a-derp a-derp a-derp a-derp a-derp a-derp.
derp derp derp derp herp a-derp a-derp a-derp a-derp. derp herp derp derp derp derp herp derp derp herp a-derp a-derp a-derp a-derp a-derp a-derp a-derp.
herp a-derp.
Insomnia
Insomnia er laget for å fungere, som alle andre esospråk, men likevel gjøre det nært opptil umulig å faktisk programmere noe i det som gjør det man ønsker at programmet skal gjøre.
Det funker slik at selve programkoden består av ASCII-tegn, og dermed kan nær sagt hvilken som helst tekst i ASCII «oversettes» til programkode. Hvert tegn leses som en tilsvarende tallverdi - for eksempel vil W leses som 87 - og deretter vil instruksjonen som tilsvarer hvert siffer i verdien - 8 og 7 i vårt tilfelle - kjøres etter tur. Språket har 10 ulike instruksjoner, nummerert fra 0 til 9.
Det er som sagt praktisk talt umulig å lage et fungerende program i Insomnia, men ikke helt. Noen fant ut at en kombinasjon av bokstavene FGHIJKLMNO sammen kunne lage et svært enkelt program som faktisk gjorde noe man hadde til hensikt å gjøre, og det ble jo for enkelt.
Derfor ble Insomnia 2.0 lansert, som endret instruksjonen for verdien 7. Det gjør det betydelig vanskeligere, men ikke helt umulig, å lage et fungerende program som virker etter hensikten. Noe «Hello, world!»-program er det imidlertid ingen som har klart å lage i noen versjon av Insomnia.
Malbolge
For de som mener Insomnia 2.0 blir for lett, er det alltids Malbolge.
Malbolge ble oppfunnet av Ben Olmstead i 1998, og er oppkalt etter Dantes åttende nivå av Helvete. Det er inspirert av Brainfuck og lignende språk, men er laget for å være enda vanskeligere å bruke enn Insomnia, takket være at det bruker tre-tallsystem og kode som kan endre seg selv. Faktisk har Olmstead selv aldri skrevet et program i språket han fant opp, og det tok to år før det første fungerende programmet ble skrevet i Malbolge. Det ble ikke gjort av et menneske, men generert av en algoritme skrevet av Andrew Cooke.
Slik ser «Hello, world!» ut i Malbolge:
(=<`#9]~6ZY327Uv4-QsqpMn&+Ij"'E%e{Ab~w=_:]Kw%o44Uqp0/Q?xNvL:`H%c#DD2^WV>gY;dts76qKJImZkj
Piet
Dette er et språk som er oppkalt etter den kjente kunstneren Piet Mondrian, og som bruker piksler i 20 ulike farger heller enn bokstaver og tegn som basis.
Å gå nærmere inn på hvordan dette funker er neppe godt for egen mental helse, men slik ser altså et «Hello, world!»-program ut i Piet:
Det finnes også et program som skriver «Piet» og som ligner Mondrians malerier.
Matthias Ernst har forøvrig laget et program i Piet som er i stand til å tolke Brainfuck-kode og kjøre den. Slik ser det ut.
Whitespace
Om ikke brainfuck og Derpcode var ille nok, så har man Whitespace, et programmeringsspråk som kun består av «tomme» tegn, dvs. tegn som ikke vises i en tekst-editor. Alle instruksjoner og så videre består av ulike kombinasjoner av mellomrom, tabulator og linjeskift.
Slik ser et «Hello, world!» ut:
Hello,[mellomrom]world![mellomrom][mellomrom][Tab][mellomrom][mellomrom][Tab][mellomrom][mellomrom][mellomrom][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][Tab][mellomrom][mellomrom][Tab][mellomrom][Tab][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][Tab][mellomrom][Tab][Tab][mellomrom][mellomrom][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][Tab][mellomrom][Tab][Tab][mellomrom][mellomrom][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][Tab][mellomrom][Tab][Tab][Tab][Tab][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][mellomrom][Tab][Tab][mellomrom][mellomrom][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][mellomrom][mellomrom][mellomrom][mellomrom][mellomrom][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][Tab][Tab][mellomrom][Tab][Tab][Tab][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][Tab][mellomrom][Tab][Tab][Tab][Tab][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][Tab][Tab][mellomrom][mellomrom][Tab][mellomrom][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][Tab][mellomrom][Tab][Tab][mellomrom][mellomrom][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[mellomrom][mellomrom][mellomrom][Tab][Tab][mellomrom][mellomrom][Tab][mellomrom][mellomrom][linjeskift]
[Tab][linjeskift][mellomrom][mellomrom]
[linjeskift][linjeskift][linjeskift]
Shakespeare Programming Language (SPL)
Dette ble ikke laget av William Shakespeare på slutten av 1500-tallet, men derimot av to svensker i 2001. Målet var imidlertid å lage vakker programkode som skulle ligne på Shakespeares skuespill. Hvor vakkert det ble kan man sikkert debattere, men at det er elegant på sitt eget lille vis, kan vi sikkert være enige om.
Programmer i SPL begynner med en tittel, som tolkeren ignorerer som kommentar, og deretter en «dramatis personae» der variabler deklareres. Deretter deles koden opp i akter, som hver deles i scener.
Programstrukturen er i hovedsak en teaterscene med to karakterer på, som snakker med hverandre og som på den måten behandler data. Her betyr for eksempel BETTER og WORSE henholdsvis større enn og mindre enn. Kommandoen for å vise numerisk verdi av en variabel er OPEN YOUR HEART, mens SPEAK YOUR MIND viser det tilsvarende ASCII-tegnet. For input av det samme er det henholdsvis LISTEN TO YOUR HEART og OPEN YOUR MIND som gjelder.
Variabler kalles til teaterscenen med for eksempel ENTER HAMLET, og EXIT beordrer en karakter til å forlate scenen. EXEUNT gjør det samme som sistnevnte, men for flere karakterer samtidig.
Egentlig er ikke dette så veldig forskjellig fra assemblerprogrammering – bare fryktelig mye mer ordrikt.
«Hello, world!» blir slik:
Do Not Adieu, a play in two acts.
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 beautiful as the difference between Romeo and the square
of a huge green peaceful tree. Speak thy mind!
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]
Chef
Vi avslutter med Chef, som kan ligne litt på SPL. Chef er imidlertid et programmeringsspråk som har kode som ser ut som en oppskrift, med ingrediensliste, fremgangsmåte og det hele. Og ikke bare skal koden fungere fra et programmeringsstandpunkt, men oppskriften skal også være mulig å følge relativt enkelt, og da ende opp med noe som faktisk er godt å spise. I tillegg står det i språkets designprinsipper at oppskriftene skal være tilgjengelig for ulike budsjetter, og at oppskriftene for det meste skal bruke metriske måleenheter. Bon appétit!
Et eksempel på «Hello, world!»:
Hello World Souffle.
This recipe prints the immortal words «Hello world!», in a basically brute force way. It also makes a lot of food for one person.
Ingredients.
72 g haricot beans
101 eggs
108 g lard
111 cups oil
32 zucchinis
119 ml water
114 g red salmon
100 g dijon mustard
33 potatoes
Method.
Put potatoes into the mixing bowl. Put dijon mustard into the mixing bowl. Put lard into the mixing bowl. Put red salmon into the mixing bowl. Put oil into the mixing bowl. Put water into the mixing bowl. Put zucchinis into the mixing bowl. Put oil into the mixing bowl. Put lard into the mixing bowl. Put lard into the mixing bowl. Put eggs into the mixing bowl. Put haricot beans into the mixing bowl. Liquefy contents of the mixing bowl. Pour contents of the mixing bowl into the baking dish.
Serves 1.