Brainf**k 是 Urban Müller 于 1993 年创造的极小化编程语言。它仅由八个指令组成,却具备完整的图灵完备性——可以模拟任何计算机算法。其设计哲学是“极简”,每个指令只有一个字符,使得解释器可以非常短小,但也因此代码可读性极低,常被用作编程挑战或 esolang 研究的经典案例。
Müller 最初设计 Brainf**k 的目标是构建一个最小的图灵完备语言,编译器可以小到 200 字节以下。名字来源于其代码的晦涩程度。后来涌现出大量优化器、解释器、甚至硬件实现。它直接启发了无数“极简语言”的设计,是 esoteric programming 社区的基石之一。
Brainf**k 程序拥有一段线性内存,通常 30,000 个字节,每个字节初始为 0,以及一个数据指针指向当前内存单元。另外有一个指令指针和输入输出流。所有操作均围绕指针和当前单元进行,数值溢出通常定义为模 256。
+++++ +++++ 将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 "!"
以下示例展示如何使用 Brainf**k 进行基本的算术运算。所有运算结果存储在指定内存单元中,并输出结果字符。
将 cell0 的值加到 cell1,结果存入 cell1,同时清空 cell0。
将 cell0 设为 5,cell1 设为 3 +++++ cell0 = 5 > +++ cell1 = 3 < 回到 cell0 [->+<] 将 cell0 的值转移到 cell1(cell1 += cell0,cell0 清零) >> 移动到 cell1 . 输出结果(ASCII 8,即退格符,此处仅作示例)
将 cell0 减去 cell1,结果存入 cell2。
将 cell0 设为 8,cell1 设为 3 ++++++++ cell0 = 8 > +++ cell1 = 3 <[->-<] cell0 减去 cell1,结果存到 cell2 >> 移动到 cell2 . 输出结果(ASCII 5)
将 cell0 乘以 cell1,结果存入 cell2。使用嵌套循环。
将 cell0 设为 4,cell1 设为 3
++++ cell0 = 4
> +++ cell1 = 3
<[ 外层循环:遍历 cell0
[->+<] 将 cell1 的值加到 cell2,并恢复 cell1
>+< 为下一轮准备
- cell0 减 1
]
>> 移动到 cell2
. 输出结果(ASCII 12,即换页符)
将 cell0 除以 cell1,商存入 cell2,余数存入 cell3。此示例仅展示整数除法逻辑。
将 cell0 设为 10,cell1 设为 3
++++++++++ cell0 = 10
> +++ cell1 = 3
<[ 循环:当 cell0 >= cell1 时
[->+<] 将 cell1 复制到临时区
>[-]< 清除
>>+<< 商加1
-[>+<-] 从 cell0 减去 cell1
>[-]< 清除临时
>+< 调整指针
]
>> 移动到商
. 输出商(ASCII 3)
,[.,]
读取一个字符并输出,重复直到输入结束。这是最简单的回显程序。
虽然指令很少,但编写复杂的 Brainf**k 程序需要巧妙利用循环和指针偏移。常用技巧包括:
- 清零当前格:[-]
- 复制单元格值:需要借助临时单元,例如 [->+<]
- 条件判断:利用嵌套循环或指针偏移模拟 if 结构。
网上有许多 Brainf**k 优化器和从高级语言编译到 Brainf**k 的编译器,适合进阶研究。
尽管 Brainf**k 不用于实际开发,但它对理解计算理论、有限状态机、指针操作和编译原理非常有帮助。在挑战中编写 Brainf**k 程序能极大锻炼逻辑思维与耐心,也是 esolang 社区的经典入门语言。