Brainfuck programozási nyelv
A Wikipédiából, a szabad lexikonból.
A Brainfuck programozási nyelv egy 8 utasítást tartalmazó Turing (Turing-complete) programozási nyelv. A Brainfuck szó az angol brain (=agy) és fuck (=szexuálisan közösülni) szavakból áll össze, ami a programok nehéz megírására utal.
A nyelvet Urban Müller készítette Amiga OS 2.0 alá azzal a céllal, hogy olyan Turing-nyelvet hozzon létre, amire a lehető legkisebb fordítóprogramot meg tudja írni. (Ez eredetileg 240 byte hosszú volt, de híresztelések szerint sikerült később 200 byte alatt megírnia.)
A Turing-komplett nyelvekkel minden lehetséges program megírható. Mivel ez a lehetséges programozási módok közül az egyik legnehezebb, legátláthatatlanabb, ezért kaphatta a nyelv az "agycseszegető" nevet (finoman fordítva).
Tartalomjegyzék |
[szerkesztés] A nyelv szerkezete
A Brainfuck nyelvnek egy univerzális byte mutatója van, aminek a neve "pointer", ami szabadon mozoghat egy 30 000 byte nagyságú tömbben, melynek alapértékei nullák. A pointer a tömb elején indul.
A nyelv 8 parancsát egy-egy karakter reprezentálja:
> | Pointer növelése eggyel |
< | Pointer csökkentése eggyel |
+ | A Pointernél levő byte növelése eggyel |
- | A Pointernél levő byte csökkentése eggyel |
. | A Pointernél levő byte kiírása |
, | Byte bekérése és a Pointernél tárolása |
[ | Ugrás a következő, megfelelő ] jelig ha a Pointer alatti byte nulla. |
] | Ugrás az előző, megfelelő [ jelig. |
[szerkesztés] Példaprogramok
A legtöbb Brainfuck program több száz, vagy több ezer karakterből áll. Íme két extrém pici program, ami igazából semmi hasznosat nem csinál a bemutatáson túl.
[szerkesztés] ASCII
Az alábbi program kiírja az ASCII karakterkészletet; szerzője Jeffry Johnston, 2001
.+[.+]
[szerkesztés] Echo
Ez a program minden beadott karaktert kiír addig, míg egy ASCII 255 karaktert nem kap.
,+[-.,+]
[szerkesztés] Fordít
A beadott karaktereket kiadja ellensorrendben. (enter/soremel=10)
+[>,----- -----]<-[+ +++++ +++++.<-]
A következő példa ugyanazt csinálja mint az előző, de csak akkor működik, ha a fordító/interpreter az "entert" 0-vá alakítja (így nem kell sem levonni sem hozzáadni 10-et, mint az előbb).
>,[>,]<[.<]
[szerkesztés] TOP-BOT
Egy szimpla polyglot, amit 'a' meg 'b' karakterrel hajtunk [80x25]. (Pascal 6.0 meg BrainFuck nyelven is helyes, ugyanazt is csinálja)
uses crt; var top:char; bot:char; ch:char; a:word; begin top:=char(47); {>>>+++ +++[<++++ ++++[<+<+>>-]>-] <<-<-->} bot:=char(46); repeat {[} for a:=1 to 80 do {>++++ ++++[<..... .....>-]} write(top); for a:=1 to 1919 do{>> ++++ +++++[<+++ ++++[<+++ +++[<<.. ...>>-] >-] >-] } write(bot); {<< +++ [<<.... .....>>-] <<..>>} ch:=readkey; {>>>,[<+<+<+>>>-]} write(ch); case ch of {+++++ +++++ [>+++++ +++++[<<-<->>>-]<-]} 'a': inc(top); {+< +++[>[-]<-]>[<<<<+>>>>-]<} 'b': inc(bot); {+< ++ [>[-]<-]>[<<<<+>>>>-]<} #27: top:=#0; {+++[<---- ----->-] +< [>[-]<-]>[<<[-]<[-]>>>-]<<} end; until top=#0; {]} end.