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