Brainfuck Bahasa Pemrograman Yang Unik Dan Aneh
Masih sedikit blog berbahasa Indonesia yang membahas brainfuck. Sehingga saya menulis artikel ini untuk Anda yang ingin mempelajarinya. Bersiaplah untuk dibuat pusing dengan bahasa pemrograman yang satu ini. Brainfuck adalah salah satu bahasa pemrograman yang dibuat untuk menantang programmer. Bahasa ini hanya terdiri dari 8 perintah sederhana yang harus Anda hafal. Setelah Anda mempelajari bahasa pemrograman ini Anda akan mendapatkan konsep pemrograman yang baru.
Perintah dalam Bahasa Pemrograman Brainfuck
Seperti yang telah saya katakan di atas, brainfuck hanya terdiri dari 8 perintah sederhana. Berikut daftar perintah beserta penjelasannya:
> memindahkan data pointer ke kanan
< memindahkan data pointer ke kiri
. mencetak nilai sel
, meminta input dari user
+ menambah nilai sel dengan 1
– mengurangi nilai sel dengan 0
[ awal perintah loop
] akhir perintah loop
Program dalam brainfuck terdiri dari kumpulan sel yang panjang. Program dibuat dengan cara memanipulasi isi sel. Saat program pertama kali dijalankan maka seluruh sel akan bernilai nol dan data pointer ada di sel paling awal.
Program Sederhana dalam Brainfuck
Baiklah, kita akan mencoba membuat program sederhana. Ketikkan perintah berikut di brainfuck visualizer lalu jalankan atau klik run:
,.
Setelah Anda klik run maka akan muncul pesan “Waiting for input”. Masukkan angka atau huruf terserah kemudian tekan enter. Anda bisa melihat hasil keluaran di bagian “Output”. Maksud dari perintah di atas adalah program meminta input dari user dengan perintah ( , ) lalu menampilkan input dari user tadi dengan perintah ( . ). Bagaimana simple sekali bukan ? :D
Sekarang kita lihat bagaimana isi sel saat kita menjalankan program di atas. Program dimulai dengan semua isi sel adalah 0. Kita anggap sel pertama adalah sel 0. Simbol ( ^ ) menandakan data pointer saat ini. Saat program dijalankan maka data pointer akan berada di posisi paling awal. Berikut adalah gambaran sel 0 sampai 2.
| 0 | 0 | 0 |
—^————
Ketika perintah ( , ) dijalankan dan user memberikan input maka input dari user akan dimasukkan ke dalam sel 0. Misalnya user memberi input huruf ‘A’. Input huruf ‘A’ ini akan dimasukkan ke dalam sel 0 berupa kode ASCII dari ‘A’ yaitu 65.
| 65 | 0 | 0 |
—-^————-
Lalu perintah berikutnya yaitu ( . ) dijalankan. Perintah ini menampilkan isi sel saat ini yaitu sel yang ditunjuk oleh data pointer. Karena kita belum memindahkan data pointer maka data pointer tetap berada di sel 0 sehingga isi dari sel 0 akan dicetak. Isi dari sel 0 adalah angka desimal 65 dan saat dicetak akan menghasilkan huruf ‘A’.
Dari sini apakah Anda sudah mulai paham dengan cara kerja program brainfuck ? :) Pada program brainfuck kita bermain dengan sel, data pointer dan angka. Ayo kita buat program lainnya.
Hello World dalam Brainfuck
Belajar bahasa pemrograman baru selalu identik dengan mencetak kalimat ‘Hello World’. Kita akan mencoba membuat programnya dalam brainfuck. Pada penjelasan sebelumnya kita tahu bahwa karakter ‘A’ dicetak dari angka 65. Sehingga untuk mencetak ‘Hello World’ kita harus tahu kode ascii dari masing-masing huruf tersebut. Daftar lengkap kode ascii bisa Anda lihat di akhir posting.
H = 72
e = 101
l = 108
o = 111
Berikut adalah gambaran sel saat program pertama dijalankan. Data pointer menunjuk pada sel 0.
| 0 | 0 | 0 | 0 | 0 | 0 |
—^—————————-
Pertama kita akan mencetak huruf ‘H’. Kode ascii dari huruf ‘H’ adalah 72. Kita bisa menggunakan perintah ( + ) untuk menambahkan isi sel dengan 1. Berarti untuk mencapai angka 72 kita harus mengetikkan perintah ( + ) sebanyak 72 kali sampai tangan kita capek :D.
Disinilah kita perlu menggunakan looping. Ketikkan perintah berikut:
+++++ ++ [ > +++++ +++++ < – ]
Pertama kali Anda melihatnya pasti Anda bingung tentang bagaimana cara kerjanya. Kita akan memecahnya menjadi beberapa bagian
+++++ ++
Saat perintah ini dijalankan maka sel 0 akan berisi nilai 7.
| 7 | 0 | 0 | 0 | 0 | 0 |
—^—————————-
Brainfuck mengabaikan karakter selain ke 8 perintah. Anda bisa menggunakan spasi untuk memisahkan perintah sehingga lebih mudah dibaca. Untuk menambahkan komentar Anda cukup menuliskan komentar langsung.
Sel ke 0 ini akan kita gunakan untuk looping. Kita lihat pada perintah berikutnya:
[ > +++++ +++++ < – ]
Perintah ( [ ) akan mengecek apakah isi sel saat ini bernilai 0. Jika bernilai nol maka perintah setelah ( ] ) akan dijalankan. Jika tidak maka perintah setelah ( [ ) akan dijalankan. Karena nilai sel saat ini bukan 0 melainkan 7 maka perintah setelah ( [ ) akan dijalankan. Perintah setelah ( [ ) adalah ( > ) yang artinya pindahkan data pointer ke sel berikutnya. Sehingga data pointer menjadi seperti ini:
| 7 | 0 | 0 | 0 | 0 | 0 |
——–^———————–
Setelah perintah ( > ) ada perintah ( + ) sebanyak 10 kali. Artinya kita menambahkan isi sel saat ini dengan 1 sebanyak 10 kali. Sehingga nilai sel saat ini berubah menjadi:
| 7 | 10 | 0 | 0 | 0 | 0 |
——–^———————–
Kemudian perintah ( < ) dijalankan. Arti dari perintah ini adalah memindahkan data pointer ke kiri.
| 7 | 10 | 0 | 0 | 0 | 0 |
—^—————————-
Setelah perintah ( < ) ada perintah ( – ) yang artinya kurangkan nilai sel saat ini dengan 1. Sehingga isi sel menjadi seperti berikut:
| 6 | 10 | 0 | 0 | 0 | 0 |
—^—————————-
Perintah berikutnya adalah ( ] ). Perintah ini akan mengecek apakah sel saat ini bernilai 0. Jika bernilai 0 maka perintah setelah ( ] ) akan dijalankan. Jika tidak maka perintah setelah ( [ ) yang akan dijalankan. Karena nilai sel saat ini bukan 0 melainkan 6 maka perintah setelah ( [ ) akan dijalankan. Dari sini kita mulai menjalankan perintah yang sama dari awal. Disinilah bagian loopingnya. Perintah yang saya tulis di atas akan dijalankan sampai sel ke 1 bernilai 70.
+++++ ++ [ > +++++ +++++ < – ]
Setelah dijalankan maka sel 1 akan bernilai 70 dengan data pointer berada di sel ke 0.
| 0 | 70 | 0 | 0 | 0 | 0 |
—^—————————–
Gunakan Brainfuck Visualizer untuk memudahkan dalam melihat isi sel secara realtime. Geser delay ke kanan sehingga program divisualisasikan dengan lambat dan memudahkan Anda untuk melihat perubahan sel.
Kode ascii huruf ‘H’ adalah 72. Dari sini mungkin Anda sudah tahu apa yang harus kita lakukan selanjutnya. Gunakan perintah ( > ) untuk memindahkan data pointer ke kanan dan perintah ( + ) untuk menambahkan nilai sel sebanyak 2 kali. Lalu gunakan perintah ( . ) untuk mencetak huruf ‘H’. Program lengkapnya adalah sebagai berikut:
+++++ ++ [ > +++++ +++++ < – ] > ++ .
Kondisi sel saat program dijalankan
| 0 | 72 | 0 | 0 | 0 | 0 |
———^————————
Setelah program dijalankan maka akan tercetak huruf ‘H’.
Sekarang giliran Anda. Cobalah untuk mencetak huruf berikutnya sampai menjadi kalimat ‘Hello World’. Berikut ini adalah contoh program saya.
+++++++[>++++++++++<-]>++.<+++[>++++++++++<-]>-.+++++++..+++.>+++[>++++++++++<-]>++.<+++++[>++++++++++<-]>+++++.<++[>++++++++++<-]>++++.+++.——.——–.
+++++ ++ 0 : isi sel 0 dengan 7
[ > +++++ +++++ < – ] 0: lakukan looping untuk menghasilkan nilai 70 pada sel 1
> ++ . 1: pindah ke sel 1 lalu cetak huruf ‘H’
< +++ 0: pindah ke sel 0 dan isi nilai 3
[ > +++++ +++++ < – ] 0: looping untuk mengisi nilai sel 1 dengan 30
> – . 1: isi sel 1 adalah 72 ditambah 30 = 102 kurangkan dengan 1 untuk menghasilkan kode ascii ‘e’ yaitu 101 lalu cetak huruf ‘e’
+++++ ++ .. 1: tambahkan 7 untuk mencetak huruf ‘l’ 2 kali
+++ . 1: tambahkan 3 untuk mencetak huruf ‘o’
> 2: pindah ke sel 2
+++ 2: tambahkan 3
[ > +++++ +++++ < – ] 2: looping untuk mengisi sel dengan nilai 30
> ++ . 3: tambahkan 2 dan cetak spasi (kode ascii 32)
< +++++ 2: tambahkan 5 pada sel 2
[ > +++++ +++++ < – ] 2: looping untuk mendapat nilai 50 dan ditambahkan dengan nilai sel 3 sebelumnya yaitu 32 sehingga menjadi 82
> +++++ . 3: pindah ke sel 3 lalu tambahkan 5 menjadi 87 untuk mencetak huruf ‘W’
< ++ 2: pindah ke sel 2 tambahkan dengan 2
[ > +++++ +++++ < – ] 2: lakukan looping untuk mendapat nilai 20 dan tambahkan dengan nilai sebelumnya 87 menjadi 107
> ++++ . 3: pindah ke sel 3 tambahkan dengan 4 cetak ‘o’
+++ . 3: tambahkan dengan 3 cetak ‘r’
—– – . 3: kurangkan dengan 6 lalu cetak ‘l’
—– — . 3: kurangkan dengan 8 cetak d
Bagaimana untuk Membuat Program yang lain ?
Brainfuck juga bisa digunakan untuk membuat program if-else, switch dan bisa menyelesaikan banyak sekali masalah pemrograman. Untuk program yang lain mungkin akan saya tulis pada artikel terpisah. Atau mungkin Anda sudah bisa membuat program yang lain ? Silahkan berkreasi :)
Sumber :
Brainfuck Visualizer https://ashupk.github.io/Brainfuck/brainfuck-visualizer-master/index.html
Tabel ASCII http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters
Brainfuck http://en.wikipedia.org/wiki/Brainfuck