我做了一个用逻辑门搭建 CPU 的游戏
文章摘要
ChipBuilder 是作者 laurentiurad 发到 Show HN 的一个浏览器内数字电路建造游戏,副标题是「From Gates to CPUs(从门电路到 CPU)」,托管在他自己的 select.supply 站点上。帖子拿到 102 分、70 条评论。
作者在 Show HN 自述中写道:他做 ChipBuilder 是为了通过交互式谜题让计算机体系结构变得更可接近。你从 AND、OR、NOT 这些基础逻辑门开始,逐步把它们组合成加法器、多路选择器(MUX)、存储器、ALU,最终得到一颗完整的 CPU;硬件搭好之后,你可以写汇编程序,让它在你亲手造出来的处理器上运行。他明确说这个游戏的灵感来自 Nand2Tetris 这类课程,但所有东西都直接跑在浏览器里,配有可视化电路编辑器、仿真和难度递进的挑战。
站点首页把学习路径拆成四段:Logic Gates(AND、OR、NOT)、Circuits(加法器、MUX)、CPU Design(ALU、寄存器)、Programming(汇编、机器码)。编辑器早期版本采用工具模式切换的交互——顶部有 select(选择)、wire(连线)、delete(删除)三个按钮,需要先切模式再操作;还有一个 play 按钮控制仿真运行,以及一个 Run Tests 按钮用测试用例验证你的电路是否正确。这套交互几乎是评论区批评最集中的地方,作者在帖子期间就连续做了多轮修改(详见下文)。
需要说明的是,ChipBuilder 是一个明显处于早期阶段的作品。多位评论者报告:进度不会保存、刷新即丢;SR 锁存器关卡的测试与正确电路不符;到 memory 关卡之后测试形同虚设;Pipelining 关卡是一个完全空白的网格。作者对绝大多数功能性反馈都当场回应「会改」,并且在帖子还在首页时就上线了跳关功能和免切换模式的连线操作。
HN 评论精华
这条帖子的讨论有两条主线:一条是相当密集、相当具体的 UX 反馈(作者几乎全部接受并实时修复),另一条则是关于「vibe coding 出来的半成品该不该发 Show HN」的火药味争论。此外还牵出了一份相当完整的同类作品清单。
同类作品:Turing Complete 和 NANDGame 的强势刷屏
agent_z 的评论道出了很多人的心声:「我很好奇有人怎么会在从没听说过 NANDGame 或 Turing Complete 的情况下做出这样一个项目。」baron3dl 顺手贴了 nandgame.com 的链接,并说自己去年通关时惊讶于二十年没碰的大学课程内容回来了多少。ChickeNES 补了一串:「还有 Silicon Zeroes、MHRD,以及一堆做同一件事的游戏。」rsprinkle 直言:「哇,听起来和 Turing Complete 一模一样。」
dahart 给出了对 Turing Complete 最热情的背书:「超级好玩而且非常了不起。感觉像是把一年的计算机工程课程压缩进一周精心设计的游戏里。」他还记得有人用它造出了可工作的 32 位 RISC-V CPU。octobus2021 说他 14 岁的儿子在 Turing Complete 里走得更远,那游戏会教你如何「发明」汇编语言,之后还完成了几个挑战,比如写汇编程序让自己造的计算机控制一个机器人走出随机迷宫;他还提到该游戏作者沉寂近两年后重新开始更新,花两年从头重建了引擎,并且没有另立门户叫「Turing Complete 2」,而是作为一次破坏性更新直接发布。ksdme9 说他成功把侄子领进了这个游戏。sk1pper 分享了一条延伸路径:他在 Turing Complete 里造到可工作的 CPU,之后用 Verilog 实现了自己的 RV32I(最简 RISC-V 指令集)核心——只要保持简单的单周期设计,其实并不复杂、代码量也不大,他推荐所有想理解 CPU 的人做一遍;同时推荐 Ben Eater 的 6502 系列视频(在面包板上把 6502 接上 ROM 和 RAM,后来还做了个「世界上最差的显卡」)。
tda 推荐了 Sebastian Lague 的 Digital Logic Sim(从一个 NAND 门开始往上搭)。uranoxyd 提到 Zachtronics 的《Last Call BBS》里有个在硅片层面搭 IC 的小游戏。Elorth 推荐 Steam 上的 Hard Chip(从 NMOS 和 PMOS 开始)。xpct 和 vivzkestrel 都提到 jaso1024.com/mvidia 这个「同类但做法不同」的 GPU 版。dirkc 问 NANDGame 是不是 nand2tetris 的游戏化版本,falcor84 确认基本是,但停在 CPU 那一层(大约是课程的前半部分)。
「能不能再往下一层」
sebastiansm7 说他连不上输入和门,「我在 ChipCorp 的职业生涯止步于第 1 关」,并建议加一个第 0 关:用晶体管搭出门电路。azatom 接梗:「-1 关:用原子搭晶体管。-2 关:……」karolist 补完:「-4 关:引发一次大爆炸来生成时空基底。」jbgrt 则指出「你要找的游戏是 Turing Complete」。
UX 反馈:作者的实时迭代
这部分是本帖最有价值的工程内容。ura_yukimitsu 给出了最系统的一份清单:应该能从侧栏拖放元件到画布;连线不该是独立工具,应该支持拖放而不是分别点两个端点;应该能用 Delete 键删除选中的门,工具栏的 delete 按钮应该删除选中项而不是变成一个模式;网格图案和画布背景对比度不够;重叠元件移动有问题;画布无法平移;进度不保存也不能跳关。
AspisAiantos 补充了三点,其中第一条被不止一人提到:请务必给电路画布内所有元素加 user-select: none;——不然经常拖到的是被高亮选中的文本而不是元件。(azatom 一开始就单独指出了这个 CSS 问题。)wateralien 提出更激进的简化:根本不需要 select / wire / delete 三个状态,一个模式按上下文工作即可;play 按钮也去掉,永远保持仿真运行。splittydev 提议从连接点拖出连线、把线「拖走」再松手即删除,会直观得多。danbruc 补了两条:允许从汇点反向画到源点,允许连接输入端。shadab_khan_127 问为什么把连线按钮放顶部,能不能点圆点就触发连线。jodacola 希望能一边盯着测试用例一边摆弄逻辑门——现在每次切到测试标签再点画布,标签就自动切回去了。drob518 报告 iPad 上拖放不工作。rho4 说往下走三次点击就发现缺个返回按钮。
作者对这些几乎全部当场认领。他回复 wateralien「谢谢反馈,今天就实现」,对方稍后确认「刚看了,看起来不错」。Sohcahtoa82 说早期关卡的输入输出节点应该预先摆好,并希望能跳关——「我已经知道门和全加器怎么工作了,走一遍纯粹是苦役」,作者回复:「刚加了关卡跳转,另外现在不用手动切换 wire/select 按钮就能连线了。」1718627440 也提了跳关需求,作者同样应下。
Bug 报告:SR 锁存器和后半段的空洞
这部分暴露了游戏最实质的问题。namero999 说他用纯 NAND 门搭出了正确工作的 AND 门,但测试不通过。Kirby64 报告 SR 锁存器的逻辑也有问题:交叉耦合的 NOR 必须配成不合逻辑的样子才能通过测试并正确输出;他后来解释自己的做法是去掉一路交叉耦合(只让一个 NOR 连到另一个,而不是两路输出互连),然后就神奇地过了,「从逻辑角度完全说不通」。asterisk_man 苦笑着问他到底用了什么配置,「我大概是没法思考得足够不合逻辑」。
danbruc 给出了这个 bug 最靠谱的技术诊断:他也遇到了电路正确但测试失败、交换两个 NOR 门位置后才通过的情况,无法稳定复现,但他推测这与元件放置顺序、仿真器的更新顺序、以及测试的执行方式有关——NOR 反馈回路没有良定义的初始状态,很可能以依赖放置顺序的方式稳定下来,导致测试失败;也许 Q 已经是 1,而测试在使能 S 时寻找的是 0 到 1 的跳变。
Kirby64 还指出更严重的问题:「memory 之后就没有任何真正起作用的测试了,感觉那之后基本不存在。」他后来直接引用作者的 Show HN 原文(「最终得到完整 CPU,然后写汇编在上面运行」)并断言:「不,你做不到。一旦到了 memory 就再也没有任何有效测试,实际上无法继续。」prologic 的体验印证了另一半:他一路搭到全加器卡住,然后丢失了全部进度;他专门发帖问作者能不能加上进度保存以便下次继续。mrkO99 卡在 NAND 关,prologic 好心给了提示:NAND 就是 AND 加 NOT,两个输入都为 1 时输出 0,否则输出 1。anonymousiam 说去年玩过一个类似游戏,从 SSI 门开始搭触发器、寄存器、加法器、多路选择器很有趣(他几十年没做数字设计了),但到后期因为强制只能用特定变体的模块、还得为最终整合去适配它们而变得令人沮丧——他觉得这个游戏似乎有同样的限制。
关于 vibe coding 的争论
在 ura_yukimitsu 那条 UX 清单下面,artemonster 抛出了火药味最重的一条:「挺有意思,这种懒惰的垃圾是被一个『热爱精心打磨产品的软件工程师』vibecode 出来的。」他后来又单独发了一条「Slop。UI 非常糟糕」。orphea 接话:「我认得这个作者的昵称。这人在用 HN 推广他 vibecode 的项目。『passion』和『well-crafted』这两个词正在被主动贬值,真是可惜。」1718627440 提出了一个有意思的辩护角度:「『well-crafted』并不隐含任何关于功能集或易用性的承诺。」
vitorfblima 说「原谅我如果我说错了,但我实在看不下去『AI 美学』了」。作者的回应值得一读:「谢谢反馈!我很好奇是什么让你觉得是 AI 做的?我用 LLM 的经验是它们通常大量使用深色模式 + 霓虹 + 渐变,和你在我网站上看到的设计完全不一样。如果你能说说具体是哪些元素让你觉得是 vibecode 的,我会非常感激。」
争论在 aappleby 那里达到顶点。他连发两条:为什么顶部的「Browse」把我带到一个看起来像诈骗购物站的地方?Pipelining 关卡完全坏了——一整片空网格、没有任何可放置的元件,「你真觉得能在一个原理图编辑器里学会流水线?这是 vibe-code 出来的垃圾项目,没兴趣」;随后又追加:「天哪,我去了 ALU 例子,什么都没做,点了 Run Tests——你赢了。你根本没测过这东西吧?」
作者罕见地正面回击了:「我真的不欣赏这种 Reddit 式的刻薄态度,我通常不回应你这样的人和这类恶意信息,但这次我要回,因为你指控我诈骗别人,这是件大事。」他解释帖子谈的是游戏;点 Browse 看到的是一个精选产品集合,那些不是他自己在卖,网站不处理支付、不索取捐款;至于说 ALU 例子没有测试「就是撒谎」。他最后说:「对一个把前大厂员工身份和 GitHub 绿点挂在嘴边的人来说,在指控别人做违法的事之前应该更谦虚、多想两遍。」
Conscat 为这类作品做了一个中性的辩护(虽然是在别处的讨论里说的同类话):「早在 LLM 出现之前,我就能上传粗糙未打磨的业余游戏 demo 了。」
正面评价
尽管争议不小,喜欢它的人也不少。shadab_khan_127「我喜欢,挺好玩」;prologic「这很酷!我喜欢!看看我能不能过 NAND 关」;rezigned「真是个不错的项目」;hddambo「这太酷了!特别好的学习方式」,同时附议学习曲线偏陡、希望更有「游戏感」;astaka「如果 30 年前就有这个,我会爱上我的计算机科学课」;cadeos「好点子,赶紧拿给孩子们看」;jodacola「真的很酷,我玩得很开心」。
Joker_vD 借着 Sohcahtoa82「我已经知道全加器怎么工作了」那句,提出了一个真正有难度的后续问题:「但你知道 8 位 Kogge-Stone 加法器是怎么工作的吗?」他抱怨自己读过的大多数资料都很不友好,尤其「喜欢」维基百科那种不知从哪来的随机图示——文字讲黑盒和灰盒,图上却是红三角和黄三角;讲 Brent-Kung 加法器的条目里放的却是 Kogge-Stone 的图;有些图很明显根本不是文字所说的那样工作。
vivzkestrel 把这类站点归入了自己的收藏清单,并顺手推荐了 jaso1024.com/mvidia、nandgame.com 和展示雷达原理的 radarlaboratory.com。