文/adding
“唯技术”思想有时能使陷入一种困境,作为一种编程工具(也可以认为是一种技术),Visual C++经历了许多风波和变革,但纵观目前几乎所以有书籍和文章,很少对这种技术进行“跳出圈外”的思考,这也使我写这篇文章感到无源的苦恼。细想之后,也颇为感慨,愿借此文以激众家之思!
Visual C++的发展与C/C++语言、Windows的历程是分不开的。
在C语言推出之前,操作系统等系统软件主要是用汇编语言编写的(如UNIX操作系统)。由于汇编语言依赖于计算机硬件,因此程序的可移植性和可读性就比较差。为了提高程序的可读性和可移植性,并能实现汇编语言的某些功能(如汇编语言可以直接对硬件进行操作、对内存地址进行操作和位操作等)。于是,C语言便应运而生了。
最初的C语言只是为描述和实现UNIX操作系统而提供的一种程序设计语言。1973年,贝尔实验室的K.Thompson和D.M.Ritchie两人合作把UNIX的90%以上的代码用C语言改写(即UNIX第五版)。后来C语言又作了多次改进,1978年以后,C语言已先后移植到大、中、小及微型机上,现在C语言已成为风靡全球的计算机程序设计语言。
到了80年代,美国AT&T贝尔实验室的Bjarne Stroustrup在C语言的基础上推出了C++程序设计语言。由于C++提出了把数据和在数据之上的操作封装在一起的类、对象和方法的机制,并通过派生、继承、重载和多态性等特征,实现了人们期待已久的软件复用和自动生成。这使得软件,特别是大型复杂软件的构造和维护变得更加有效和容易,并使软件开发能更自然地反映事物的本质,从而大大提高了软件的开发效率和质量。
在C/C++发展过程中,C/C++的开发工具也是发展迅速。
早期的程序员仍然不会忘记Turbo Pascal的集成开发环境IDE的魅力,IDE能使编辑器和编译器共同工作,在编辑器中写下源代码,使用Compile(编译)命令来启动编译器,当编译器发现错误时,它将编辑光标定位到出错语句处,以便于改正。IDE为程序开发提供一个整体环境。
C语言产生后,Turbo Pascal发行了Turbo C,Microsoft相应地推出Quick C。虽然Quick C和Turbo C给C编程引进许多内容,但却没有对开发者产生永久性的影响(尽管Turbo C目前仍被用于现行教学中),其主要原因是二者的编辑器都不怎么好(Quick C编辑器后来合并到Microsoft Quick Basic中,现在它作为DOS编辑器Edit.com仍存在于Microsoft Windows 95中),其次,DOS下IDE占据大量内存,使程序运行空间变得很小。
编辑器之争
Visual C++在目前的C/C++编辑器占统治地位不是偶然的,这是由微软的正确和对手的错误造成。
翻开C/C++编辑器历史,战火风云。当Microsoft Visual C++ 1.0 在C/C++开发工具市场获得了空前的成功之后,Borland的Philippe Kahn也许在和Microsoft的FoxPro For Window一役中被吓到了,因此急于在Visual C/C++ 1.0之后立刻推出新的Borland C/C++以扳回颜面。由于当时Borland失去了许多的人才,Borland C/C++ 4.0仓促推出后,由于没有在最后阶段修正许多的错误,加上加入太多的先进技术,造成了整个产品的不稳定,从而铸成大错,陷入窘境。
在Borland C/C++ 4.0失利之后,Borland为挽回局面,立刻着手开发Borland C/++ 4.0的Patch,当时是称为Service Pack。但是在4.01版中并没有完全的解决问题,一直要到4.02才稍为解决一些严重的问题,无奈市场已经起了巨大的变化。
自Borland C/C++ 4.0一役大败之后,Visual C/C++虽取得了胜利,但此时在C/C++市场上也加入了另外两个坚强的对手,那就是Symantec C/C++和Watcom C/C++。
Symantec C/C++的Think C/C++在Macintosh上便是非常有名的编译器,因此早在C/C++领域便有深厚的基础。在Symantec并购了PC上第一个C/C++编译器Zortech C/C++之后,Symantec决定进入了PC的开发工具市场。恰逢Borland C/C++ 3.1的幕后支柱Eugene Wang刚好和Philippe Kahn闹翻,离开了Borland。Symantec重金邀请Eugene Wang,1993年左右,Symantec推出了第一个Symantec C/C++版本,立刻便获得了市场的好评。Symantec C/C++不断完善,以最完美的、先进的集成开发环境获得市场的高度认同。
Watcom C/C++是以在DOS下能够产生最好的最优化程序代码而闻名的,再加入当时最有名的DOS Extender厂商PharLap公司也是使用Watcom C/C++,因此Watcom C/C++在专业的C/C++程序员以及系统程序员心中是第一品牌的C/C++开发工具。为了顺应DOS向Windows过度,也为了生存,大约也是在1993,1994年左右Watcom终于推出第一个基于Window平台的C/C++开发工具。虽然没有什么特色,但却以编译器的优点成为四大C/C++开发工具之一。
但是Symantec和Watcom由于自身的实力和发展方向,在1993年初选择了和Microsoft签约,使用MFC做为它们的开发工具的C/C++ Framework。而Borland选择了坚持开发自己的C/C++ Framework,这就是OWL。
1994年,Microsoft为了对抗Apple和IBM OS2,推出OLE(Object Linking And Embedding)技术,该技术由于可以让Window平台的文件能够内嵌在不同的应用程序中并且能在应用程序中进行编辑,因此“深入人心”。尽管该技术被后来证明是失败的技术,但却使Microsoft取得了C/C++开发工具的胜利。
由于OLE的复杂性使得Borland无法在OWL中实现此功能,因而就造成了市场的一些负面影响。Symantec和Watcom由于签约的是MFC 1.x的版本,而OLE是在MFC 2.0中的技术,Symantec和Watcom吃了大亏。不久以后,Symantec放弃PC的C/C++开发工具市场,转而开始研发Java开发工具。而Watcom则被新兴而起的Sybase并购,从此消失。
为了迎合市场,支持OLE技术,Borland在Borland C/C++ 4.5的OWL 2.5中推出OCF,但由于没有MFC的OLE能力强大,也逐渐败下阵来。虽然后来Borland继续推出了Borland C/C++ 5.0,5.02,但终因品质和市场原因而结束。
随后,Windows 3.0出现了。Windows 3.0尤其是3.1,为个人计算机引进了真正的IDE时代。但是,Microsoft却把精力更多地集中在C编译器的内部支持上,而不是把它的界面升级到一个新的时代。尽管如此,Microsoft C/C++ 7.0却引入了对C++的支持,并引进了Microsoft Foundation Class库1.0版,完善了源代码。Microsoft C/C++ 8.0成为真正的Windows IDE,这就是Visual C++ 1.0。
Visual C++ 1.5之后,微软决定不再将花更多的努力去支持16位编程上。虽然,Visual C++ 2.0仍提供对16位的支持,但它仅用来创建32位程序。
Visual C++是没有3.0的,版本号直接从2.0跳到4.0,以使Visual C++和MFC同步,但这种同步是短暂的,后来,Visual C++和MFC又使用了不同的版本号。
Visual C++ 4.0引入了Internet的支持,并为Internet编程而设计的新类库。
Visual C++ 5.0还增加了一些新类,但主要是集中在界面的改善上,并提供一个更好的在线帮助系统、更高级的宏能力和对在开发者组内进行类和其它代码共享的支持。5.0中还合并了Active Template Library(ATL),并显著地改善了编译器优化代码的能力。
1998年9月,Microsoft推出了Visual C++ 6.0,它除了保留5.0对ActiveX的支持外,还支持DHTML,更新了MFC及ATL的类库,并对模板也有扩充,用户可以方便地开发出类似Web浏览器界面的应用程序。
2000年7月,在PDC(Professional Developers Conference)会议上,Microsoft宣布启动.NET方案,推出了一个全新的开发平台Visual Studio.NET,这是Microsoft技术方向的重大转变。在这个平台上,包括了Visual C++、Visual Basic、Visual FoxPro和C#等开发工具。
2002年2月推出的Visual Studio.NET虽然有许多不近人意的地方,但是却让我们领略了它的强大之处。Visual C++ .NET除对Microsoft .NET Framework支持和界面及文档的语言本地化这两个最显著特点外,它与Visual C++ 6.0相比,还包含其他许多新的特性,如Web应用程序、C++托管扩展、ATL、DCOM、MFC等方面的增强以及ATL Server、的支持等。
2002年底推出Visual Studio .NET 2002,2003年4月,Visual Studio .NET 2003发布。Visual Studio .NET 2003 包含 Windows .NET Framework 的一个增强版本,并将移 动和嵌入式设备,如 Pocket PC 和其他采用 Microsoft Windows CE .NET 操作系统的设备,带入了 .NET。
Visual C++ .NET 2003对2002版本进行了许多更新和优化,除界面、库作了改进之外,还对在 C++托管扩展中创建的Windows 窗体应用程序提供设计器的支持以及提供对项目中生成自动化模型的支持等。
MFC和Visual C++
Visual C++的核心是Microsoft基础类库,即通常所说的MFC。MFC相当彻底的封装了Win32软件开发工具包(Software Development Kit,即通常所说的SDK)中的结构、功能,它为编程者提供了一个应用程序框架,这个应用程序框架为编程者完成了很多Windows编程中的例行性工作,如管理窗口、菜单和对话框,执行基本的输入和输出、使用集合类来保存数据对象等等,并且,MFC使得在程序中使用很多过去很专业、很复杂的编程课题,如ActiveX、OLE、本地数据库和开放式数据库互联(Open Database Connectivity,简写为ODBC)、Windows套接字和Internet应用程序设计等,以及其它的应用程序界面特性,如属性页(也叫标签对话框)、打印和打印预览、浮动的和可定制的工具条变得更加的容易。
早在1989年,Microsoft的程序员们开始试图将C++和面向对象的编程概念应用于Windows编程中,以编写出一个可以使Windows编程更加简便的应用程序框架。他们把这个应用程序框架叫做AFX (AFX这个词来源于Application Framework,但奇怪的是这个词组中并没有包含“X”这个字母)。直到今天,AFX小组早已不存在了,AFX这个名称也于1994年初不再使用,但在Visual C++和MFC中,AFX的影子却随处可见,很多全局函数、结构和宏的标识符都被加上了AFX的前缀。
最初的AFX版本在经过一年的艰苦之后诞生,却未能被大多数Windows程序员所接受。AFX的确是经过了精心的规划和编码,并且,它也提供了对Windows API的高度抽象,建立了全新的面向对象的AFX API,但最要命的是AFX API库根本不兼容于现有的Windows API。由此导致的最严重后果是大量的SDK代码无法移植,而程序员将学习两种完全不同的编程方法。
AFX不得不重新做所有的一切,他们所创建的新的应用程序框架是一套扩展的C++类,它封装和映射了Windows API,这就是MFC的前身。过去的AFX小组也变成了MFC小组。最终,MFC的第一个公开版本于1992年3月随Microsoft C/C++ 7.0一起推出。那时距Windows 3.1发布尚有好几个月。在MFC 1.0中还没有文档/视结构,但有类CObject和CArchive。在12个月之后,MFC 2.0随Microsoft新的编程工具Visual C++ 1.0一道出炉。与MFC 1.0一样,MFC 2.0仍是16位的,因为32位的Windows NT 3.1直到1993年7月才问世。在MFC 2.0中,增加了对文档/视结构、OLE 1.0、Windows 3.1公用对话框的支持和消息映射等。在Windows NT 3.1面世一个月以后,Microsoft推出了32版本的Visual C++和MFC 2.1,它实际上是MFC 2.0的Win32接口。
最后一个16位的Visual C++编译器是1993年12月推出的Visual C++ 1.5,直到今天,一些为Windows 3.1编写16位应用程序的程序员还在使用这个版本。1994年9月,32位的MFC 3.0伴随着Visual C++ 2.0的一道面市,在今天的计算机图书市场上,还有着大量的关于Visual C++ 2.0和MFC 3.0的图书出售,因此,可以想象得出Visual C++ 2.0所取得的成功和它所产生的影响。
但是,在Visual C++ 5.0中包括的MFC版本不是MFC 5.0,而是MFC 4.21。发展到今天,MFC已发展成一个稳定和涵盖极广的C++类库,为成千上万的Win32程序员所使用。MFC库是可扩展的,它和Windows技术的最新发展到目前为止始终是同步的。并且,MFC类库使用了标准的Windows命名约定和编码格式,所以有经验的Windows SDK程序员很容易过渡到MFC。MFC结合了Windows SDK编程概念和面向对象的程序设计技术,从而具有极大灵活性和易用性。