Windows 95 整合了 MS-DOS 與 Windows 應用程式,並將 API 集合從 16 位元升級到 32 位元,而微軟希望讓人們完全沒有理由不升級。有一個理由差點留存下來:Windows 3.x 版的《模擬城市》,其作者 Jon Ross 不小心留下了一個會讀取他剛釋放之記憶體的錯誤。在 Windows 3.x 上它運作正常,因為那塊記憶體從未真正被移走;在 Windows 95 測試版上,遊戲就壞了。由於銷量超過 500 萬份,《模擬城市》必須毫無差錯地運作。

微軟追查出這個錯誤,並在 Windows 95 中加入程式碼來尋找《模擬城市》;若發現遊戲正在執行,便以特殊模式執行記憶體配置器,不立即釋放記憶體。《模擬城市》並非孤例:Windows ADK 中的相容性系統管理員顯示了逐應用程式的修正資料庫。Windows NT 在偵測到通常隨《Final Fantasy VII》安裝的檔案時,會套用一個字面上名為「Win95VersionLie」的修正——單純告訴遊戲它是在 Windows 95 上執行——而《地城守護者》則獲得依「Horny.tif」等檔案為鍵的檔案路徑修正。

這種執念是制度性的。Raymond Chen 在 2005 年記載,Windows 95 的開發經理開著一輛皮卡車到當地的 Egghead Software 商店,買下店裡每一套 PC 程式各一份;每位開發人員認領最多兩套程式來安裝、執行並記錄錯誤,測試人員則可保留他們完成的程式。Maxis 前創意總監 Mike Perry 後來指出,Ross 離開 Maxis 後去了微軟工作。

相容性修補層:作業系統辨識出特定應用程式,並悄悄調整自身行為——延後釋放、版本謊言——讓舊的二進位檔永遠不會察覺任何改變。

作業系統升級的成敗取決於其應用程式目錄;使用者不會購買一個會弄壞他們既有遊戲與工具的作業系統。

修正每一個第三方廠商是不可能的,因此修補層讓微軟能在不碰任何人程式碼的情況下修復相容性。

以名稱或已安裝檔案來偵測應用程式,使每項修正保持精準,而非改變所有東西的行為。

對真實零售軟體進行大規模測試,在上市前把未知的不相容問題轉變成有記錄、可指派的工作清單。

向下相容可以逐個應用程式買到:模擬舊平台的錯誤——甚至其記憶體失誤——能消除所有不升級的藉口,並打破軟體的雞生蛋、蛋生雞問題。

Joel Spolsky 在 2000 年重述了《模擬城市》的故事,稱這是打破作業系統雞生蛋、蛋生雞問題的方法:「提供一個向下相容模式,看你怎麼看,它要嘛送來一整卡車的雞,要嘛送來一整卡車的蛋,然後蹺著二郎腿大賺一筆。」逐應用程式的修補層資料庫比 Windows 95 更長壽,至今仍可在 Windows 評定及部署套件中檢視。

追溯依據

參考來源

  1. Windows 95 went the extra mile to ensure compatibility of SimCity, other games Ars Technica · arstechnica.com ·