Brainfuck

Bách khoa toàn thư mở Wikipedia
Bước tới: menu, tìm kiếm

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]

Thiết kế ngôn ngữ[sửa | sửa mã nguồn]

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.

Mã lệnh[sửa | sửa mã nguồn]

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.

Ví dụ[sửa | sửa mã nguồn]

Sau đây là các ví dụ về chương trình viết bằng ngôn ngữ brainfuck:

Upcase[sửa | sửa mã nguồn]

Đ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ữ 'd'[sửa | sửa mã nguồn]

Chương trình sau sẽ viết ra chữ 'd':

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

Tham khảo[sửa | sửa mã nguồn]

Liên kết ngoài[sửa | sửa mã nguồn]