A Brainfuck programozási nyelv egy nyolc utasítást tartalmazó Turing-teljes (Turing-complete) ezoterikus programozási nyelv. A Brainfuck szó az angol brain ’agy’ és fuck ’szexuálisan közösülni, durván behatolni’ 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-teljes 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).
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 nyolc parancsát egy-egy karakter reprezentálja:
> A pointer növelése eggyel<A 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ő ] jel utánig, ha a pointer alatti byte nulla.]Ugrás az előző, megfelelő [ jelig.
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.
ASCII Az alábbi program kiírja az ASCII karakterkészletet; szerzője Jeffry Johnston, 2001 .+[.+]
Echo Ez a program minden beadott karaktert kiír addig, míg egy ASCII 255 karaktert nem kap. ,+[-.,+]
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). >,[>,]<[.<]
TOP-BOT Egy szimpla polyglot, amit 'a' és 'b' karakterrel hajtunk [80x25]. A program Turbo Pascal és BrainFuck nyelven is lefordul, és az eredménye azonos program TopBot; uses Crt; var Top: char; Bot: char; Ch: char; i: word; begin Top := #47; {>>>+++ +++[<++++ ++++[<+<+>>-]>-] <<-<-->} Bot := #46; repeat {[} for i := 1 to 80 do {>++++ ++++[<..... .....>-]} Write(Top); for i := 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.
Hello World +++++ +++++ [ > +++++ ++ > +++++ +++++ > +++ > + <<<< - ] > ++ . 'H' > + . 'e' +++++ ++ . 'l' . 'l' +++ . 'o' >++ . ' ' << +++++ +++++ +++++ . 'W' > . 'o' +++ . 'r' ----- - . 'l' ----- --- . 'd' > + . '!'
Egy sorban: ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Két megadott byte összeadása , #0 feltöltése > pointer növelése , #1 feltöltése
[ ciklus kezd (ha a pointer alatti byte 0 akkor hagyja ki a következő zárójel bezár utánig a kódot) - #1 csökkentése < pointer csökkentése + #0 növelése > pointer növelése ] ciklus vége
< pointer csökkentése . #0 kiírása
Egy sorban:
,>,[-<+>]<.
Jegyzetek
További információk JavaScript nyelven írt BrainFuck értelmező. Webes BrainFuck értelmező. Másik webes BrainFuck értelmező és gépikódú fordító. Brainfuck – An Eight-Instruction Turing-Complete Programming Language Brainfuck interpreter with integrated debugger (IDE) for Windows bkil ASCII BF interpretere
Kategória:Ezoterikus programozási nyelvek