Brainfuck
Brainfuck | |||
---|---|---|---|
![]() | |||
Tilblivelse | 1993 | ||
Paradigme | Multi-paradigme: Esoteric programming, Imperativ programmering | ||
Utviklet av | Urban Müller | ||
Filendelse(r) | .b, .bf | ||
Påvirket av | |||
P′′, FALSE |
Brainfuck er et programmeringsspråk kjent for sin ekstreme minimalisme. Det ble designet for å utfordre og underholde programmerere, og passer ikke for praktisk bruk.
Språkdesign[rediger | rediger kilde]
Urban Müller utviklet Brainfuck rundt 1993 i den hensikt å skape et språk som kunne bli implementert med en minst mulig kompilator [1]. Det har blitt skrevet flere Brainfuck-kompilatorer på mindre enn 200 bytes. Den klassiske distribusjonen er Müllers versjon 2, som inneholder en kompilator for Amiga, en tolker, eksempelprogrammer, og et lesmeg (readme)-dokument.
Språket består av åtte kommandoer, listet nedenfor. Et Brainfuck-program er en rekke av disse kommandoene, noen ganger med andre tegn imellom (som blir ignorert). Kommandoene blir kjørt sekvensielle, med unntak notert nedenfor.
Brainfuck-språket bruker en enkel maskinmodell som utenom selve programmet består av en rekke med 30,000 byte-celler initialisert til null, en bevegelig peker i rekken og to strømmer av bytes for inn- og utdata (vanligvis koblet til et tastatur og en skjerm, og med ASCII tegnsettet).
Kommandoer[rediger | rediger kilde]
De åtte språkkommandoene, hver bestående av ett enkelt tegn, er som følger:
Tegn | Mening |
---|---|
>
|
øk pekeren (til å peke på nærmeste celle til høyre). |
<
|
minsk pekeren (til å peke på nærmeste celle til venstre). |
+
|
øk (med én) byten på pekeren. |
-
|
minsk (med én) byten på pekeren. |
.
|
skriv ut byten på pekeren. |
,
|
aksepter én byte med inndata og lagre den i byten på pekeren. |
[
|
hopp forover til kommandoen etter den tilhørende ] hvis byten på pekeren er null.
|
]
|
hopp tilbake til kommandoen etter den tilhørende [ hvis byten på pekeren ikke er null.
|
Eksempler[rediger | rediger kilde]
Hello World![rediger | rediger kilde]
Det følgende programmet skriver «Hallo Verden!» og en newline:
++++++++++
[
>+++++++>++++++++++>+++>+<<<<-
]
>++. print 'H'
>---. print 'a'
+++++++++++. 'l'
. 'l'
+++. 'o'
>++. mellomrom
<<++++++++++++++. 'V'
>----------. 'e'
+++++++++++++. 'r'
--------------. 'd'
+. 'e'
+++++++++. 'n'
>+. '!'
>. newline
For lesbarhetens skyld har koden blitt spredt utover mange linjer og kommandoer blitt lagt til. Brainfuck behandler alle tegn utenom +-<>[],.
som kommentarer, så ingen spesiell syntaks for kommentarer trengs. Koden kunne like gjerne blitt skrevet som:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>---.+++++++++++..+++.>++.<<++++++++++++++.>---
-------.+++++++++++++.--------------.+.+++++++++.>+.>.
Trivielt[rediger | rediger kilde]
Enkel løkke[rediger | rediger kilde]
,[.,]
En løkke som mottar tekst fra tastaturet og skriver det til skjermen.
Pekermanipulasjon[rediger | rediger kilde]
>,[.>,]
En versjon av det forrige som i tillegg lagrer alle inndata i rekken med bytes ved å flytte pekeren hver gang.
Addisjon[rediger | rediger kilde]
[->+<]
Denne legger byten på den nåværende posisjonen til byten på den neste posisjonen.
Kopiering[rediger | rediger kilde]
[->>+<<]>>[-<+<+>>]
Denne kopierer byten fra den nåværende posisjonen til neste posisjon, ved å bruke en tredje posisjon som temporær byte.