News Hacker|极客洞察

127 67 天前 github.com
🤯Z80 Sans:将 Z80 反汇编器实现为字体
既然字体能跑程序,为什么不把操作系统做成字体?

🎯 讨论背景

Z80 Sans 是一项把 Z80 反汇编逻辑编码到字体中的创意项目,展示了把字节→字形映射与机器码→指令映射相结合的另类实现方式。讨论把该作品放进更大的“把字体或文档当作可执行容器”的潮流里,引用了把 Tetris、Doom 或甚至 LLM 嵌入字体/ PDF 的先例。技术争论集中在实现机制与可移植性上:有人把 WebAssembly、OpenType、HarfBuzz 等混为一谈,而评论中对 HarfBuzz 的实验性 wasm 支持与主流浏览器构建的缺省行为做了澄清。评论者还从复古处理器(如 6502、8051)和 zmachine(用于运行 Zork 的虚拟机)等具体例子出发,讨论可行性、复杂度与查看器/渲染栈的限制。

📌 讨论焦点

创意与幽默感

评论普遍对把反汇编器做成字体的创意表示赞赏,认为这种把解析、处理和渲染合并为一步的做法既滑稽又机智。多条评论用了“让人会心一笑”“当天最有趣的东西”等表述来表达对作品的喜爱与佩服。有人还把自己的复古 Z80 项目拿来比较,认为该作品把玩乐性和工程巧思结合得很到位。

[来源1] [来源2] [来源3]

字体作为可执行媒介(嵌入游戏、LLM、WASM)

多人把 Z80 Sans 放在已有的“把字体/文档当作运行容器”的例子链条里讨论,列举了把 Tetris 做成字体、把字体做成 LLM、以及在 PDF 里实现 Tetris 与 Doom 的先例。还提到过带内置语法高亮的字体,说明字体不仅能承载视觉替代字形,也能被改造为承载程序逻辑的载体。Z80 Sans 因此被看作是这一类创意工程的延续或变体——把渲染层当作计算层来玩。

[来源1] [来源2] [来源3]

实现机制与浏览器支持的技术澄清

有评论提到可以“写成 Rust 然后借助 OpenType 执行 WebAssembly”作为捷径,但另一条评论做了技术纠正并指出实际情况更细致:并非 OpenType 本身在通用浏览器中执行 wasm,而是 HarfBuzz(开源文本排版/成型引擎)存在一个实验性扩展可运行 wasm。该扩展在 Chrome/Firefox 的 HarfBuzz 构建中通常未启用,因此依赖它的字体可执行性并非通用特性。这个澄清说明把交互逻辑放入字体在不同渲染栈上的可用性和风险差别很大。

[来源1] [来源2]

字节到字形的对应与不同 CPU 的实现难度

评论指出把反汇编嵌入字体并非毫无道理:字体本质上是把字节映射到字形,而指令集则是把字节映射到指令,二者有天然的对应关系。具体实现难度依赖指令集的编码复杂度:Z80 含多字节/前缀编码增加了实现复杂性,而 6502 没有那类二字节操作码,因此在字体里实现或写反汇编器会简单得多;8051 也被认为可能更容易处理。也有回忆性评论提到早年尝试写 Z80 反汇编器时正是被多字节指令卡住,证明细节决定难度。

[来源1] [来源2]

PDF 作为可交互载体与 Z-machine 示例

讨论还扩展到用 PDF/PS 作为承载交互程序的先例:有评论提到 zmachine.ps 可以把 Zork I–III、Tristram Island 以及其它 z3 游戏打包到 PDF/PS 中(例如 calypso.z3)。评论指出某些 PDF 实现里存在 ad-hoc 的 JavaScript/执行路径,使得文档内能承载交互式程序,但并非所有查看器都会解析这些扩展,这带来可移植性与安全限制。基于此,有人建议下一步可以尝试把反汇编器嵌入 PDF,但同样要面对查看器差异与解析支持问题。

[来源1] [来源2] [来源3]

📚 术语解释

Z80: Z80(Zilog Z80,经典的 8 位微处理器),广泛出现在 1970s–1980s 的家用机与嵌入式设备中,指令集包含多字节与前缀编码,反汇编器需处理变长指令。

disassembler(反汇编器): disassembler(反汇编器):将机器码字节序列转换回可读汇编指令的工具,需要解析指令编码、前缀和操作数长度等细节。

WebAssembly (WASM): WebAssembly (WASM):一种为网页设计的低级字节码格式,可在浏览器中以接近原生速度运行代码,已被用于在非传统宿主(如字体或排版引擎)中嵌入可执行逻辑的实验。

HarfBuzz: HarfBuzz:开源的文本排版/字形成型引擎,负责复杂字体布局;评论中提到它有一个实验性扩展可在成型过程中运行 WebAssembly,因而能被滥用来在字体里执行代码。

OpenType: OpenType:一种字体文件与排版特性规范,支持替代字形、ligature、字距调整等高级功能;有人误以为 OpenType 原生支持在字体内执行 wasm,但实际可执行性多来自文本引擎的扩展而非规范本身。

Z-machine: Z-machine(Z-code 虚拟机):用于运行 Infocom 的文字冒险游戏(如 Zork)的虚拟机规范,项目如 zmachine.ps 曾把 Z-code 游戏嵌入到 PDF/PS 中实现文档内运行。