一枚 2MB ROM,来自 1991 年的 HP LaserJet 打印机扩展卡。三十多年后,它没有只躺在收藏柜里,而是被 pagetable 作者塞进 retro-ps 模拟器,在浏览器里继续解释 PostScript 文件。
这事反常,反常得有点好看。
我们已经习惯了软件短命:云服务改 API,网页应用换入口,旧客户端被登录、证书、订阅状态卡死。可这枚 HP C2089A “PostScript Cartridge Plus” 里的 Adobe 参考解释器,version 2010.118,今天还能对它负责的语言交付结果。
这枚 ROM 到底跑起来了什么
这不是 Adobe 官方发布的新产品,也不是把老打印机拍成怀旧视频。
retro-ps 做的是一件更窄、更硬的事:让 1991 年 LaserJet II/III 使用的 PostScript Cartridge Plus ROM,在现代模拟环境里运行。用户可以在命令行或浏览器里输入 .ps 文件,由客户端完成渲染,不需要服务器参与。
| 问题 | 答案 |
|---|---|
| ROM 来自哪里 | HP C2089A PostScript Cartridge Plus,面向 LaserJet II/III |
| 年份与容量 | 1991 年,2MB ROM |
| 里面是什么 | Adobe 自家的 PostScript Level 2 参考解释器,version 2010.118 |
| retro-ps 做什么 | 模拟运行这枚 ROM,支持命令行和浏览器端渲染 |
| 和 Ghostscript 有何不同 | Ghostscript 是替代实现;这里跑的是 Adobe 当年的参考实现本身 |
| 渲染在哪里发生 | 客户端,无服务器 |
今天当然有 Ghostscript。对大多数现代工作流,它更常用,也更现实。
但 retro-ps 的价值不在“又造了一个 PostScript 工具”。它有意思的地方是:跑起来的不是兼容实现,而是 Adobe 当年的参考解释器本体。
这也决定了它的边界。
它处理的是 PostScript Level 2 解释器问题,不是完整现代打印系统。不要把它想成现代 PDF 工作流的替代品,也不要把 PostScript 说成没有版本差异。更准确的说法是:这枚 ROM 对它当年的目标语言实现,仍然可复原、可运行、可验证。
还有一个现实限制:ROM 获取和版权不能被轻轻带过。项目展示的是模拟运行能力,不等于 ROM 可以随意分发。
对懂一点打印、排版、模拟器的人,这已经够有信息量。对做数字保存和基础设施的人,信息量更大:有些软件不是老了就死了,死的是它依赖的那套世界。
技术关键:它伪造了一台“够像”的 LaserJet
原来的 LaserJet III 不是一块孤立 ROM。
它有 Motorola 68000、8 MHz、1MB 系统内存,可扩展到 4MB。卡带 ROM 会映射进 CPU 地址空间,再通过内存映射寄存器和打印引擎通信。
retro-ps 手里没有完整打印机。它做的是给 ROM 造一个能骗过它的世界。
它模拟 M68K/68020 CPU,提供 16MB RAM;伪造 LaserJet 主板的软陷阱;提供打印机型号字节、IPC 字节流、引擎状态轮询;再假装打印引擎已经完成,让卡带内部状态机继续往下跑。
也就是说,它不是只“打开一个文件”。它是在重建 ROM 需要相信的环境。
| 原 LaserJet III 约束 | retro-ps 的处理 | 现实影响 |
|---|---|---|
| 300 DPI | 可提高 DPI | 可做更高分辨率渲染 |
| 固定纸张 | 可任意纸张 | 不再被老打印机纸路卡住 |
| 0.25 英寸硬件边距 | 可无边距 | 输出更自由 |
| 约 16000 像素轴向上限 | 仍受 ROM 限制 | Letter 纸约可到 1450 DPI |
这里要把分寸拿稳。
300 DPI、边距、纸张大小,很多属于当年打印机硬件边界。retro-ps 放宽的是外壳,不是把 PostScript Level 2 改造成新语言。
这对实际使用者意味着什么?
开发者可以把它当成一个复现老 PostScript 行为的工具,尤其适合测试、研究、数字保存。做生产环境的人则该谨慎:版权、输入文件安全、格式覆盖范围、现代 PDF/打印链路兼容性,都不能靠情怀抹平。
企业如果还有旧文档归档、旧排版文件、老系统输出的 .ps 文件,这类项目的价值在“能不能还原当年的解释行为”。但采购或迁移决策不该因此延后。它是研究和保存工具,不是打印基础设施采购建议。
真正刺痛今天软件的,是寿命差距
我更在意的不是“浏览器里跑老 ROM”这个炫技点。
真正刺眼的是寿命差距。
这枚 ROM 像老机器里的活化石。但它不是博物馆藏品,而是仍能执行契约的工业零件。输入是 PostScript,输出是栅格图。接口清楚,环境封闭,目标稳定。
契约还在,软件就没死透。
今天很多产品正好反过来。功能看着更强,依赖链却越来越长:云端账号、远程 API、权限服务、订阅状态、模型版本、浏览器策略、后台配置。任何一环变了,用户手里的“产品”都可能变形。
“天下熙熙,皆为利来。”这句放在这里并不是骂街。软件变短命,不只是工程师偷懒,而是激励变了。
云服务需要持续收费。平台需要控制入口。产品团队需要推动迁移。稳定、离线、可复现,很多时候不是 KPI,甚至会削弱平台控制力。
这就是老代码给今天的提醒:长期可用不是靠口号,是靠边界设计。
对开发者,最具体的动作不是去崇拜旧软件,而是少写模糊契约。文件格式、接口版本、离线能力、导出路径、降级策略,要提前说清。能稳定十年的接口,比一年三次“智能升级”更值钱。
对企业技术负责人,最该重估的是依赖风险。买一个云产品,不只是买功能,也是在买它的续约条件、接口稳定性、数据迁出难度和供应商心情。合同里写不清,系统里又不能离线跑,后面就会变成迁移成本。
这次 retro-ps 不证明旧软件天然更好。旧软件也有漏洞、版权、格式时代性和运行边界。它只说明一件事:边界窄、定义硬、环境可复原的软件,寿命会长得惊人。
接下来最该看的变量也很明确。
不是 retro-ps 能不能变成大众工具,而是这类项目能不能稳定复现更多老格式、老解释器、老运行环境;以及今天的新软件,愿不愿意给用户留下同样清楚的契约:离线能不能跑,数据能不能带走,版本变化能不能追溯。
如果这些问题都答不上来,产品再智能,也只是租来的雾。
一枚打印机 ROM 能穿过三十多年,不是因为它神奇。它只是守住了边界。今天的软件如果连这一点都做不到,热闹归热闹,寿命未必比一块老卡带更长。
