Bài viết này là một bài mồ côi vì không có bài viết khác liên kết đến nó. Vui lòng tạo liên kết đến bài này từ các bài viết liên quan; có thể thử dùng công cụ tìm liên kết. (tháng 8 năm 2020) |
Brainfuck là một ngôn ngữ lập trình được rất ít người biết đến. Nó được thiết kế để thử thách cũng như làm trò giải trí cho các lập trình viên và không thích hợp cho người mới tập. Trong một số tài liệu, tên của ngôn ngữ này được viết là brainf*ck hay brainfsck, không được viết hoa dù brainfuck là một danh từ riêng.[1]
Urban Muller thiết kế brainfuck vào năm 1993 với mục đích tạo ra ngôn ngữ lập trình sử dụng công cụ biên dịch nhỏ nhất có thể, công cụ biên dịch 1024 byte theo ngôn ngữ lập trình FALSE hoặc một số dạng khác dưới 200 byte. Phiên bản Muller 2.0 chứa công cụ biên dịch Amiga.
Bao gồm 8 ký tự:
>:Đẩy con trỏ qua ô nhớ tiếp theo (ô nhớ bên phải). <:Đẩy con trỏ về ô nhớ trước (ô nhớ bên trái). +:Tăng giá trị của ô nhớ hiện tại 1 đơn vị. -:Trừ giá trị của ô nhớ hiện tại 1 đơn vị. .:Trả về giá trị của ô nhớ hiện tại theo mã ASCII. ,:Đọc giá trị input và lưu vào ô nhớ hiện tại. [:Nhảy đến mã lệnh sau ký tự ] nếu ô nhớ hiện tại bằng 0. ]:Nhảy về ký tự [ nếu ô nhớ hiện tại khác không. (Cặp ký tự [ ] thực hiện cấu trúc lặp.)
Như tên gọi, brainfuck gây khó khăn cho trong việc đọc hiểu code. Một mặt là vì mã liệu là một chuỗi ký tự dài phức tạp, mặt khác là do chương trình không biểu hiện rõ các phần đọc, xử lý dữ liệu và ghi.
Sau đây là các ví dụ về chương trình viết bằng ngôn ngữ brainfuck:
Đoạn mã ví dụ: Đọc vào một số chữ cái latin viết thường và in ra chữ cái đó dạng viết hoa. Dữ liệu vào kết thúc bằng ký tự có mã ASCII bằng -1. ,+[---------------------------------.,+] Đầu tiên, con trỏ đang ở ô nhớ số 0. Đọc vào ký tự đầu, cộng mã ASCII 1 đơn vị. Nếu ký tự đó là -1 thì a[0]=0, chương trình kết thúc, ngược lại thực hiện vòng lặp. Trừ đi 1 đơn vị, và trừ 32 đơn vị để giá trị được mã ASCII của ký tự in hoa.(Mã ASCII của 'A' là 65, của 'a' là 97). Mã lệnh '.' thực hiện xuất kết quả được lưu ở ô nhớ hiện tại tức ô nhớ 0. Tiếp tục đọc ký tự tiếp theo tăng 1 đơn vị. Nếu ký tự tiếp theo là -1 thì a[0]=0 vòng lặp kết thúc.
Chương trình sau sẽ viết ra chữ 'd':
++++++++++[>++++++++++<-]>.