Brainfuck

A Wikipédiából, a szabad enciklopédiából
brainfuck
Paradigma ezoterikus
Jellemző kiterjesztés .b, .bf
Megjelent 1993
Tervező Urban Müller
Befolyásolt nyelvek P′′, FALSE


A Brainfuck programozási nyelv egy nyolc utasítást tartalmazó Turing-teljes[1] (Turing-complete) 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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

Az alábbi program kiírja az ASCII karakterkészletet; szerzője Jeffry Johnston, 2001

.+[.+]

Echo[szerkesztés | forrásszöveg szerkesztése]

Ez a program minden beadott karaktert kiír addig, míg egy ASCII 255 karaktert nem kap.

,+[-.,+]

Fordít[szerkesztés | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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;
 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.

Hello World[szerkesztés | forrásszöveg szerkesztése]

+++++ +++++
[
    > +++++ ++
    > +++++ +++++
    > +++
    > +
    <<<< -
]
> ++ .                  'H'
> + .                   'e'
+++++ ++ .              'l'
.                       'l'
+++ .                   'o'
>++ .                   ' '
<< +++++ +++++ +++++ .  'W'
> .                     'o'
+++ .                   'r'
----- - .               'l'
----- --- .             'd'
> + .                   '!'

Egy sorban:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

  1. BME EET: BF, 2009. január 17. (Hozzáférés: 2012. július 1.)

Források[szerkesztés | forrásszöveg szerkesztése]

További információk[szerkesztés | forrásszöveg szerkesztése]

Kapcsolódó szócikkek[szerkesztés | forrásszöveg szerkesztése]