为何高版本的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上,利用了这个特性的程序有可能在此失败。最后,兼容问题有没有希望解决呢?我觉得利用系统未公开的特性是黑客的天性,无止境的提要求也是用户的天性。完全没有兼容性的系统也是一个莫名其妙的所谓需求,因为系统之所以升级就是因为原有的系统不能满足要求。也就是之前的系统就是不完美的,你怎么能期望一个本来构建在不完美的系统上的软件在新环境中能完美呢?
■网友


推荐阅读