VisualC++ 1.0:C++编译器的终结者
唯技术”思想有时能使陷入一种困境,作为一种编程工具(也可以认为是一种技术),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++的开发工具也是发展迅速。
早期的程序员仍然不会忘记TurboPascal的集成开发环境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仓促推出后,由于没有在最后阶段修正许多的错误,加上加入太多的先进技术,造成了整个产品的不稳定,从而铸成大错,陷入窘境。
在BorlandC/C++ 4.0失利之后,Borland为挽回局面,立刻着手开发Borland C/++ 4.0的Patch,当时是称为Service Pack。但是在4.01版中并没有完全的解决问题,一直要到4.02才稍为解决一些严重的问题,无奈市场已经起了巨大的变化。
自BorlandC/C++ 4.0一役大败之后,VisualC/C++虽取得了胜利,但此时在C/C++市场上也加入了另外两个坚强的对手,那就是Symantec C/C++和Watcom C/C++。
SymantecC/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++不断完善,以最完美的、先进的集成开发环境获得市场的高度认同。
WatcomC/C++是以在DOS下能够产生最好的最优化程序代码而闻名的,再加入当时最有名的DOSExtender厂商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编译器的内部支持上,而不是把它的界面升级到一个新的时代。尽管如此,MicrosoftC/C++ 7.0却引入了对C++的支持,并引进了Microsoft FoundationClass库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 TemplateLibrary(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 DatabaseConnectivity,简写为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编程概念和面向对象的程序设计技术,从而具有极大灵活性和易用性。
最近开始对windows编程起了兴趣,可能是快要工作的原因吧。在大学里学了些C/C++的东西,研究生也基本上在研究机器学习方面的算法,
对于软件开发只是有这心无力。找码农的工作很是受挫,还好最后找到了工业界的软件开发工作,虽然远离了原本打算的互联网行业,但是
多少也还算是软件开发人员吧。
对于软件开发人员来说,一个系统平台还是很重要的。我以后的工作不出意外的话应该是在linux平台,前一段时间研究了许多基本的linux知识,
学习了lamp架构,开发了Android应用,对于网站技术Javascript,XHTML,CSS也深入学习了一下。也算是像个程序员的样子了吧。
不过最近公司让我先学习一些它们之前的程序的使用,技术员让我学习windows方面的知识,我就调研了一下基于windows开发的一些技术。
近来研究了COM技术,但是觉得只是理解了原理,自己编起来很不方便,得用MFC或者ATL,但是对于MFC不是很熟悉,以前用过只是开发一些
简单的界面,不是很了解其中的原理。于是我决定把这些技术再简单的学习一遍。
说起windows编程,得说到90年代初期,windows3.0开始之后基于windows的编程技术才开始起步,那是微软推出win32SDK,也就是windows系统
的API接口,windows程序员可以通过调用windows提供的API来进行windows程序的编写工作。但是很快微软技术人员发现win32API函数太难记忆了,
一个函数的参数往往有六七个,每一个又有好多宏定义,编写起来相当的繁琐。所以开始使用C++类的思想将这些API封装起来,其实这个工作在1990年
左右就开始研究了,到1992年推出了MFC1.0,是和MicrosoftC/C++ 7.0(VC++IDE的前身)一起发布的,从此MFC开始走上了历史的舞台,一直辉煌了
十年之久。
MFC非常了庞大,几乎是那是在windows上开发图形界面的首选类库,所以即使到现在,市面上介绍MFC的书依然很多,许多介绍VC++开发的书籍也就是
讲解MFC的,2001左右深入浅出MFC这本书几乎是每个windows程序员必备。
COM技术也是90年代的产物,大约93年开始,组件对象复用技术在微软操作系统中流行起来,起先叫OLE(对象连接与嵌入)技术,OLE最早解决在文字处理
程序中嵌入表格处理程序,就像是在word里面也可以编辑excel的表格。这个问题主要是两个进程间通信问题,OLE最早使用的是DDE(动态数据交换)技术来
实现进程通信的,后来使用了COM技术来进行交换数据。后来OLE技术基本上是被淘汰了,而COM技术开始兴起,到98年左右COM技术达到了巅峰。主要是
MFC的全面支持,以及微软为简化COM编程又推出了一套类库ATL类库。COM技术应用到了互联网上,就成了ActiveX技术。
98年很多人认为之后将是COM的天下。COM(组件对象模型)不仅仅是一种进程通信的方式,也是一种软件架构的方式。组件式的架构可以让软件更加灵活。
未来的软件应该是许多模块组装起来的。可以对其中的一个组件进行升级,而不用改变其他的模块,也不用重新编译已经发行的程序,只要组件提供的接口保持
不变即可。
COM另一个比较厉害的特性是语言无关性,它只定义(dll,exe)二进制接口的内存布局,至于这种二进制接口是由什么语言定义的就不用管了。这样C++编写的
语言VB就可以使用了(这两个在90年代的主流语言),当然对于解释性的语言VBA等也可以中,这种语言广泛应用在execl等软件中。所以COM技术实现了不同软件之间
的互连互通。
COM是一种二进制代码的复用方式,是一种进程之间通信的方式,可能有人会说这两个问题的解决方案有很多,比如说DLL就是可以动态链接的,就可以提供二进制
代码复用功能,RPC技术可以实现进程间的通信等。没错,COM是基于这些技术之上的技术,它规定了二进制在内存中的布局。它也正是利用DLL的动态链接来实现的
进程内服务器,对于进程外服务器用的是RPC来进行底层通信的。
所以COM技术确实很给力,可是COM也很难,一方面概念比较多,另一方面实现起来也很难,微软为了简化这一技术,在MFC中加入了相关类来支持COM,但是这种
支持还是有限的,毕竟MFC不是专门干这个的,于是又推出了ATL(activetemplate library),这一类库是专门为编写COM组件服务的。熟悉STL的应该都知道,ATL已
大量使用了模板技术,这是C++一种比较高深的技术,所以ATL不是那么简单能学的。它需要开发人员对COM原理很熟悉,并且要对ATL的某些源码也有所了解才可以。
所以利用ATL开发COM组件不是一件容易的事,它需要对自动生成的类进行细致的调整,难度远远大于MFC的开发。
可能大家都知道98年微软推出的VC++ 6.0IDE成了C++的经典IDE,现在还有人用,相比vs2005,2008,2010,2012,其要小巧很多,只有几十M左右,而vs2010动辄7,8个G。
在运行方面VC6.0需要的内存资源很少,占有CPU也很少,而vs2012甚至要求win7以上系统的支持。对于5,6年前买的笔记本肯定是吃不消的。VC6.0对C++的标准的支持也
还是可以的,虽然和现在的还是有很大的差异,不过对于简单的学习应该够用了。
VC6.0集成了MFC6.0以及ATL3.0。一度成为了经典中的经典。
可是进入千年之后,大唐的太阳开始落下了。2000年微软开始了.net平台的探索。我觉得主要是解决软件的兼容性问题。微软的产品一直没有很好的兼容性,除了自己能兼容自己之外,其他的都兼容不了。软件兼容性主要包括语言无关性和移植性。.net框架都可以做到。.net 平台的发布同时,发布了C#语言,他是为.net平台而生的。它支持.net的所有特征。其实我理解的.net技术就是一个强大的类库,加上中间运行机制。