🧠 Brainf**k

极简主义 · 图灵完备 · 八条指令的深奥语言

Brainf**k 是 Urban Müller 于 1993 年创造的极小化编程语言。它仅由八个指令组成,却具备完整的图灵完备性——可以模拟任何计算机算法。其设计哲学是“极简”,每个指令只有一个字符,使得解释器可以非常短小,但也因此代码可读性极低,常被用作编程挑战或 esolang 研究的经典案例。

历史与设计

Müller 最初设计 Brainf**k 的目标是构建一个最小的图灵完备语言,编译器可以小到 200 字节以下。名字来源于其代码的晦涩程度。后来涌现出大量优化器、解释器、甚至硬件实现。它直接启发了无数“极简语言”的设计,是 esoteric programming 社区的基石之一。

内存模型

Brainf**k 程序拥有一段线性内存,通常 30,000 个字节,每个字节初始为 0,以及一个数据指针指向当前内存单元。另外有一个指令指针和输入输出流。所有操作均围绕指针和当前单元进行,数值溢出通常定义为模 256。

八条指令速查

>
指针右移
将数据指针指向下一个单元格
<
指针左移
将数据指针指向上一个单元格
+
当前格加1
当前单元格数值增加1
-
当前格减1
当前单元格数值减少1
.
输出字符
将当前单元格数值作为ASCII字符输出
,
读取输入
从标准输入读取一个字节存入当前单元格
[
循环开始
若当前格为0,则跳转到匹配的 ] 之后
]
循环结束
若当前格非0,则跳转回匹配的 [ 之后

示例代码

输出 “HI!” 的示例

+++++ +++++    将cell0设为10
[              开始循环
-              cell0减1
> +++++ ++     cell1加7
> +++ <<       cell2加3
]              结束循环,此时cell0 = 0,cell1 = 70,cell2 = 30
> ++ .         cell1加2,等于72,输出ASCII "H"
+ .            cell1加1,等于73,输出ASCII "I"
> +++ .        cell2加3,等于33,输出ASCII "!"
输出:HI!

四则运算示例

以下示例展示如何使用 Brainf**k 进行基本的算术运算。所有运算结果存储在指定内存单元中,并输出结果字符。

加法

将 cell0 的值加到 cell1,结果存入 cell1,同时清空 cell0。

将 cell0 设为 5,cell1 设为 3
+++++          cell0 = 5
> +++          cell1 = 3
<             回到 cell0
[->+<]        将 cell0 的值转移到 cell1(cell1 += cell0,cell0 清零)
>>            移动到 cell1
.             输出结果(ASCII 8,即退格符,此处仅作示例)
加法结果:8(非可打印字符,逻辑值为8)

减法

将 cell0 减去 cell1,结果存入 cell2。

将 cell0 设为 8,cell1 设为 3
++++++++       cell0 = 8
> +++          cell1 = 3
<[->-<]        cell0 减去 cell1,结果存到 cell2
>>            移动到 cell2
.             输出结果(ASCII 5)
减法结果:5

乘法

将 cell0 乘以 cell1,结果存入 cell2。使用嵌套循环。

将 cell0 设为 4,cell1 设为 3
++++           cell0 = 4
> +++          cell1 = 3
<[            外层循环:遍历 cell0
    [->+<]    将 cell1 的值加到 cell2,并恢复 cell1
    >+<       为下一轮准备
    -          cell0 减 1
] 
>>            移动到 cell2
.             输出结果(ASCII 12,即换页符)
乘法结果:12

除法

将 cell0 除以 cell1,商存入 cell2,余数存入 cell3。此示例仅展示整数除法逻辑。

将 cell0 设为 10,cell1 设为 3
++++++++++     cell0 = 10
> +++          cell1 = 3
<[            循环:当 cell0 >= cell1 时
    [->+<]    将 cell1 复制到临时区
    >[-]<     清除
    >>+<<     商加1
    -[>+<-]   从 cell0 减去 cell1
    >[-]<     清除临时
    >+<       调整指针
]
>>            移动到商
.             输出商(ASCII 3)
除法结果:商为 3,余数为 1

无限循环与输入复制

,[.,]

读取一个字符并输出,重复直到输入结束。这是最简单的回显程序。

学习资源与技巧

虽然指令很少,但编写复杂的 Brainf**k 程序需要巧妙利用循环和指针偏移。常用技巧包括:
- 清零当前格[-]
- 复制单元格值:需要借助临时单元,例如 [->+<]
- 条件判断:利用嵌套循环或指针偏移模拟 if 结构。
网上有许多 Brainf**k 优化器和从高级语言编译到 Brainf**k 的编译器,适合进阶研究。

为什么学习 Brainf**k?

尽管 Brainf**k 不用于实际开发,但它对理解计算理论、有限状态机、指针操作和编译原理非常有帮助。在挑战中编写 Brainf**k 程序能极大锻炼逻辑思维与耐心,也是 esolang 社区的经典入门语言。

打开在线工坊 Esolang 维基