ChanYao 2011-07-01
这个月稍早的时候,微软向Windows开发者们抛出了一个重磅炸弹,称Windows 8 触摸友好的沉浸模式不会使用基于.NET的开发平台而转向HTML5和javascript。然而在过去十年里,微软曾大力推崇前者。微软公司并未给予进一步的评论。但是对于开发者,这个问题显得尤为关切——我怎么利用现有的技能和经验去开发新的应用呢?微软似乎并不打算在9月份的BUILD大会之前透露任何信息。
不过事情可能并不是开发者想的那么糟糕。Windows8的早前的里程碑版本已经被泄露到互联网上,已经有了很多关于这个系统如何工作的研究。尽管官方的口风很紧,还是有一些细枝末节的信息从雷蒙德大院里跑了出来。就目前看来,Windows 8其实还是相当不错的。有迹象表明,Windows 8 将解很多决长久困扰Windows软件开发的问题。如果微软能够最终搞定一切,那么Windows 8 将是一个重大的发布版本,达成本应由Windows Longhorn(译注,即Windows Vista)完成的目标。
回顾历史
在我们开始讨论微软想拿Windows 8做什么之前,知道一些背景是必要的。要理解为什么Windows 8将会是一个重大的革新,必须先理清现状。
在2002年引入.NET之前,Windows 应用程序主要通过两种方式编写。大型应用——像Office,Photoshop或者Netscape浏览器——倾向于使用Win32 API和C++。Win32是一个庞大的编程接口,涵盖方方面面。熟知的如图形和用户界面创建、网络通信和文件系统访问。还有比较生僻的备份、网络配置和安全相关的一些东西。
Win32的确大而全,但是有些事情它并不擅长甚至无法完成。例如,虽然Win32提供了数据库访问的接口——事实上只有几个——但使用纯粹Win32来写数据库应用是相当繁琐的。更严重的问题是,Win32提供了创建图形用户界面的所需的所有基本工具,但它并没有简化工作。例如,在用户界面布局方面它就毫无作为。每个按钮、文本框和工具条都必须由开发者来指定位置,而且如果你想要它们的位置随窗口大小变化而移动,你得包办所有的事情。有很多库被开发出来作为开发者和操作系统之间的中间层,包括微软自己的MFC,以此来简化工作。但是很多时候,为了达到想要的效果还是不得不回归Win32。
(.NET之前)开发Windows应用的另一主要方式则是Visual Basic。Visual Basic能够让某些任务变得相当简单——特别是数据库交互和用户界面创建——并因此在商业领域占据一席之地。相当多的商业程序都只是简单的从数据库取出数据,展示给用户然后给用户一个表格来增加数据。在处理这档子事情上,Visual Basic很优秀。但是要做其他的事情Visual Basic就不是那么回事了。Visual Basic 对直接调用Win32 API 缺乏有效的支持,特别是那些需要用到特殊结构(译注:原文这里有链接指出是函数指针)的API。而且Visual Basic也缺乏对面向对象语义的支持,它只是“基于对象”的。
.NET的出现改变了整个格局。.NET如同VB一般简单易用,但是不像VB那么弱。和VB一样,.NET拥有很好的工具来构建用户界面和与数据库交互,因此很适合用来编写商业应用。而和VB不同的是,.NET有一种简单,但是稍显笨拙,的方法来访问Win32 API。因此,.NET平台很快就吸引了商业应用开发者,并且一些新的商业项目也在使用它。
Longhorn 之梦
Windows XP 在.NET前一年发布,因此毫不奇怪没有用到.NET技术。但是微软在2003年10月的PDC大会上宣布,事情将随着Windows Longhorn的发布而改变。Longhorn 将把.NET整合到Windows平台核心中去。一时周知.NET FX(FX代表Framework)将让位于WinFX,即基于同样技术的"Windows Framework"。除此之外,Windows Longhorn将带来一种全新的方式来编写用户界面,代码名为Avalon(译注:即WPF),完全现代、基于矢量和硬件加速的框架。Windows系统中用户可见的程序——资源管理器、计算器等——将使用WinFX技术。.NET将被视作编写Windows应用的最佳方式。而Win32则继续存在以保持向下兼容,但不会再变动。
Longhorn本应是旧式Windows应用开发的终结和现代Windows应用开发新纪元的开端,而不是因为10年或者15年前的设计决定而遭阉割。
如我们所知道的那样,Longhorn系统没有给我们带来这些。Longhorn工程变得极其庞大、不可管理而最终崩溃。而与此同时,Longhorn的基石Windows XP却在被黑客们肆意凌辱。微软不得不投入大量资源让Windows XP和Windows Server 2003的安全性可以让人接受——最终的结果就是Windows XP SP2和Windows Server 2003 SP1——然后再开始下一代操作系统的开发,最终就是Windows Vista发布。然后一切重新开始。
这其中最大的杯具之一就是.NET。Windows Vista尽管在某些方面有重大意义,但是它完全抛弃了WinFX的概念。Avalon最终发布——即WPF——但是只是作为操作系统的一个插件,而不是核心的一部分。Windows Vista 和 Windows 7中唯一显著基于.NET平台的程序是Media Center(然而它甚至没有用到WPF)。其他的一切东西都是老一套的Win32。Win32 API也被更新和扩充。相当数量的低层功能被添加到Win32来支持GUI的变化,诸如任务栏缩略图和AERO玻璃主题。而这些新的东西在WPF里都不能很好的工作。
导致微软作出这种决定的因素有若干。部分是因为这个决定只是一个权宜之计,没有时间用.NET来重写所有的东西。更重要的原因则可能是微软内部阵营的分裂。Windows来自于Win阵营,.NET来自于Dev阵营,然后还有服务器业务等等其他阵营。可能你认为这些小组的目标是一致的,但是实际不然。当然,这些小组之间没有什么冤仇,只是各自有不同的重点。
曲折的开发
各个小组重点的不同在当时影响重大。举个例子,WPF只能被.NET程序使用,而且只能配套C#或VB.NET使用。而整个API,由上至下都是原生的C++代码,将现有程序移植到WPF工作量巨大。计划之初,所有的开发都打算用.NET进行,但是渐渐计划成变化,原生代码还是成了首选的开发环境。这的确是个很大的问题。微软没办法使用全新的、基于矢量、分辨率无关和硬件加速的WPF来构建任何操作系统核心程序。
其它的差异则是各小组目标不同导致。Dev阵营的首要任务是创建一个可信赖的开发平台,这意味着他们要添加核心功能、开发工具和库(例如Silverlight)。Win阵营的首要任务则是前面提到过的C++兼容性,系统的健壮性及解决一些技术问题。所有的目标都是合理的,但是Dev阵营没有配合Win阵营,没有给Win阵营需要的东西。最终的结果就是Win阵营的管理部门看.NET很不爽,欣然忽略它。
.NET在Windows Vista 之后的几个版本对境况有所改进,但是C++的问题还是没有解决。伤害再所难免,Win阵营于是对Dev阵营不满,无视他们的工作。Windows 7和它前辈Windows Vista一样,只有Media Center这个程序使用.NET。Windows 7新的API全部是原生的C++ API,没有好的办法从.NET程序访问。而原生C++代码也无法访问分辨率无关、基于矢量、硬件加速的框架来构建用户界面。