“C生万物,编程之本”
不可替代:语言地位四十多年未被撼动
1.C发展历史
C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而B语言则源自BCPL语言。
1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。20世纪60年代,美国AT & T公司贝尔实验室(AT & T Bell Laboratory)的研究员Ken Thompson闲来无事,手痒难耐,想玩一个他自己编的,模拟在太阳系航行的电子游戏——Space Travel。他背着老板,找到了台空闲的机器——PDP—7。但这台机器没有操作系统,而游戏必须使用操作系统的一些功能,于是他着手为PDP—7开发操作系统。后来,这个操作系统被命名为——UNIX。
1970年,美国贝尔实验室的Ken Thompson,以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。
1971年,同样酷爱Space Travel的Dennis M.Ritchie为了能早点儿玩上游戏,加入了Thompson的开发项目,合作开发UNIX。他的主要工作是改造B语言,使其更成熟。
1972年,美国贝尔实验室的D.M.Ritchie在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
1973年初,C语言的主体完成。Thompson和Ritchie迫不及待地开始用它完全重写了UNIX。此时,编程的乐趣使他们已经完全忘记了那个“Space Travel”,一门心思地投入UNIX和C语言的开发中。随着UNIX的发展,C语言自身也在不断地完善。直到今天,各种版本的UNIX内核和周边工具仍然使用C语言作为最主要的开发语言,其中还有不少继承Thompson和Ritchie之手的代码。
在开发中,他们还考虑把UNIX移植到其他类型的计算机上使用。C语言强大的移植性(Portability)在此显现。机器语言和汇编语言都不具有移植性,为x86开发的程序,不可能在Alpha,SPARC和ARM等机器上运行。而C语言程序则可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。
1977年,Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。
C语言继续发展,在1982年,很多有识之士和美国国家标准协会为了使这个语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,C语言作者和应用程序员组成。
1989年,ANSI发布了第一个完整的C语言标准——ANSI X3.159—1989,简称“C89”,不过人们也习惯称其为“ANSI C”。C89在1990年被国际标准组织ISO(International Organization for Standardization)一字不改地采纳,ISO官方给予的名称为:ISO/IEC 9899,所以ISO/IEC9899:1990也通常被简称为“C90”。1999年,在做了一些必要的修正和完善后,ISO发布了新的C语言标准,命名为ISO/IEC 9899:1999,简称“C99”。在2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899:2011,简称为“C11”。
2.C语言特点
(1)基本特性
·高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来的工作单元。
·结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
·代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件操作的场合,优于其他高级语言。
·使用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。
(2)特有特点
·C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。
·C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。
·不同的变量类型可以用结构体(struct)组合在一起。
·只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。
·通过指针(pointer),C语言可以容易的对存储器进行低级控制。
·预编译处理(preprocessor)让C语言的编译更具有弹性。
3.C语言优缺点
(1)优点
·简洁紧凑、灵活方便
C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
·运算符丰富
C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。
·数据类型丰富
C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。
·表达方式灵活实用
C语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,其程序设计更主动、灵活。它语法限制不太严格,程序设计自由度大,如对整型量与字符型数据及逻辑型数据可以通用等。
·允许直接访问物理地址,对硬件进行操作
由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。
·生成目标代码质量高,程序执行效率高
C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编程序生成的目标代码效率低10%~20%。
·可移植性好
C语言在不同机器上的C编译程序,86%的代码是公共的,所以C语言的编译程序便于移植。在一个环境上用C语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境中运行。
·表达力强
C语言有丰富的数据结构和运算符。包含了各种数据结构,如整型、数组类型、指针类型和联合类型等,用来实现各种数据结构的运算。C语言的运算符有34种,范围很宽,灵活使用各种运算符可以实现难度极大的运算。
C语言能直接访问硬件的物理地址,能进行位(bit)操作。兼有高级语言和低级语言的许多优点。
它既可用来编写系统软件,又可用来开发应用软件,已成为一种通用程序设计语言。(www.xing528.com)
另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
(2)缺点
·C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。
·C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。
·从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。
8.2.2 C++
C++现在并不是需求最多的语言,以后也不会是,但是在它的领域中,它是无可替代的。
C++的应用领域主要有游戏开发、嵌入式开发、桌面开发、操作系统开发(要配合C语言)等。这些领域都是对很接近系统底层、对运行效率要求很高的,而C++程序正好有很高的运行效率。
2011年发布了C++11标准,这对C++是一次巨大的增强,从TIOBE编程语言排行榜的变化趋势来看,C++也因为11标准的逐渐普及而变得更受欢迎。C++永远不可能取代Java成为最受欢迎的语言,但是也没有语言能够来蚕食它的应用领域。虽然历史上有很多语言曾经号称要取代C++,但是没有一个语言成功了。安全性、开发效率与运行效率是不可兼得的,C和C++注重运行效率,于是成了底层开发的首选。
1.C++发展历史
语言的发展是一个逐步递进的过程,C++是直接从C语言发展过来的,1979年4月Bjarne博士等人试图去分析UNIX的内核,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样将内核模块化。同年10月,Bjarne博士完成了一个可以运行的预处理程序,称之为Cpre,它为C加上了类似Simula的类机制。在这个过程中,Bjarne博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让Bjarne博士等人组成一个开发小组,专门进行研究。当时这种新语言不叫做C++,而是C with class,这是把它当作一种C语言的有效扩充。由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是我们的Bjarne博士更具有先见之明,他为了避免受到C语言的局限性,参考了很多的语言,例如:从Simula继承了类的概念,从Algo168继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。
1983年8月,第一个C++实现投入使用,同年12月,正式命名为CPlusPlus,即C++。
1985年2月,第一个C++Release E发布,同年10月,Bjarne博士完成了经典巨著The C++Programming Language第一版。1998年11月,C++语言的ISO标准被批准。
2.面向过程程序设计
先分析解决问题的步骤,然后用函数一步步实现这些步骤,再依次调用。
(1)主要解决科学计算问题,用户需求简单而固定
(2)特点:
·分析解决问题所需的步骤;
·利用函数实现各个步骤;
·依次调用函数解决问题。
(3)存在的问题:耦合度较高,不易扩展、复用、维护
(4)以五子棋为例,面向过程就是先划分步骤:开始游戏、黑手下棋、绘制、判断输赢、白手下棋、绘制、判断输赢、返回黑手下棋步骤、输出输赢结果。对于每个步骤,都用方法来实现,然后调用即可。
3.面向对象程序设计
先将构成问题的事务分解成各个对象,然后对各个对象在解决过程中需要完成的行为进行定义,通过调用各个对象的行为来解决问题。
(1)将现实中的事物直接映射到程序中,可直接满足用户需求。
(2)封装:指将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现,外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程序在使用某一对象时不需要关心该对象的数据结构细节及实现操作的方法。使用封装能隐藏对象实现细节,使代码更易维护,同时因为不能直接调用、修改对象内部的私有信息,在一定程度上保证了系统安全性。
(3)继承:来源于现实世界,一个最简单的例子就是孩子会具有父母的一些特征,即每个孩子都会继承父亲或者母亲的某些特征,当然这只是最基本的继承关系,现实世界中还存在着更复杂的继承,面向对象之所以使用继承机制主要是用于实现代码的复用多个类所公用的代码部分可以只在一个类中提供,而其他类只需要继承即可。
(4)多态:指在继承体系中,所有派生类都从基类继承接口,但由于每个派生类都是独立的实体,因此在接收同一消息的时候,可能会生成不同的响应。多态的作用作为隐藏代码实现细节,使得代码能够模块化;扩展代码模块,实现接口重用。简单来说:一种行为产生多种效果。
(5)优势
·构建的软件能够适应用户需求的不断变化;
·直接利用面向过程方法的优势而避开其劣势。
(6)以五子棋为例:面向对象需要先分析问题设计到了哪些对象:玩家对象(黑白手,行为是下棋)、棋盘系统(行为是绘制图画)、规则系统(行为是判断输赢)。利用玩家对象进行下棋(接收输入),然后告知棋盘对象棋子已经改变;棋盘对象进行绘制,然后告知规则对象进行胜负判断。
4.C语言和C++语言
C语言是一种面向过程的程序设计,而是一种面向对象的程序设计。
在C语言的基础上,C++增加了下面的内容:
(1)类型检查更加严格
(2)增加了面向对象机制
(3)增加了泛型编程的机制
(4)增加了函数重载和运算符重载。
(5)异常处理机制
(6)标准模板库STL。
5.C++的特点
(1)C++保留了C语言简洁、高效、接近汇编语言的特点,还能进行更严格的类型检查,比C语言更安全。
(2)对C语言兼容,C语言程序和库可以直接用在C++程序中,或经过简单修改即可。
(3)支持面向对象编程。同时也支持面向过程编程。
(4)重用性,扩充性,可维护性和可靠性较C语言有较大提高,适合编写大型程序和系统软件。
总的来说:C++它不仅支持传统的面向过程编程,也支持面向对象编程。C++运行效率较高,同时能够比较容易地建立大型软件,适合对效率要求高的软件,比如机器学习中的神经网络,大型游戏编程等等。但是C++的内容非常复杂,语言经过了几十年的演化,所以学习起来难度较大,开发效率较低。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。