Brainfuck

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:

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

Ezoterikus programozási nyelvek