**Brainfuck** estas minimumisma komputillingvo kreita de Urban MÜLLER ĉirkaŭ 1993. Ĉar *"fuck"* estas fivorto en la angla, la lingvo estas ankaŭ nomata **Brainf\*ck**, **Brainf\*\*\***, (ŝerce) **B\*\*\*\*fuck**, aŭ simple **BF**.

La celo de Müller estis krei simplan Turing-kompletan komputillingvon, kiu povus esti implementita per kiel eble plej malgranda tradukilo. La lingvo konsistas el nur ok instrukcioj. Versio 2 de la originala tradukilo, verkita por la komputilo Amiga, estis nur 240 bitojn granda.

Kiel sugestas la nomo ("Brainfuck" signifas "Cerbofiko"), programoj en Brainfuck inklinas al nekomprenebleco, kvazaŭ tiom, ke la programisto freneziĝu. Tamen, la Turing-maŝino, do tial ankaŭ Brainfuck, povas plenumi ajnan komputan taskon. Malgraŭ la malfacileco programi iajn taskojn en Brainfuck, tamen certe eblas fari tiel.

La lingvo estas bazita sur simpla maŝinmodelo, kiu konsistas el, krom la programo, tabelo komence nula, indiko al la tabelo (komence indikas al la unua bitoko de la tabelo), kaj du vicoj da bitokoj por enigo kaj eligo.

La unuaj ok instruckioj, ĉiu nur unuliteraj, estas:

| Signo | Signifo |
| --- | --- |
| > |  altigu la referencon je unu paŝo |
| < |  malaltigu la referencon je unu paŝo |
| + |  altigu la bitokon ĉe la referenco je 1. |
| - |  malaltigu la bitokon ĉe la referenco je 1. |
|. |  eligu de la bitoko ĉe la referenco (en Askio). |
| , |  enigu al la bitoko ĉe la referenco (en Askio). |
| [ |  saltu antaŭen al la instrukcio post la responda ] se la bitoko ĉe la referenco estas nula. |
| ] |  saltu malantaŭen al la responda [. |

(Por simetrieco, iuj diras ke ] saltas reen nur se la bitoko ĉe la referenco estas nenula, sed fine estas tute egale.)

Brainfuck-programoj povas esti transliteritaj al C per la jenaj anstataŭoj, kie `ptr` estas de datumtipo `char*`:

| Brainfuck | C |
| --- | --- |
|  >  |  ++ptr;  |
|  <  |  --ptr;  |
|  +  |  ++\*ptr;  |
|  -  |  --\*ptr;  |
| .  |  putchar(\*ptr);  |
|  ,  |  \*ptr = getchar();  |
|  [  |  while (\*ptr) {  |
|  ]  |  }  |

Ekzemploj
---------

### Saluton, mondo!

Programo kiu eligas sur la ekrano "Hello, world!" ("Saluton, mondo!"), per unu linio de kodo kaj sen notoj, estas:

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

Brainfuck estas tre interesa pro ĉi tiu kazo, ĉar "Saluton, mondo" programo estas nek malgranda nek facile verkebla!

### Enigo/eligo de signoj

`,.`

Enigi unu signon de la klavaro kaj eligi ĝin al la ekrano

### Simpla itero

`,[.]`

Sindaŭriga itero kiu prenas klavaran enigon kaj eĥigas ĝin al la ekrano. Rimarku ke ĉi tiu supozas ke 0 estas la signalo de enigofino; implementoj varias pri ĉi tiu temo. Versioj por -1 kaj "neniu ŝanĝo" estas `,+[-.+]` and `,[.[-],]`

### Manipulado de referencoj

`,[.>,]`

Versio de la lasta ekzemplo kiu ankaŭ konservas ĉiun enigon en la tabelo por estonta uzo, per ĉiufoje movi la referencon.

Referencoj
----------

1. ↑

Vidu ankaŭ
----------

* Ook

Eksteraj ligiloj
----------------

* Kategorio Brainfuck (programlingvo) en la Vikimedia Komunejo (Multrimedaj datumoj)

* La Brainfuck-arĥivo (*angle*)
* Versio 2 de la originala tradukilo Arkivigite je 2007-03-13 per la retarkivo Wayback Machine (*angle*)
* **Brainfucked** - Brainfuck Compiler Arkivigite je 2005-03-03 per la retarkivo Wayback Machine (*angle*)