Brainfuck编程语言¶
Brainfuck是由8个符号组成的图灵完备语言。
注
这种语言有时被称为 brainf*ck
或 brainf**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语言。
彩蛋¶
+++++ +++++ [->+++++++>+++>++++++++++<<<] >+++.>++.>++++++++.+++.++ +++++.--------------- --.<.>+++++++++++ +++++++++.--- -------.+ +++++ .