Brainfuck

Vikipedi, özgür ansiklopedi
Atla: kullan, ara

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 (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[değiştir | kaynağı değiştir]

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[değiştir | kaynağı değiştir]

Hello World![değiştir | kaynağı değiştir]

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
    > +++++ ++              1. hücreye 7 ekle
    > +++++ +++++           2. hücreye 10 ekle
    > +++                   3. hücreye 3 ekle
    > +                     4. 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.