- 文档
- 教程
【免费下载链接】learnxinyminutes-docs
Code documentation written as code! How novel and totally my idea!
本篇技术指南基于 learnxinyminutes-docs 仓库中的 it/bf.md(意大利语翻译版)及其英文源文档 bf.md,系统讲解 Brainfuck 这门极简、图灵完备的编程语言:它的内存模型、8 条核心指令、循环语义,以及三个可直接运行的示例程序。读完本文,你将能够读懂并手写 Brainfuck 程序,理解乘法等经典算法的实现套路,并具备在其他语言中实现一个 Brainfuck 解释器的完整理论基础。
Brainfuck 是什么:8 条指令的图灵完备语言
Brainfuck 是一门极其极简的编程语言:整个语言只有 8 条指令,却具备图灵完备(Turing equivalente)的表达能力,即它能模拟任何可计算函数。它的名字本身就暗示了这门语言“反直觉、难读”的社区定位——正因为它几乎没有语法糖,阅读和编写 Brainfuck 程序本身就是一种思维挑战。
在 learnxinyminutes-docs 仓库中,英文源文档与包括 意大利语、西班牙语、简体中文、法语、德语 等在内的十余种语言翻译共同构成了该语言的教学入口,其核心篇幅均是一段可直接执行的.bf代码块,符合本仓库“以带注释的合法代码讲解语言”的整体风格(见 README.md)。
提示:你可以在浏览器中直接尝试运行 Brainfuck 程序(如在线 Brainfuck 可视化工具),或使用本仓库 it/bf.md 中提到的 brainfuck-visualizer 逐步观察指针与单元格的变化。
内存模型:30,000 个单元格与一个数据指针
Brainfuck 的运行时模型极为简单,只有两个组成部分:
- 一个由 30,000 个单元格组成的数组,所有单元格初始值均为 0;
- 一个数据指针(data pointer),指向当前正在操作的单元格。
你可以把整个模型想象成一条无限延伸(标准实现中为 30,000 格)的纸带,指针在上面左右移动,程序只能通过指针“看见”当前这一个单元格。所有计算都建立在这条纸带与指针之上。
除 8 条指令以外的任何字符都会被忽略(不含引号)。这意味着 Brainfuck 程序天然具备“注释自由”——你可以在代码中随意穿插说明文字,解释器不会报错。这也是本仓库文档能直接把整篇教程写进.bf代码块的原因:教程文字本身就是合法的 Brainfuck 源码。
8 条指令速查表
这是 Brainfuck 的全部指令集,也是整个语言的全部语法:
| 指令 | 作用 |
|---|---|
+ | 当前单元格的值加 1 |
- | 当前单元格的值减 1 |
> | 指针移到右侧下一个单元格 |
< | 指针移到左侧前一个单元格 |
. | 以 ASCII 字符形式打印当前单元格的值(例如 65 = 'A') |
, | 从输入读取一个字符,存入当前单元格 |
[ | 若当前单元格值为 0,则跳转到与之配对的]之后;否则执行下一条指令 |
] | 若当前单元格值为 0,则继续执行下一条指令;否则回跳至与之配对的[处 |
其中[与]共同构成一个while 循环:[是循环入口(条件判断),]是循环出口(回跳)。二者必须成对匹配、保持平衡——每一个[都必须有对应的],否则程序行为不可定义。
理解这套指令只需要抓住一个核心心智模型:+/-改变数值,>/<移动指针,[/]控制流程,./,负责 I/O。其余一切(变量、函数、算术)都要靠这 8 个符号手工组合出来。
实战示例一:打印字母 'A'
先看第一个经典程序:
++++++ [ > ++++++++++ < - ] > +++++ .逐步拆解这段代码的执行过程:
- 初始化循环计数:
++++++把单元格 #1 的值从 0 增加到 6。单元格 #1 将作为循环计数器使用。 - 进入循环(
[处 #1 = 6 ≠ 0,满足条件):>移动到单元格 #2;++++++++++把 #2 的值增加 10;<回到单元格 #1;-把 #1 的值减 1。 - 循环重复:由于
]检测到 #1 仍非 0,回跳到[再次执行。循环体共执行6 次——#1 需要被递减 6 次才能归 0,归 0 后]处判断为 0,跳过循环继续执行。 - 计算结果:此时指针位于 #1(值为 0),而 #2 的值为 60(6 × 10)。
>移动到 #2,+++++再增加 5,得到65。 - 输出:
.打印当前单元格的 ASCII 字符,65 对应大写字母'A'。
这个程序展示了 Brainfuck 最重要的编程范式:用计数器单元格控制循环次数,把循环体作为“乘法器”批量累加数值。6 × 10 + 5 = 65,恰好是 'A' 的 ASCII 码。
实战示例二:字符复制程序
第二个程序实现了“读入一个字符并原样输出”:
, [ > + < - ] > .执行过程:
,从用户输入读取一个字符,存入单元格 #1(其 ASCII 码值成为 #1 的初始值)。- 进入循环:
>移到 #2,+使 #2 加 1,<回到 #1,-使 #1 减 1。 - 循环持续进行,直到 #1 被递减为 0——此时#2 恰好保存了 #1 的原始值。这是典型的“通过递减原值来复制”技巧。
- 循环结束时指针停在 #1,
>移到 #2,.以 ASCII 形式打印出复制的字符。
注意:代码中的空格纯粹为了可读性,Brainfuck 解释器会忽略它们。同一个程序完全可以压缩成:
,[>+<-]>.这一行与上面带空格的版本完全等价——这也再次印证了“非指令字符一律忽略”的规则。
实战示例三:两数相乘
第三个程序稍复杂,用来消化前面的所有概念:
,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >>这个程序读取两个数字作为输入,并输出它们的乘积。算法结构如下:
,>,<:依次读取两个输入存入单元格 #1、#2,然后指针移回 #1。- 外层循环以单元格 #1 为条件:
[判断 #1 是否为 0;>移到 #2。 - 内层循环以单元格 #2 为条件:
[判断 #2 是否为 0,循环体内>+ >+ << -把单元格 #3 和 #4 各加 1,然后回到 #2 并递减——内层循环每轮执行一次,相当于把 #3 累加 #2 的值。 - 关键问题与解法:内层循环结束时 #2 已被递减为 0,若直接进入下一轮外层循环,内层将因条件为 0 而不再执行。解决办法是同时递增单元格 #4,再通过
>> [- << + >>]把 #4 的值复制回 #2,从而“恢复”内层循环的计数器。 - 外层循环每执行一轮,相当于把“#2 的原始值”再累加一次到 #3。最终单元格 #3 中保存的就是两数之积,
>>移动指针后即可输出结果。
这个程序浓缩了 Brainfuck 编程中最重要的两个技巧:双计数器恢复法(用辅助单元格保存并恢复被循环消耗的计数)与寄存器搬运(把值在多个单元格之间复制)。它是理解 Brainfuck 复杂程序的基础模板。
从读懂到实现:解释器与更深层学习
至此,Brainfuck 的全部语法已经讲完——它确实“并不难”。接下来的挑战是:
- 写自己的 Brainfuck 程序:尝试用上面的范式实现加法、减法、阶乘或字符串反转。
- 用其他语言写一个 Brainfuck 解释器:解释器的核心逻辑只有几条——维护一个 30,000 格的数组、一个指针、一个指令位置,遇到
[/]时做括号匹配跳转即可,实现相当简单。 - 终极挑战:如果你追求极致,可以尝试用 Brainfuck 自己写一个 Brainfuck 解释器——这是社区公认的“自举”级练习。
在本仓库中,你可以交叉对照多种语言版本的同一教程来辅助理解,例如 英文版、简体中文版、西班牙语版、俄语版 等;仓库根目录下的 CONTRIBUTING.md 还说明了这类教程文档的元数据规范(frontmatter 中的name、filename、contributors、translators字段,以及 lint/frontmatter.py 对这些字段的校验规则)——如果你想为某个语言撰写同类教程,可以参照这些规范。此外,lint/encoding.sh 保证了所有文档均以 UTF-8 编码存储,包括本教程中的特殊字符。
结语
8 条指令、30,000 个单元格、一个指针——这就是 Brainfuck 的全部。它用最小的语法展示了循环、计数、复制、乘法等编程核心概念的底层形态,是理解“图灵完备”与“计算本质”的绝佳教材。从打印 'A' 到实现乘法,再到用 Brainfuck 写解释器,这条路本身就是一场关于计算极限的趣味实验。
- 文档
- 教程
【免费下载链接】learnxinyminutes-docs
Code documentation written as code! How novel and totally my idea!
相关推荐
Brainfuck 极简语言实战指南 —— 从 Learn X in Y minutes 学透 8 指令图灵完备编程
Brainfuck 极简语言实战指南 —— 从 Learn X in Y minutes 学透 8 指令图灵完备编程 Brainfuck 是编程语言家族中最极端
文档教程Learn X in Y Minutes 仓库中的 Brainfuck 教程:八条指令构建的图灵完备语言
Learn X in Y Minutes 仓库中的 Brainfuck 教程:八条指令构建的图灵完备语言 导读 :本文以 learnxinyminutes do
文档教程Learn X in Y minutes:Brainfuck(BF)极简语言入门——8 条指令理解图灵完备
Learn X in Y minutes:Brainfuck(BF)极简语言入门——8 条指令理解图灵完备 Brainfuck 是编程史上指令数最少的语言之一,
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考