為何高版本的windows有時不兼容某些低版本程序?


謝邀。

開始答題之前我先推薦一個博客和一本書。

一個是由微軟的老員工投稿編成的一個博客《The Old New Thing》The Old New Thing.

這個博客的內容其實就是吐槽各種Windows兼容問題(有時候是推卸責任)。

這個博客的內容曾經被編成一本書叫做《Windows編程啟示錄》ISBN: 9787111219194。

其實籠統的來說,不管是模擬還是一般的兼容性,這都涉及到一個問題就是系統的邊界。我們設計一個系統的時候會有需要關注的內容。但是你畢竟是要做一個實際能用的東西,所以你就被迫設計一些你其實不那麼關心的問題。但是你不那麼關心的問題未必其他人也不關心,也許對方還覺得很重要。

我舉個例子,你去買一盒章魚小丸子,本身你是很討厭芥末的,但是店員誤認為他和你關注的要點都是你需要一盒章魚小丸子。於是他沒問過你就直接撒了芥末粉。店員認為這只是一宗普通的買賣。你當時沒說什麼,走幾步見到一個垃圾桶順手就把整盒章魚小丸子都扔垃圾桶了。

所以設計Windows也有類似的情況。你認為你的產品需要有什麼就做什麼,銷售人員也只是挑選促進銷售的辭彙,但是用戶怎麼用你的產品你永遠意料不到。軟體開發者也是操作系統的用戶,他們研究操作系統是怎麼行為的,在其上構造可運行的程序。本來呢,微軟為系統編寫文檔,這些文檔不可能覆蓋掉所有的特性。程序員會躍躍欲試的試圖利用上系統的各種功能來實現他想要的東西。也許這些功能不在文檔中。有的時候文檔就是錯誤的。

當然,有些人也許會想,操作系統能不能實現一個切實的邊界,讓它只暴露出文檔描述了的功能?

首先這本身對系統的開發者來說是一個滑稽的想法,讓我用一個例子來解釋一下:按照Windows設計的介面,一個對QQ登陸框做鉤子記錄你的QQ密碼的程序是可以通過系統的標準的介面實現的(說是標準,但其實是為了實現向前的兼容性不得不兼容的細節)。但是QQ客戶端使用了一個沒有文檔說明的方式來防範這種密碼記錄行為(效果是QQ界面卡死,算是玉石俱焚吧)。

可能有些人覺得這種情形也很滑稽。不過我們很多時候防範的是一種惡意,有惡意的程序常常都可以通過正常程序需要的功能來作惡。

實際上光是通過公開的Windows功能是做不了殺毒軟體的,必須研究未公開的系統行為。

其次,實現一個切實邊界需要的工作太過細化,真正實施起來也許就是一個無限循環了。

這是因為在規劃系統的時候系統還沒設計出來(廢話),等設計出來之後已經無法再重新評估設計的到底是什麼了。具體來說,我們會在初期設計一個系統涉及些什麼,實習哪些功能,然後分模塊來將大的問題分成小的問題。每一個模塊照樣會有具體的各部分,在很多小細節都涉及到決策,但是在決定這些決策時是看不到決策對其他部分的影響的。即使你要做事後統計,這些繁雜的細節也不是軟體開發者願意去理解的。簡單來說,系統的細節就是無法管理的。

並不是所有的兼容性問題都是由於無法管理的細節導致的,有時候有些特性是之前決定應該有的,事後又認為不應該有。或者有時候需要在系統上橫切一刀實現新的特性。這些東西聽上去很傻,但是我要舉的例子都是為安全性考慮才做出的犧牲。

例如註冊表的問題。早期的文檔完全不會提到會有註冊表是無法寫只能讀,或者涉及到許可權的。這就是因為老的系統並沒有許可權的設計,軟體開發者如果總是假設註冊表總是可以寫的就有可能讓程序在這裡失敗。

例如不可執行內存執行的問題。經過一些細節上的痛苦抉擇,本來Windows中可讀的內存都是可以執行的。這一點使得很多有缺陷的軟體容易成為系統的缺口使得惡意行為得逞。隨著主流硬體的升級,Windows增加DEP特性解決了這個安全缺陷,原有的利用不可執行內存中可執行這一老系統特性的軟體會在此失敗。

老的Windows上一個程序總是可以修改另一個程序的外觀,或者模擬用戶操作。這當然是一個安全缺陷。在啟用了UAC的Windows上,利用了這個特性的程序有可能在此失敗。

最後,兼容問題有沒有希望解決呢?我覺得利用系統未公開的特性是黑客的天性,無止境的提要求也是用戶的天性。完全沒有兼容性的系統也是一個莫名其妙的所謂需求,因為系統之所以升級就是因為原有的系統不能滿足要求。也就是之前的系統就是不完美的,你怎麼能期望一個本來構建在不完美的系統上的軟體在新環境中能完美呢?


推薦閱讀:

interface引發的事件真相
寫c++好久不用new了,這是好的習慣嗎?
Git筆記——基本功能(上)

TAG:MicrosoftWindows | 操作系統 | 編程 | Windows應用軟體 | 軟體兼容 |