运行时 · 遗留系统
让死掉的软件重获新生。
那款 30 年前、至今仍在支撑业务的二进制——被重建、原生运行,并在周围一切变化时持续运转。
在大多数公司里,某个角落都藏着一款再也没人看得懂的程序——没有源码、没有文档、当初写它的人也早已不在——而业务却依然离不开它。Perslis 能拿起那个二进制,重建它的运作方式,并让它在现代 Mac 上原生运行,无需虚拟机或 Wine。桌面二进制(DOS、Win16、Win32)直接在一个自研运行时上运行。更大型的服务器与大型机系统则通过它们的接口——API、终端、数据契约——来连接,而不是模拟。两种情况下模式都一样:先理解它,再运维它,然后让它保持可运维。
问题:比运维它的人还要古老的软件
遗留软件之所以失效,不是因为它糟糕——而是因为它不透明。它能用,但没人知道它怎么用的,于是没人敢碰它,于是它慢慢变成一颗地雷,整个业务都得踮着脚绕着走。常见的"解决方案"要么是彻底重写(昂贵、有风险、常常半途而废),要么是一件虚拟机博物馆展品(脆弱,而且也不会让人更懂这东西)。Perslis 走的是另一条路:重建那份丢失的理解,再从这份理解出发去运维。
"重建一个死掉的系统"意味着什么
一个 32 位的 Windows 程序是一个 PE32 文件——一种可移植可执行文件,它把机器码、所导入的 Windows API 以及内存布局打包成一种 Windows 能理解、而 macOS 不能理解的格式。Perslis 的运行时直接贯穿处理它:
- 解析 PE32 头,找到代码段、数据段与导入段。
- 重建导入树与调用图——程序调用了哪些 Windows API,以及它自身的例程如何相互连接。
- 把每一个被导入的 API 解析到 Perslis 对该调用的自有实现。
- 重建程序所期望的运行环境,并把它的代码映射进虚拟内存。
- 直接在你的 Mac 上解释执行 x86 指令。
它读取一个死掉的二进制并让它复活——没有源码、没有文档、没有 Windows,也没有在后台做翻译的模拟器。
理解
导入树、调用图、依赖关系——那套没人记录过的软件架构。
重建
自动检测并配备它所期望的运行时——DOS、Win32 或更重的引擎。
运行
二进制在 macOS 上原生执行。后台没有虚拟机,也没有要照看的窗口。
保持存活
把它封装成原生应用、监控它,并随着周围系统变化而维护它。
图 1 — 重建,而非模拟。理解先行;原生执行随之而来。
一条诚实的边界
"运行任何遗留系统"会是一张空白支票,而我们不会开出它。以下才是 Perslis 真正能做什么的真实形状:
- 桌面二进制(DOS、Win16、Win32):强大的原生支持。这是核心场景,而且直接就能运行。
- 服务器与大型机(COBOL、AS/400):Perslis 通过接口——API、终端模拟、数据桥接——来映射并连接。它编排它们;它不是一个大型机模拟器。
- 遗留 Web 应用(经典 ASP、老旧 PHP):代码库与依赖会被映射并理解;能否运行取决于相应的运行时是否仍然存在。
- 嵌入式 / 固件:Perslis 能读取并分析代码,但执行它需要目标硬件或一个模拟器。
地图总是可以做到的。原生执行在桌面这一层是可以做到的。这个区分就是这份承诺诚实的版本——而它仍然是几乎没有别的东西具备的能力。
为什么这属于一个操作运行时
重建一个二进制不是花招——它是 Perslis 处处都在用的同一块肌肉:在你动手之前,先理解一个你没有构建过的系统。遗留软件只是那个极端情形,理解已经完全丢失。如果运行时能让一个死掉的 .exe 复活,那么你桌上的那些现代系统更是唾手可得。