跳转至

Brainfuck编程语言

Brainfuck是由8个符号组成的图灵完备语言。

这种语言有时被称为 brainf*ckbrainf**k ,甚至被简称为 BF

编程模型

如下图,有一条纸带和一个指针。纸带由格子组成,每个格子内包含一个整数,初始时,所有整数均为0。指针指向某个格子,表示对该格子进行操作。

纸带

对格子的操作包括:+-.,。其中 + 表示将该格子内的整数加1;- 表示将该格子内的整数减1;. 表示输出该格子内的内容,将格子内的整数作为ASCII码,输出对应的字符;, 表示输入内容到该格子,用户输入一个字符,则该格子的整数置为字符的ASCII码。

故输出字母 A的程序为

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++
.

A 的ASCII码为65,故将格子内整数加65次,然后用 . 输出,即可得到字符 A

对指针的操作包括:><。其中 > 表示将指针向右移动一个格子; < 表示将指针向左移动一个格子。

另外还有两个跳转指令,[] 。其中 [ 检查当前格子是否为0,若不是0,继续执行下一条指令;若是0,则向后寻找对应的 ] ,然后执行 ] 之后的指令。 ] 检查当前格子是否为0,若是0,继续执行下一条指令;若不是0,则向前寻找对应的 [ ,然后执行 [ 之后的指令。

例如

[
+++++
]
+

由于格子初始化为0,故程序遇到 [,格子为0,则跳过 ],执行 +,程序结束。

再例如

+
[
-
]
++

程序遇到 [,格子为1,继续执行下一条指令。- 将格子变为0。遇到 ],当前格子为0,继续执行下一条。最后执行两个 +,程序结束。

综上,BF的语法汇总如下

语法

符号 语义
> 指针加一
< 指针减一
+ 指针指向的字节的值加一
指针指向的字节的值减一
. 输出指针指向的单元内容(ASCII码)
, 输入内容到指针指向的单元(ASCII码)
[ 如果指针指向的单元值为零,向后跳转到对应的 ] 指令的下一指令处
] 如果指针指向的单元值不为零,向回跳转到对应的 [ 指令的下一指令处

相关软件

brainfuck-visualizer是一个可视化BF运行过程的网页软件。允许用户输入BF的程序,并逐步运行程序,观察每一步操作后纸带的状态。

这里记录了Urban Müller发布BF语言的原始编译器代码、编译器及相关例子。原始编译器代码包括汇编语言和C语言。

彩蛋

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

参考文献