Befunge


tirsdag 20. desember 2011 Julekalender Polyglot WTF Esoteriske språk Befunge

I 1993 satte Chris Pressey seg som mål å lage et programmeringsspråk som var vanskeligere å kompilere enn alle andre språk. Resultatet ble Befunge, et språk du aldri har sett maken til. Om du finner et praktisk bruksområde for Befunge så er du god, men språket er uansett underholdende, og stimulerer hjernen til å tenke tanker du aldri har hatt før.

Gjør deg klar for litt orntlig trylling med tekst!

Befunge

Befunge skiller seg klart fra alle konvensjonelle språk. Som Forth og Factor er det et stack-basert, men måten man skriver programmer på i Befunge er helt anderledes.

Et Befunge-program er et todimensjonalt grid. Alle kommandoer er representert ved ett tegn. Program-counteren starter på kommandoen øverst til venstre i kildefilen, og så beveger den seg normalt ett og ett tegn mot høyre. Men man kan bruke spesielle kommandoer for å endre retningen, og programmet vil i praksis bevege seg på kryss og tvers i 2D-verdenen som kildekoden representerer.

La det synke inn litt... Et program i et tradisjonelt programmeringsspråk er en sekvens med instruksjoner. Man kan hoppe fra sted til sted – f.eks. ved hjelp av metodekall – men i metodene er det igjen en vanlig sekvens med instruksjoner. I Befunge kan programmet bevege seg til høyre, til venstre, oppover og nedover. Instruksjonspekeren kan til og med gå ut over en av kantene i kildekoden, og dukke opp igjen på den motsatte siden!

Euler-oppgave 1

Jepp, du har sett det før: en algoritme for å finne summen av alle multipler av 3 eller 5 mindre enn 1000.

 1  9872***9- v    Euler Problem #1
 2        >   v
 3            :                   >\         v
 4            !
 5            _   v               |  :  \+   <$
 6                :
 7        -       3
 8        1       %               $
 9                !               .
10        ^  \:<  _  v            @
11                   :
12                   5
13                   %
14                   !
15             ^     _     v
16        ^                <  - By Torbjørn Marø

Ahhhhhh, what a rush!! Det var kanskje den kjekkeste koden jeg har skrevet til denne julekalenderen. Jeg utfordrer deg til å forsøke selv, for dette er både stimulerende hjernetrim og underholdende morro.

Når du har begynt å tenke stack-basert, og vært innom andre ett-tegn-baserte språk som Betterave, så er løsningen egentlig ganske "rett frem". Det mest utfordrende er å holde orden på koden, å strukturere den riktig og godt.

Nedenfor har jeg forsøkt å forklare programmet gjennom et diagram. Diagrammet speiler strukturen i koden – sammenligner du dem så vil du begynne å se det.

befunge_fig1

Har du noengang spilt et spill hvor du må plassere objekter i et rom får å få en laserstråle eller en ball til å lyse/sprette fra start til mål? Befunge er mye av det samme. Du kan også sammenligne det med workflow-baserte systemer; jeg ser på Befunge som en enkel ASCII-basert versjon av Windows Workflow Foundation eller tilsvarende prosessdesigner-verktøy, bare med et litt begrenset sett med byggeklosser.

Algoritmen jeg har brukt er forresten den samme som den rekursive algoritmen jeg løste oppgaven med i Forth. Men i Befunge har jeg laget en visuell utgave. Med litt fantasi kan jeg se for meg hvordan programmet kjører rundt i koden og bygger opp stacken, før den slår alle tallene sammen og skriver ut svaret.

Hvordan komme igang

Esolangs-wikien gir deg en god introduksjon til språket og alle kommandoene du kan benytte. Det finnes en rekke tolkere til Befunge, skrevet i blant annet Python, JavaScript og Java. Selv har jeg brukt en kompilator skrevet i C, men jeg klarer av en eller annen grunn ikke å finne eller huske hvor jeg fikk den fra. Men om noen er interessert i den kan jeg gjøre koden tilgjengelig.


comments powered by Disqus