**Brainfuck** (İngilizce *beyini beceren*), 1993 yılında programcı Urban Müller tarafından yaratılmış bir programlama dilidir. Yaratılma amacı mümkün olan en küçük boyutlu derleyiciyi üretmektir. Bilinen bazı derleyicileri 200 bayttan küçüktür. Sadece sekiz komutu bulunmakla birlikte Turing-bütün (*İngilizce: Turing-complete*) bir dil olduğundan teorik olarak herhangi bir algoritma bu dilde yazılıp işletilebilir.

Brainfuck dili çok basit bir makine modeli ile çalışır, bu modelde her birinin başlangıçtaki değeri 0 olan 30000 hücre ve bu hücreler arasında hareket edebilen bir işaretçi bulunur. (İşaretçi, başlangıçta ilk hücrededir).

Bu programlama dilinin amacı, genel bir dil olmaktan çok programcıları zorlamak ve eğlendirmektir.

Komutlar
--------

Her biri sadece tek karakterden oluşan komutları şunlardır;

| Komut | Anlamı |
| --- | --- |
| `>` | işaretçiyi bir sonraki hücreye kaydır. |
| `<` | işaretçiyi bir önceki hücreye kaydır. |
| `+` | işaretçinin bulunduğu hücredeki baytı 1 arttır. |
| `-` | işaretçinin bulunduğu hücredeki baytı 1 azalt. |
| `.` | işaretçinin bulunduğu hücredeki baytı standart çıktı birimine yaz. |
| `,` | standart girdi biriminden bir baytlık girdi al ve bunu işaretçinin bulunduğu hücreye yaz. |
| `[` | eğer işaretçinin bulunduğu hücrenin değeri sıfırsa, `]` karakterinden sonraki komuta atla. |
| `]` | eğer işaretçinin bulunduğu hücrenin değeri sıfır değilse, önceki `[` karakterinden bir sonraki komuta atla. |

ayrıca bu komutların C programlama dilindeki karşılıkları şöyle gösterilebilir;

| komut | C karşılığı |
| --- | --- |
| `>` | `++ptr;` |
| `<` | `--ptr;` |
| `+` | `++(*ptr);` |
| `-` | `--(*ptr);` |
| `.` | `putchar(*ptr);` |
| `,` | `*ptr=getchar();` |
| `[` | `while (*ptr) {` |
| `]` | `}` |

Örnek
-----

### Hello World!

Aşağıdaki program ekrana "Hello World!" ve bir yeni satır yazmaktadır:

```
 
+++++ +++++ sayaca (sıfırıncı hücreye) 10 değerini ata
[ sıradaki dört hücreye 70/100/30/10 değerlerini atamak için döngü kullan
 > +++++ ++ birinci hücreye 7 ekle
 > +++++ +++++ ikinci hücreye 10 ekle
 > +++ üçüncü hücreye 3 ekle
 > + dördüncü hücreye 1 ekle
 <<<< - sayacın (sıfırıncı hücrenin) değerini düşür
] 
> ++. 'H' yaz
> +. 'e' yaz
+++++ ++. 'l' yaz
. 'l' yaz
+++. 'o' yaz
> ++. ' ' yaz
<< +++++ +++++ +++++. 'W' yaz
>. 'o' yaz
+++. 'r' yaz
----- -. 'l' yaz
----- ---. 'd' yaz
> +. '!' yaz
>. '\n' yaz

```

Bu kod parçası, okunabilirliği sağlamak için satırlara bölünmüş, boşluklar ve yorumlar eklenmiştir. Brainfuck, sekiz komut karakteri `+-<>[],.` haricindeki tüm karakterleri yok sayar. Bu nedenle (eklenecek yorum, komut karakterleri içermediği sürece) koda yorum eklemek için özel bir söz dizimine ihtiyaç yoktur. Yukarıdaki kodun fazladan karakterlerden arındırılmış hâli aşağıdaki gibi görünecektir:

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

```

İlk satır `a[0] = 10`, dizinin ilk elemanına 0'dan başlayıp 10 kez artırarak ilk değerini atamaktadır. İkinci satırdan başlayan döngü, dizinin diğer elemanlarına değerler atamaktadır: a[1] = 70 ('H' harfinin ASCII kod değeri olan 72'ye yakın bir değer), `a[2] = 100` ('e' harfinin ASCII değeri 101'e yakın), `a[3] = 30` (boşluk karakterinin ASCII değeri 32'ye yakın) ve `a[4] = 10` (yeni satır karakteri). Döngü, işaretçiyi dizi elemanları üzerinde kaydırarak `a[0]`'ın değeri 10'u sırasıyla 7,10,3 ve 1'le çarpmaktadır. Döngü bittikten sonra `a[0]`, 0'a eşit olur.

Döngüden sonraki ilk satırda `>` karakteri işaretçiyi dizide bir eleman ilerletmekte, `++` dizi elemanının 70 olan değerini iki artırarak 72 yapmakta ve `.` karakteri de sonucu ekrana basmaktadır.