词条 | 初级编程 |
释义 | 简单的说,编程就是为了借助于计算机来达到某一目的或解决某个问题,而使用某种程序设计语言编写程序代码,并最终得到结果的过程。汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。 比较C语言. C++几个显著变化(1. 名字空间的问题, 2. 代码复用的问题, 3. 安全机制 4. 效率问题.) 版本(Visual Studio 2005 速成版产品 NET Framework 2.0 SDK 和可再发行组件 Visual Studio 2005! Visual C++ Express 版 Microsoft Windows Vista SDK) 介绍计算机虽然功能十分强大。可以供你上网、打游戏、管理公司人事关系等等,但是没有程序,它就等于是一堆废铁,不会理会我们对它下达的“命令”。于是,我们要驯服它,只有通过一种方式——程序,这也是我们和计算机沟通的唯一方式。 程序也就是指令的集合,它告诉计算机如何执行特殊的任务。 写出程序后,再由特殊的软件将你的程序解释或翻译成计算机能够识别的“计算机语言”,然后计算机就可以“听得懂”你的话了,并会按照你的吩咐去做事了。因此,编程实际上也就是“人给计算机出规则”这么一个过程。 随计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。 电脑每做的一次动作,一个步骤,都是按照已经用计算机语言编好的程序来执行,程序是计算机要执行的指令的集合,而程序全部都是用我们所掌握的语言来编写的。所以人们要控制计算机一定要通过计算机语言向计算机发出命令。 计算机所能识别的语言只有机器语言,即由0和1构成的代码。但通常人们编程时,不采用机器语言,因为它非常难于记忆和识别。 汇编程序汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作,例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的,用汇编语言所能完成的操作不是一般高级语言所能实现的,而且源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快。 高级语言高级语言是目前绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。由于省略了很多细节,所以编程者也不需要具备太多的专业知识。 高级语言主要是相对于汇编语言而言,它并不是特指某一种具体的语言,而是包括了很多编程语言,如目前流行的VB、VC、FoxPro、Delphi等,这些语言的语法、命令格式都各不相同。 从二十世纪60年代以后,计算机得到了突飞猛进的发展。似乎历史上没有任何一门科学的发展速度超过了计算机的发展,无论硬件、软件、还是网络都以惊人的速度向前发展。软件的发展速度和硬件一样,二十世纪九十年代中国的软件业还不是很成熟,而现在大大小小 的软件企业四处耸立,共享软件网上随处可见。不断发展的技术需要不断变化的程序员,例如,如今Visual Basic可以快速构建Windows下的应用程序,程序设计方面的技术不断发展着,不断引进新的概念、新的方法,如从结构化的C开始,当面向对象的思想被提出后,出现了C++,微软在C++的基础上为使用户构建win32应用程序更加方便,推出了Visual C++。这也就需要程序员也要不断的更新自己的技术。 目前常用的基本程序语言的种类比较繁多,比较简单的有:Pascal、c语言、qBasic、 Fortran、Visual Basic等等。但前几种都是在DOS下进行编程的工具,Visual Basic是在 Windows下进行应用程序设计的编程工具,现在一般的计算机用户几乎都不再使用DOS了,因此我们通常会选择Visual Basic作为初学者的编程工具。Visual Basic是Windows应用程序设计中最容易上手的编程工具,学习步骤也比较容易被初学者接受。对于刚开始学习编程的初学者来说,还是选择Visual Basic,学习编程语言不能想象着一步登天,一步一个脚印的学习才是最佳方法。 文字C语言是国际上广泛流行的、很有发展前途的计算机高级语言。它适合作为系统描述语言,既可用来编写系统软件,也可用来编写应用软件。 早期的操作系统等系统软件主要是用汇编语言编写的(包括 UNIX操作系统在内)。由于汇编语言依赖于计算机硬件,程序的可读性和可移植性都比较差。为了提高可读性和可移植性,最好改用高级语言,但一般的高级语言难以实现汇编语言的某些功能(汇编语言可以直接对硬件进行操作),例如:对内存地址的操作、位操作等)。人们设想能否找到一种既具有一般高级语言特性,又具有低级语言特性的语言,集它们的优点于一身。于是,C语言就在这种情况下应运而生了。 C语言是在B语言的基础上发展起来的,它的根源可以追溯到ALGOL 60。1960年出现的ALGOL 60是一种面向问题的高级语言,它离硬件比较远,不宜用来编写系统程序。1963年英国的剑桥大学推出了CPL(CombinedProgram- ming Language)语言。CPL语言在ALGOL 60的基础上接近了硬件一些,但规模比较大,难以实现。1967年英国剑桥大学的Matin Richards对 CPL语言作了简化,推出了BCPL(Basic Combined Programming Language)语言。1970年美国贝尔实验室的 Ken Thompson以 BCPL语言为基础,又作了进一步简化,设计出了很简单的而且很接近硬件的 B语言( 取 BCPL的第一个字母),并用 B语言写第一个UNIX操作系统,在PDP-7上实现。1971年在PDP-11/20上实现了B语言,并写了UNIX操作系统。但B语言过于简单,功能有限。1972年至 1973年间,贝尔实验室的 D.M.Ritchie在B语言的基础上设计出了C语言(取 BCPL的第二个字母)。C语言既保持了BCPL和B语言的优点(精练、接近硬件),又克服了它们的缺点(过于简单、数据无类型等)。最初的C语言只是为描述和实现UNIX操作系统提供一种工作语言而设计的。1973年,K.Thom- pson和D.M.ritchie两人合作把UNIX的90%以上用 C改写(UNIX第5版。原来的 UNIX操作系统是1969年由美国的贝尔实验室的 K.Thompson和D.M.Ritchie开发成功的,是用汇编语言写的)。 后来,C语言多次作了改进,但主要还是在贝尔实验室内部使用。直到1- 975年UNIX第6版公布后 ,C语言的突出优点才引起人们普遍注意。1977年出现了不依赖于具体机器的C语言编译文本《可移植C语言编译程序》,使C移植到其它机器时所做的工作大大简化了,这也推动了UNIX操作系统迅速地在各种机器上实现。例如,VAX,AT&T等计算机系统都相继开发了UNIX。随着 UNIX的日益广泛使用,C语言也迅速得到推广。C语言和UNIX可以说是一对孪生兄弟,在发展过程中相辅相成。1978年以后,C语言已先后移植到大、中、小、微型机上,已独立于UNIX和PDP了。现在C语言已风靡全世界,成为世界上应用最广泛的几种计算机语言之一。 以1978年发表的UNIX第7版中的C编译程序为基础,Brian W.Kernighan和 Dennis M.Ritchie(合称K&R)合著了影响深远了名著《The C Programming Lan- guage》,这本书中介绍的C语言成为后来广泛使用的C语言版本的基础,它被称为标准C。1983年,美国国家标准化协会(ANSI)根据C语言问世以来各种版本对C的发展和扩充 ,制定了新的标准,称为ANSI C。ANSI C比原来的标准C有了很大的发展。K&R在1988年修改了他们的经典著作《The C Progra- mming Language》 ,按照ANSI C的标准重新写了该书。1987年,ANSI C又公布了新标准--87 ANSI C。目前流行的C编译系统都是以它为基础的。 C++ 是脱胎自 C 语言的一种中级语言. 从计算机角度看,它可以嵌入ASM等低端语言; 从面向对象的程序设计角度看,它有具备OOP的三个基本特征 -- 抽象,封装和继承; 同时从市场角度来看,它又不是纯面向对象,其实那些纯粹的面向对象语言的阵地只是在实验室. 比较 比较C语言. C++几个显著变化1. 名字空间的问题,原始的C语言使用公共的名字空间,这样无论是开发本人还是第三方团队都面临变量名字耗尽的问题. 而C++提供独立的名字空间,而且对象的引入也为名字空间提供了进一步划分 2. 代码复用的问题,C语言使用函数库的方式或者DLL方式实现代码复用,在接口稳定的前提下实现内部修改和数据及其实现的封装. C++提供了类库机制实现了具有层次的代码复用,和多种继承机制,同时重载等各种机制提供了进一步的复用实现. 使得类库和代码更加容易维护,虽然建立类库在人员,组织等各个方面还是比较麻烦的. 3. 安全机制. 因为有了类机制,有一些初始化操作可以自动实现 4. 效率问题.因为C语言本质上是站在计算机立场的非常注重效率的问题,但是事物总是具备矛盾的两面,过于偏重效率和软件危机的出现,反而增加了程序设计的难度. 而OOA的现实世界角度的考虑问题更加贴近自然,使得代码或者程序更加具备稳定性,可扩展性和可维护性. 版本Visual Studio 2005 速成版产品使用速成版产品开发应用程序入门。速成版产品扩展了 Visual Studio 产品线,涵盖了许多轻型、易学易用的工具,以供那些希望构建动态 Windows 应用程序的业余爱好者、学生和初学者使用。 NET Framework 2.0 SDK 和可再发行组件包括开发人员在编写、生成、测试、部署和运行 .NET Framework 应用程序时所需的一切。64 位版本和 x86 版本已发布。 Visual Studio 2005!要评估 Visual Studio 2005,可以有从 Express Edition 到 Trial Edition 到在线托管体验多种选择。找到最适合您的试用体验,看看 Visual Studio 2005 的强大功能如何转变您的应用程序。 Visual C++ Express 版为业余爱好者、 初学者和学生开发人员尝试此免费、 轻便、 易用,易学的工具。获取比其他 Express 版本更好的控制程度的所有马力。 Microsoft Windows Vista SDKMicrosoft Windows Vista 提供了大量在安全,性能,可靠性和管理性方面的新功能。下载 SDK,获得所有所需的工具来打造托管和本机应用程序,充分利用 WindowsVista 的强大功能。 为此,和经典物理同量子物理一样. C/C++ 今天在不同领域各自发挥着最大的效率. 各种编程语言的比较 前言 Java群体每天都在扩大,它既包括一些世界最大的ISV,也包括公司CIO、信息技术人员、系统分析人员、C/S开发人员、编程人员、多媒体设计者、市场行销人员、教育工作者、经理、影视生产者甚至业余爱好者等广泛的用户。从传统上看,这样一些人在一起有效地工作是不多见的。当我们谈到开放系统时,我们往往是就已发表的API及规格,或者源码的可得性,或者硬件、联网及操作系统而言的,没有一个人是从人的开放意义上来谈的。Java完成了开放系统的闭合链。它开发了人力资源,而反过来又开辟了共同工作的道路。一谈到Java,人们马上会想起一种类似于C++的、适用于分布环境的面向对象编程语言,想到这种语言的简单、稳定、安全、与体系结构无关、可移植、可解释、高性能、多线程和动态性等特征。这些都是Java作为一种程序设计语言的主要特征。Java是由Sun公司的一个技术小组研制出来的。在实现Java语言的过程中,Sun小组的技术人员很快就意识到:C++无法成为一种完全面向对象的、网络化的开发语言。C++是通过给原先的C语言增加面向对象功能而开发出来的,因此,它存在着先天不足。这主要体现在C++种类繁多,功能大量冗余,同时又没有任何一种C++编译器能够支持它的全部功能。鉴于这种情况,Sun公司的技术人员决定不扩充C++,而开发一种全新的计算机语言(Java的前身Oak)。但是,C++已经成了大多数编程人员所熟练掌握的语言,Java的设计显然不能无视这个现实。如果Java和C++之间的差别过大,那么程序员们在学会这种语言的过程中无疑要花费大量的时间和精力。因此,Java保留了尽可能多的C++风格。Java自诞生起,为网络用户创造了无数客户端的小应用程序,由于这类应用程序效果良好、数量巨大,以至于许多用户想到Java编程语言时,会在脑海中出现一个不完全正确的印象-Java是用来编写小的客户端程序的。其实,随着技术的进步,Java语言正在逐步改变自己执行效率较低、无法担任企业关键计算任务的形象,不断向计算技术的核心地带前进。今天的Java技术正沿着网络渗入各个应用领域。企业计算:企业计算是Java最重要的技术主题。Sun公司已经公布了企业JavaBean(EJB,Enterprise JavaBean)的规格,随后众多公司开始开发企业应用领域的Java技术。IBM公司也已经为Windows NT开发了IBM HPCJ(High Performance Compiler for Java)12.0版,同时研制了IBM JDK(JavaDevelopment Kit)for Windows NT,Novell公司也在宣布了一个新的服务器端的企业Java平台,而Sun公司也在积极地升级自己的JDK系统,这个形势表明,Java正在稳步走向企业高端计算。对于Java来说,与其它编程语言争夺企业计算主力编程工具的优势在于:其一,Java在进行面向对象的编程工作时,比其它的编程语言如C++更加简单,因此保证了编程的高效率,减少了编程投入;其二,Java虚拟机技术所提供的"一次编程,到处使用"的跨平台能力非常适合网络环境,这给Java在网络服务器端的发展提供了便利条件;其三,Java拥有强大的提供商和支持者队伍,该队伍包括IBM、Oracle、Novell、Sybase和Netscape等公司。提速运行:许多企业的应用开发人员非常喜爱Java的语言特性,但是在开发重要系统时,语言特性和执行效率之间的抉择往往令人伤透脑筋。在关键计算中,用户可能并不在乎数据如何压缩或者运行的延迟关系如何设置,但是对程序的运行速度却非常重视,这使厂商将Java的编译策略开发放在了首位。现在的Java语言,其执行方式已经不仅仅是解释执行方式了,即时编译器(JITC、just-in-time compiler)技术和原型编译技术已经被许多厂家采用,包括Sun、IBM、Oracle以及Netscape等公司在内的技术提供商正在利用这些技术逐步提高Java的执行速度,其中IBM公司早已将Java虚拟机(JVM,JavaVirtual Machine)、操作系统和硬件的特性有机的结合在一起,非常有效地提高了Java的执行效率。嵌入计算:嵌入式Java是一个潜力巨大的应用技术,该技术充分发挥了Java小巧灵活的特点。以HP公司为例,该公司以自己的方式制造编译工具和Java虚拟机,其目的是将Java嵌入各种设备,如打印机、医学监视器和自动提款机等。嵌入设备依靠一个实时操作系统来处理某一个实时生效的事件,Java被嵌入这些设备后,通过实时扩展(real-time extension)开始发挥作用,使设备具备了一定的智能性,增强了嵌入设备的可管理性和可用性,大大提高了设备的工作效率。各厂商对这一潜力巨大的市场都非常重视,目前该市场缺乏的是一个标准,如果存在标准的话,相信很快就会有大量使用嵌入Java技术的设备上市。微软刚刚发行的Windows XP放弃了对Java的支持,但Java能够独立运行于很多操作平台上,其中也包括Linux,并且在某些特性上要比在Windows上发挥得更好,我们完全有理由抛弃Windows而选择使用Linux来做Java开发。现在,你可以左手拿着Linux,右手拿着Java,然后对面带微笑手里拿着Windows XP的Bill Gates说:"让你的XP去见鬼吧!" 对于软件开发者来讲,任何一种编程语言都不可能是完美的。如果希望更好地理解Java语言,最好的方法是把这种语言与其同类型的语言相比较。既然Java类似于C++,把它同C++进行一番比较也是顺理成章的事情,哪一个好,哪一个不好,每个开发人员都有各自的看法。我个人认为Java开发要比C++好一些。当然每个人的看法和喜好是不同的。后面的文章将向大家介绍Java和C++的不同和对其的改进。孰强孰弱,大家自然就会明白了。我们知道,Java一开始采用C++的语法格式,基本上是为了让程序设计者可以很快地熟悉 Java的语法格式,缩短学习Java的时间,毕竟C和C++仍旧是最多人会的一种程序语言。但是如果我们仔细检查Java程序语言的许多细节设计,我们可以发现Java去掉了不少C++的特点,并且加入一些新的特性。这些与C++的差异包括:1.不再有#define、#include等预处理程序(Preprocessor)的功能 C++语言很重要的一个特点就是它的预处理程序。有些其他程序语言虽然也加入了#include的功能,但是还是欠缺处理宏(Macro)的能力。#define的功能在Java中我们可以用定义常数(constant)的方式来取代,而#include在Java中是不需要的,因为在Java中程序在执行时,会把类型数据记录在对象实体之中,我们不需要靠一些标头文件(header file)来知道我们使用的对象或数值是属于什么数据类型。如果你使用C++语言时,只使用预处理程序的#include和#define功能的话,那么你大概不会觉得Java这样的设计对你产生什么样的困扰,但是如果你是使用C++语言预处理程序中宏功能的高手,你可能会觉得很不方便,进而怀疑Java如此设计的意义何在。使用预处理程序虽然可以很方便地达到许多功能,但是站在软件工程的角度上看,对整个软件的维护其实是很不利的。由于C++语言中预处理程序的功能太过强大,厉害的程序设计高手常会自行开发一套只有自己看的懂的宏语言,一旦整个软件要交给其他人去维护,后继者很难在短时间内了解前一个人所写下的宏功能,增加软件开发时团队工作及日后维护的困难度。另外一点则是C++语言的编译器所看到的程序代码,其实和程序设计者看到的程序代码是不同的。程序设计者看到的是尚未经过预处理程序处理过的程序代码,而编译器看到的则是预处理程序处理过的程序代码,一旦交给预处理程序处理的宏内容有误,编译器产生的错误信息将不会是程序设计师所预料的。而这一点自然也增加了程序在排错时的困难度。预处理程序的存在也造成了阅读程序的不便。如果你想使用别人已经完成的C++语言程序,那么通常你不但要阅读他所写下的文件,还必须一并查阅上文件,才能了解其程序的全貌。如果换成是Java程序,只要查看java的程序文件就够了。2.不再有structure、union及typedef 事实上,早在C++中就可以去掉C语言中的structure和union等对复杂数据的自定结构类型,因为类(Class)的定义方式可以完全做到这项功能。而typedef也是不必要的,一切都用类就可以了。虽然C++这样的设计是为了和C语言兼容,但是使用多余的语言特点不但不必要,而且容易造成对程序认识的混淆。3.不再有函数 在Java程序语言中,去掉了程序向导语言中最重要的单元--函数(Function)。如果我们以对象向导的观念来看待函数,就可以了解函数在对象向导的概念中,是不必要的。在对象向导的程序观念里,对象的数据才是真正的主体,而处理对象数据的方法则必须依附在对象内才有意义。因此,去掉函数并不表示不再有子程序等模组化程 序的概念,相反地,是利用对象中的方法来取代函数,再一次强化对向导的发展策略。4.不再有多重继承(Multiplelnheritance) 在C++中,多重继承是一项很强的功能,但也是一般人难以掌控的部分。去掉多重继承虽然降低了Java语言的功能,但是也大幅简化撰写程序时的困难度。虽然移除了多重继承的功能,但是Java提供了interface的方式,可以达到部分多重继承的功用。所谓的interface基本上定义了一个类的对外沟通的方法原型,以及类内部的常 数,和多重继承不同之处在于interface并不会定义类方法的内容,以及类中的变量数据。5.不再有Goto 在程序语言的发展史上,Goto一直是毁誉参半的一项功能。在很多时候使用Goto可以大幅减少不必要的程序代码,但是也由于Goto可以很自由地改变程序的流程,如果冒然地使用,更可能造成程序结构混乱的情况。一般来说,正确使用Goto的例子多出现在循环内部,想要提早结束某一层循环。在C语言中,我们可以使用break 或contine来改变某一层循环的流程, 但如果想要改变两层以上的环执行流程,不是使用Goto就是以多余的布尔(boolean)变量,配合上一串if-then-else的判断来达成。Java一方面移除了Goto的功能, 而另一方面同时扩大了break和continue的功能,可以允许多层循环的break或continue。如此一来不但避免了滥用Goto的可能性,同时也保存下Goto的好处。6.不再有OperatorOverloading 在C++中,Operator Overloading同样也是一项值得讨论的设计。几乎在所有C++的书中,都会引用一些例子,告诉你使用OperatorOverloading可以使你的程序看起来更为自然。如下面是一个程序设计师自定义的复数类://C++中自定义的复数类及0pemtor Overloading class Complex{public:Complex(double real,double image){Real_number=real;Image_number=image;}Complex operator+(Complex&rhs){Return Complex(rhs.real_number+real_number,rhs.image_number+image_,nulnbef);}private:doublereal_number //实部doublejmage_nunmber; //虚部} 在这里,如果你使用+来作为复数的加法符号,大家都不会有疑义,但是如果你使用的是*或》这样的符号,那么别人看到你的程序之后,难保不会产生认识上的错误。这也是Operator Overloading一大问题,当大家都对运算符赋予自己的定义后,整个程序的可读性就会大受影响。Operator Overloading的存在并不是必要的,我们一样可以定义类中的方法来达到同样的目的,至于Java去掉这项功能的利弊,恐怕就要读者自己去评断了。7.取消自动类型转换 Java是一个严格进行类型检查的程序语言,对于下面这样的程序,在C++的编译器上编译时最多只会出现警告的信息,但是在Java里则不予通过:Int aInteger; Double aDouble=2.71828; AInteger = aDouble; 虽然这样的转型在C++里是合法的,但是也会造成数据精确度的损失。Java为了要确定写程序的人充分地了解这点,必须要程序设计强制转型(type casting),Java的编译器才会接受:int aInteger;doublea Double=2.71828;aInteger=(int)aDouble;8.不再有指针 取消指针(Pointer)这样数据类型,可能会让许多熟悉C++语言的程序设计师大吃一惊。在C++语言里,灵活地运用指针是许多程序设计师的得意之作,但是占整个除错时间最久的也是指针的问题。配合上C++对内存管理的态度,程序设计师必须要自己去追踪自己向系统要到的内存,最后确实地交还给系统,并且在使用指针时,要小心翼翼地注意不要跨过合法的记忆空间,造成Segmentation Fault或General Protection Fault之类的问题。Java去掉了指针类型,并不表示程序设计师在开发高级数据结构,像堆栈(stack)、 队列(queue)、二元树(binarytree)时,都必须要像在传统Basic上,利用大范围的数组来自行模拟系统内存,自行建构类似指针的表示方式。相反地,Java提供了和Lisp语言中相似的Reference类型,通过Reference去读取配置到的内存内容,可以确保不会去读取到不属于自己的内存空间,而另一方面,程序的执行系统也可以动态地去做内存垃圾回收的工作,将没有被reference参考到的内存空间回收给系统使用。9.和C++连接 不管Java是多么强大,总是有人需要把它和C++连接起来。因为只要有一个新的程序语言或是软件开发工具一出现,大家就会问:"它是否具有和原有程序库连接的能力呢?"也因为C++语言在电脑界中占了很重要的地位。大家的问题其实就等于是直接问"它是否可以和C++连接?"。目前在Java中,的确提供了和C++语言连接的方法,它的做法基本上是先将C++语言所写的程序建构成动态链接函数库(DynamicLinking Library,DLL),再由Java程序去调用DLL里的函数。这种连接的方式,使得DLL中的函数,从Java的眼光看就是一个"方法"。不过因为这种方法是直接由其他的程序语言所提供,而不是以Java语言所写的,所以它被称之为"原生方法"(NativeMethod)。由于Java Applet一些安全上的限制,所以这种连接外部程序的方法只能用在Java Application内。小结:事实上,constant和typedef这两条语句包含了#define语句的作用。现在,结构和联合已经被Java的类所代替。删除这些特性的原因是:由于其希望维持与C语言的向后兼容性,C ++的语言规范包含了大量冗余。比如,类实际上就已经包括了结构和联合的作用,因此这两种数据结构完全可以取消。关于#define语句,Java语言规范的制订者认为:尽管该语句的出发点是为了增强程序的可读性,但实际效果却恰恰相反,它常常导致难读的代码,故应该予以取消。Java不再支持独立函数,因此任何函数都必须封装到某个类中。由于人们普遍认为, C++所用的超类是非常不稳定的,因此Java抛弃了C++中的多继承并代之以接口。Java的接口指的是,在别的类看来一个类所能实现的方法。它所显示的只是一个类的方法或常量和变量 ,而不是这个类的全部结构。最后,Java还取消了C++中的GOTO语句、操作符重载、自动类型转换及指针数据类型。GOTO语句引起的争议已经有很多年了,可一直阴魂不散,这跟某些程序员对该语句一直情有独钟有关。C++仍然支持数据类型的自动转换,但Java要求编程人员显式实现数据类型之间的转换。自动数据类型转换使得两个数据类型互不兼容的变量可以相互赋值,而不需要给出显式说明。这有时会导致一些问题,其中最常见的是精确度损失。比方说,如果把一个带符号的32位整数赋给一个无符号整数,则所有的结果均为正数。Java的设计者们认为这很容易引起程序错误,从而决定不支持这种转换方式。 C语言是一种面向过程的基于模块的语言。一般用在和汇编混和编程的嵌入式开发或者较低层的驱动程序开发,操作系统设计。开发周期长,代码维护成本高,可移植性差,但是程序运行效率高,可以更直接的控制硬件。 C++当然就是c的升级版本,兼容c的语法,并且多了oo,模板,重构等高级软件技术。开发周期短,代码维护也相对容易,功能强大,应该说是20年来软件业近乎无敌的程序设计语言。不过学习周期偏长,熟练掌握还需要时间和经验的积累。 C#是微软从borland公司挖走的一位高手设计的,该神人曾经在borland公司用汇编设计了pascal编译器,程序设计能力之强,非常人能及。C#是一种类型于java的语言,需要运行环境支持才能执行。执行效率当然就不能和c,c++相提并论,不过这样带来了良好的可移植性,可以在支持。net运行环境的各种平台下执行,并且方便的与其他。net语言进行交换编程,更方便程序员间进行交流。 我觉得C++最大的优势在于她的通用和全面。我们往往听到C++和其他语言的比较:诸如运行效率不如C啦、应用软件的开发效率上不如Java和.NET啦、GUI开发不如VB啦……以及在各个方面与各种专用语言和脚本语言的比较。似乎C++就没有自己最突出的地方,简直一无是处。我想说的是,先不谈比较的结果,这些比较能够成立,本身就说明了C++的优势——她是通用的,她是全面的。在成熟的主流语言中,除了C++,还有谁能够做到这一点?! 另外一些比较则罕有提及:与C语言比开发应用软件?与Java比做底层?与VB比运行效率?是的,很罕见。因为结论显而易见以至任何的比较都是浪费时间。当然了,她们都有各自的适用范围,做好本职就好了,何必与你比其他的。这是一种生存之道,无可厚非。唯有C++,选择了另一条道路——“通用语言”,不是象C那样“通用的”底层语言,也不是象Java那样其实只能在一个平台上运行的“跨平台”语言,而是真正的通用:通用于所有层次、通用于所有平台、通用于所有领域,对所有的应用都不偏不倚、一视同仁。 要做到这一点是很困难的,C++往往被人指责野心过大。还有各种各样的误解:有指责VC只能在Windows上使用的(所以C++是不能跨平台的);有指责gcc无法快速开发GUI的(所以C++的应用是有局限的);有指责Java、.NET和脚本语言占据了绝大部分网站开发的(所以C++是不能适应网络时代的)……这些指责说得人多了,就成为了真理。我不想去一一解疑,只想说明一点:语言之间的比较很少是公正的,因为误解是广泛存在的。 无疑,C++的野心确实很大,“通用”二字貌似华丽有余,实惠不足。常常有人说:学习C++,然后使用其他专门语言。是的,在一个特定领域里,通用往往比不上专用的。但是,整体总是大于部分之和。如果说,“博”和“精”各有所长的话,那么又博且精不是更好吗?就象我们常常用电脑,而不是分立的上网机、办公机、游戏机、编程机 ……虽然C++不能包揽所有的冠军,但是如果她在哪方面都不算太差的话,又何必执着于虚幻的完美呢? 确实,C++能够立足于世,不仅在于她是“通用”的,更在于她是“全面”的。你常常能在某个局部找到她的一点不足。是的,她有一个不足;那么,能否改进呢?回答是:不能!为什么?回答是:如果改进了这一点,就会出现新的不足,可能是另一点,甚或更多。就象一个已经挤满了人的车厢,要上去一个,就得再下来一个!是的,C++就是这样的车厢,她无法让你享受悠闲的空间,反而给你窒息的感觉;但是,正是这样的车厢,支撑着主干交通的正常运行(想想吧,如果一个人口密集的大城市里全部都是私家车,会是什么状况)。车厢可能会越做越大,因为技术正在不断提高,但是C++这个车厢,永远都是满的。一个局部的不足,如果不存在被改进的可能,恰恰暗示了已经达到了全局最佳!C++正是以此为目标的;并且,她做到了! 回到我们最初的比较上。 C++的运行效率不如C吗?是的,也许吧,以特定的标准。但是,不如在哪些方面呢?虚函数、虚基类、异常处理……这些都是C所不具备的。如果在C++中不使用它们,那么效率就不会比C低(优秀的编译器确实可以做到这一点)!C++考虑问题永远是综合的,而非单方面的,她的效率,趋近于你在享用各种特性时所能达到的最佳值,你只付出必然的代价。 C++在应用软件的开发效率上不如Java和.NET吗?是的,也许吧,以特定的标准。但是,原因是什么呢?是C++语言不及Java和.NET吗?不是的。只是因为后两者是产品,而C++是语言。这个比较,本身就是不合适的。在.NET中,你同样可以使用C++,同样可以达到它的开发效率。另外,C++并不限制其实现产品,所以每个特定应用领域都可以有其特定的编译器,它们帮助程序员达到各自最佳的开发效率。如果单论语言,那么只有C++的语言复杂度会影响这一话题。也许Java等更容易上手,但是对两方面的资深人员来说,C++的开发效率毫不逊色。值得一提的是,在比较时应该同时考虑应用的复杂度。另外,需要知道,作为产品的Java和.NET预处理了一些应用复杂度,而这些产品本身很大程度上(如果不说全部的话)是用C++开发的。 C++在GUI开发方面不如VB吗?是的,也许吧,以特定的标准。但是,为什么呢?作为语言,C++没有制订标准的GUI库,因为GUI太复杂,要达到通用的最佳,很难。因此,C++放弃了这方面的通用化。但是,每个具体的实现可以使用各自优化的GUI库。VC比VB如何?如果嫌它还不算快速开发,BCB呢?另外,还有QT等通用GUI库。在语言方面,C++追求通用和全面,而局部的优化,交给具体的实现来完成,这是C++成功的秘诀。 综上所述,我认为C++的优势就在于她的通用和全面(也有人认为这正是她的劣势,也许吧,从另一个角度)。她的通用,来源于其始终不变的远大理想(也可称之为“野心”);而她的全面,则得益于她的设计者们力争上游、精益求精的工作态度!就象我曾经说过的,C++真正的优势在于C++社群——那些设计她的人,实现她的人,以及使用她的人。那些表面的优势来源于此,也归结于此。C++的开局很不错,现在仍很好;而她的未来,将由我们来决定…… |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。