Brainfuck là một ngôn ngữ lập trình hiếm gặp, được thiết kế để thách thức và giải trí cho lập trình viên, không phù hợp với người mới bắt đầu. Tên ngôn ngữ này đôi khi được viết là brainf*ck hoặc brainfsck mà không viết hoa, mặc dù brainfuck là danh từ riêng.
Thiết kế ngôn ngữ
Urban Muller phát triển brainfuck vào năm 1993 với mục tiêu tạo ra ngôn ngữ lập trình với trình biên dịch nhỏ gọn nhất, chỉ 1024 byte hoặc dưới 200 byte cho một số phiên bản khác của ngôn ngữ lập trình FALSE. Phiên bản Muller 2.0 bao gồm trình biên dịch Amiga.
Mã lệnh
Gồm 8 ký tự:
>: Di chuyển con trỏ đến ô nhớ bên phải.
<: Di chuyển con trỏ đến ô nhớ bên trái.
+: Tăng giá trị của ô nhớ hiện tại lên 1 đơn vị.
-: Giảm giá trị của ô nhớ hiện tại đi 1 đơn vị.
.: Xuất giá trị của ô nhớ hiện tại dưới dạng mã ASCII.
,: Đọc giá trị đầu vào và lưu vào ô nhớ hiện tại.
[: Nhảy đến lệnh sau ký tự ] nếu ô nhớ hiện tại bằng 0.
]: Quay lại ký tự [ nếu ô nhớ hiện tại khác 0.
(Cặp ký tự [ ] thực hiện cấu trúc lặp.)
Tên gọi của brainfuck khiến việc đọc hiểu mã trở nên khó khăn. Mã lệnh là một chuỗi ký tự dài và phức tạp, và chương trình không rõ ràng trong việc phân chia các phần đọc, xử lý dữ liệu và ghi.
Ví dụ
Dưới đây là các ví dụ về chương trình viết bằng ngôn ngữ brainfuck:
Upcase
Chương trình biến chữ cái latin thường thành chữ cái viết hoa. Dữ liệu kết thúc khi gặp ký tự có mã ASCII -1. Ban đầu, con trỏ ở ô nhớ số 0. Đọc ký tự đầu, tăng mã ASCII thêm 1. Nếu ký tự là -1, gán a[0]=0 và kết thúc chương trình; nếu không, tiếp tục vòng lặp: giảm 1 và trừ 32 để lấy mã ASCII chữ hoa. Mã lệnh '.' xuất giá trị ở ô nhớ hiện tại. Tiếp tục đọc ký tự tiếp theo và tăng 1 đơn vị. Nếu ký tự tiếp theo là -1, gán a[0]=0 và kết thúc vòng lặp.
Chữ 'd'
Chương trình dưới đây sẽ xuất chữ 'd':
++++++++++[>++++++++++<-]>.
Liên kết ngoài
- Trang Brainfuck trên DMOZ
- Trang Brainfuck trên wiki Esolang (Ngôn ngữ kỳ lạ)