代表遗留系统重建与复苏的 Perslis 机器渡鸦

运行时 · 遗留系统

让死掉的软件重获新生。

那款 30 年前、至今仍在支撑业务的二进制——被重建、原生运行,并在周围一切变化时持续运转。

摘要

在大多数公司里,某个角落都藏着一款再也没人看得懂的程序——没有源码、没有文档、当初写它的人也早已不在——而业务却依然离不开它。Perslis 能拿起那个二进制,重建它的运作方式,并让它在现代 Mac 上原生运行,无需虚拟机或 Wine。桌面二进制(DOS、Win16、Win32)直接在一个自研运行时上运行。更大型的服务器与大型机系统则通过它们的接口——API、终端、数据契约——来连接,而不是模拟。两种情况下模式都一样:先理解它,再运维它,然后让它保持可运维。

问题:比运维它的人还要古老的软件

遗留软件之所以失效,不是因为它糟糕——而是因为它不透明。它能用,但没人知道它怎么用的,于是没人敢碰它,于是它慢慢变成一颗地雷,整个业务都得踮着脚绕着走。常见的"解决方案"要么是彻底重写(昂贵、有风险、常常半途而废),要么是一件虚拟机博物馆展品(脆弱,而且也不会让人更懂这东西)。Perslis 走的是另一条路:重建那份丢失的理解,再从这份理解出发去运维。

"重建一个死掉的系统"意味着什么

一个 32 位的 Windows 程序是一个 PE32 文件——一种可移植可执行文件,它把机器码、所导入的 Windows API 以及内存布局打包成一种 Windows 能理解、而 macOS 不能理解的格式。Perslis 的运行时直接贯穿处理它:

  1. 解析 PE32 头,找到代码段、数据段与导入段。
  2. 重建导入树与调用图——程序调用了哪些 Windows API,以及它自身的例程如何相互连接。
  3. 把每一个被导入的 API 解析到 Perslis 对该调用的自有实现
  4. 重建程序所期望的运行环境,并把它的代码映射进虚拟内存。
  5. 直接在你的 Mac 上解释执行 x86 指令

它读取一个死掉的二进制并让它复活——没有源码、没有文档、没有 Windows,也没有在后台做翻译的模拟器。

01

理解

导入树、调用图、依赖关系——那套没人记录过的软件架构。

02

重建

自动检测并配备它所期望的运行时——DOS、Win32 或更重的引擎。

03

运行

二进制在 macOS 上原生执行。后台没有虚拟机,也没有要照看的窗口。

04

保持存活

把它封装成原生应用、监控它,并随着周围系统变化而维护它。

图 1 — 重建,而非模拟。理解先行;原生执行随之而来。

地图先行,运维随后。Perslis 在运行一个系统之前,先重建出它做了什么——这样"它能用"就带着一份解释。

一条诚实的边界

"运行任何遗留系统"会是一张空白支票,而我们不会开出它。以下才是 Perslis 真正能做什么的真实形状:

地图总是可以做到的。原生执行在桌面这一层是可以做到的。这个区分就是这份承诺诚实的版本——而它仍然是几乎没有别的东西具备的能力。

为什么这属于一个操作运行时

重建一个二进制不是花招——它是 Perslis 处处都在用的同一块肌肉:在你动手之前,先理解一个你没有构建过的系统。遗留软件只是那个极端情形,理解已经完全丢失。如果运行时能让一个死掉的 .exe 复活,那么你桌上的那些现代系统更是唾手可得。