当前位置: 首页 > article >正文

Windows的兼容性为什么这么强大?

Windows最厉害的地方就在于,不管你在啥硬件上安装Win95,都能够正常运行,然后系统会自动更新驱动。相反,Linux在不同的电脑上运行,就会出现各种问题。

为什么Windows兼容性会如此强大?

我们先来看看Windows是如何做到兼容你的程序,当Windows通过控制启动时,Windows会链接到动态库上,给你的应用程序造成一种假象,感觉自己还在旧版本Windows上运行,这背后的技术原理叫做WinSxS(Windows Side By Side)。

在WinSxS目录下,有很多同名的DLL文件,这里需要说明的是,同名的DLL不是备份文件。在这个目录中,我们能够找到所有不同版本的DLL文件,这些DLL实际上是以前Windows或VS使用的某个函数所依赖的DLL。

譬如,Win7中包含的Vista;RDP(远程桌面)使用的组件ActiveX,ActiveX本身就是不在被推荐使用的组件了,但是至今仍被许多软件使用,如虚拟机监视器、各种远程桌面客户端、WSLg窗口等。同理,在Office 2024中还存在上个世纪出现的VB6。

WinSxS之所以存在,一方面是为了解决Windows中DLL版本不匹配导致DLL HELL的问题,多个DLL版本共存,不会出现系统升级造成一堆软件崩掉;另一方面就是兼容性问题,WinSxS通过Windows启动器的控制,来确保Windows程序启动时能够正确获取到老版本Windows的内存布局和相关DLL的依赖。

Windows能把兼容性做得这么好,还离不开另一个功臣:COM。在Windows整个系统中,各组件之间的交互都是通过COM实现,通过COM暴露接口,实现完全解耦。COM既能够做到扩展,又能够做到不破坏原有的接口;如果你想让你的旧程序使用新的COM接口,你都不需要重新编译,直接调用新的COM即可,前提是新的COM是从旧版COM继承而来。而Linux就不一样了,Linux是通过字符串建立,一旦字符串被修改或者格式被修改,就会造成难以预料的错误。

我之前在老的Win32上调用新的组件XAML、以及停止维护的IE6,再接上Chromium的V8引擎,旧组件和新组建在同一个应用程序中竟能相互调用。

为什么微软会允许这种技术存在?是因为现在很多成功运行在Windows上的程序都会对Windows特定版本的Bug有一些的依赖。如果不能将旧版本Windows的行为完全模仿出来,一旦这些程序在新版Windows上运行就会崩溃。再加上微软对Windows兼容性要求很高,所以通过这样的基础发展出这样的技术也就不足为怪。

譬如,以前有非法访问内存、二次释放内存无报错且不终止进程的Bug,如果将这些Bug修复,就可能会导致一些有Bug但恰好以前没问题的程序在新版Windows上无法运行。

如果涉及到系统架构的变化,将在系统层面完成对原来架构的转化。比如,X86 32位系统中带有16位的转换层,之前16位的DOS程序就能够在该系统上运行;64位的带有WoW64,能够对所有32位的应用程序进行兼容;Arm64的Windows包含两套转换层,分别是X86系统的32位和64位,兼容所有之前的应用程序。

当然这样的技术有好有坏,好处就是Windows系统百分之百向下兼容,这也是Windows成功的主要原因之一,也是Windows的强大之处。坏处就是Windows系统变得越来越臃肿,越来越庞大,老程序的Bug也得不到修复,增加了Windows程序崩溃的风险。


http://www.kler.cn/news/339228.html

相关文章:

  • 基于深度学习的药物筛选与发现
  • 手机商城系统小程序的设计
  • 关注、取关、Redis实现共同关注、 博客推送与分页查询
  • YOLOv8实战TT100K中国交通标志检测【数据集+YOLOv8模型+源码+PyQt5界面】
  • 众数信科 AI智能体智慧文旅解决方案——禅宗大模型
  • No.5 笔记 | 网络端口协议概览:互联网通信的关键节点
  • C++游戏开发:探索与挑战
  • SpringSecurity实现自定义登录接口
  • Redis实战-优惠券秒杀
  • Java中对象和对象变量
  • 数据结构篇(绪论)
  • k8s 中存储之 NFS 卷
  • 老房装修换窗需要注意哪些方面?
  • 学习使用Cube软件
  • 简易CPU设计入门:取指令(四)
  • 【代码随想录Day37】动态规划Part06
  • 【C语言】指针和数组的内存使用详解
  • IIOT工业物联网的标准与互操作性—SunIOT
  • Redis面试篇1
  • 计算机网络:物理层 —— 信道复用技术