Brainfuck
brainfuck | |
Paradigma | ezoterikus |
Jellemző kiterjesztés | .b, .bf |
Megjelent | 1993 |
Tervező | Urban Müller |
Fejlesztő | Urban Müller |
Hatással volt rá |
|
Befolyásolt nyelvek | P′′, FALSE |
Weboldal |
A Brainfuck programozási nyelv egy nyolc utasítást tartalmazó Turing-teljes[1] (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
[szerkesztés]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
[szerkesztés]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
[szerkesztés]Az alábbi program kiírja az ASCII karakterkészletet; szerzője Jeffry Johnston, 2001
.+[.+]
Echo
[szerkesztés]Ez a program minden beadott karaktert kiír addig, míg egy ASCII 255 karaktert nem kap.
,+[-.,+]
Fordít
[szerkesztés]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
[szerkesztés]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
[szerkesztés]+++++ +++++
[
> +++++ ++
> +++++ +++++
> +++
> +
<<<< -
]
> ++ . 'H'
> + . 'e'
+++++ ++ . 'l'
. 'l'
+++ . 'o'
>++ . ' '
<< +++++ +++++ +++++ . 'W'
> . 'o'
+++ . 'r'
----- - . 'l'
----- --- . 'd'
> + . '!'
Egy sorban:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Két megadott byte összeadása
[szerkesztés], #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
[szerkesztés]- ↑ BME EET: BF, 2009. január 17. [2012. június 27-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. július 1.)
További információk
[szerkesztés]- JavaScript nyelven írt BrainFuck értelmező.
- Webes BrainFuck értelmező.
- Másik webes BrainFuck értelmező és gépikódú fordító.[halott link]
- Brainfuck – An Eight-Instruction Turing-Complete Programming Language
- Brainfuck interpreter with integrated debugger (IDE) for Windows
- bkil ASCII BF interpretere Archiválva 2006. február 23-i dátummal a Wayback Machine-ben