语言基础(1):C++发展历史

一、C语言的发展阶段

1958年,ACM小组(美国计算机协会)和以当时联邦德国的应用数学和力学协会(GAMM)在苏黎世把他们关于算法表示法的建议综合为一,是一种编程语言,被命名为IAL(国际代数语言,International Algebraic Language),后来改称Algol 58。ALGOL家族的第一个成员,图灵奖获得者:艾伦.佩利(Alan J.Perlis)在巴黎举行的有全世界一流软件专家参加的讨论会上,发表了"算法语言Algol 60报告",确定了程序设计语言Algol 60。Algol60语言的第一个编译器由Edsger W. Dijkstra来实现。1962年,艾伦。佩利又对Algol 60进行了修正。

 

1963年,英国剑桥大学推出了CPL(Combined Programming Langurage)语言。CPL语言在ALGOL 60 的基础实现,并且上接近硬件。

 

1967年,剑桥大学的 MartinRichards CPL 语言进行了简化,于是产生了 BCPL(Basic Combined Programming Language)语言。

1960s,美国 AT&T 公司贝尔实验室研究员 Ken Thompson 闲来无事,手痒难耐,想玩一个他自己编的,模拟在太阳系航行的电子游戏——Space Travel。他背着老板,找到了台空闲的机器——PDP-7。但这台机器没有操作系统,而游戏必须使用操作系统的一些功能,于是他着手为PDP-7开发操作系统。后来,这个操作系统被命名为——UNIX,Ken Thompson 使用 B 语言编写,它以 BCPL 语言为基础的,是一门很简单且很接近硬件的语言(取BCPL的首字母)。

1971年,同样酷爱 Space Travel Dennis M.Ritchie 为了能早点儿玩上游戏,加入了 Thompson 的开发项目,合作开发 UNIX。他的主要工作是改造 B 语言,使其更成熟,1972年,D.M.Ritchie 在 B 语言的基础上最终设计出了一种新的语言,他取了 BCPL 的第二个字母作为这种语言的名字,这就是 C 语言。

1973年,C 语言的主体完成。Thompson Ritchie 迫不及待地开始用它完全重写了 UNIX。此时,编程的乐趣使他们已经完全忘记了那个 "SpaceTravel",一门心思地投入到了 UNIX C 语言的开发中。随着 UNIX 的发展,C 语言自身也在不断地完善。直到今天,各种版本的UNIX 内核和周边工具仍然使用 C 语言作为最主要的开发语言,其中还有不少继承 Thompson Ritchie 之手的代码。在开发中,他们还考虑把 UNIX 移植到其他类型的计算机上使用。C语言强大的移植性(Portability)在此显现。机器语言和汇编语言都不具有移植性,为x86开发的程序,不可能在 Alpha, SPARC和 ARM 等机器上运行。而 C 语言程序则可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的 C 语言编译器和库,然后将 C 源代码编译、连接成目标二进制文件之后即可运行。

1977年,Dennis M.Ritchie 发表了不依赖于具体机器系统的 C 语言编译文本《可移植的C语言编译程序》。

1982年,很多有识之士和美国国家标准协会为了 C 语言健康地发展,决定成立 C 标准委员会,建立 C 语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,C 语言作者和应用程序员组成。

1989年,ANSI 发布了第一个完整的 C 语言标准——ANSI X3.159—1989,简称“C89”,也习惯称其为“ANSI C”。C89 在1990年被国际标准组织 ISO(International Organization forStandardization)一字不改地采纳,ISO 官方给予的名称为:ISO/IEC 9899,所以ISO/IEC9899:1990也通常被简称为“C90”。

1994年,国际标准化组织(ISO)和国际电工委员会(IEC)发布了 C89 标准修订版,名叫ISO/IEC9899:1990/Cor 1:1994 ,有些人简称为 C94 标准

1995年,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C89标准修订版,名叫ISO/IEC9899:1990/Amd 1:1995 - C Integrity ,有些人简称为C95标准

1999年,在做了一些必要的修正和完善后,ISO发布了新的C语言标准,命名为ISO/IEC 9899:1999,简称“C99”。 

2011年,12月8日 ISO又正式发布了新的标准,称为ISO/IEC9899: 2011,简称为“C11”。

2017年,ISO发布C17

 

二、C++语言发展

C++ 是从 C 语言发展而来,而 C 语言是从 B 语言发展而来,B 语言是 BCPL 的一个解释性后代,BCPL 是 Basic CPL。其中最有趣的是 CPL 中 C 的由来,由于当时这个语言是剑桥大学和伦敦大学合作开发的,在伦敦的人员加入之前,C 表示剑桥,伦敦人员加入之后,C 表示 Combined 组合。还有一种非正式的说法,C 表示 Christopher,因为Christopher 是 CPL 背后的主要动力。

最初导致 C++ 诞生的原因是在 Bjarne 博士等人试图去分析 UNIX 的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样将内核模块化。同年10月,Bjarne 博士完成了一个可以运行的预处理程序,称之为 Cpre,它为 C 加上了类似 Simula 的类机制。在这个过程中,Bjarne 博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让 Bjarne 博士等人组成一个开发小组,专门进行研究。

当时不是叫做C++,而是C with class,这是把它当作一种C语言的有效扩充。由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是我们的Bjarne博士更具有先见之明,他为了避免受到C语言的局限性,参考了很多的语言,例如:从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。

C with Class 研制者在C语言的基础上加进去的特征主要有:类及派生类、共有和私有成员的区分、类的构造函数和析构函数、友元、内联函数、赋值运算符的重载等;

C++ 1.0 1985年公布,又添加了一些重要特征:虚函数的概念、函数和运算符的重载、引用、常量(constant)等;

C++ 2.0 1989年推出,更加完善的支持面向对象程序设,新增加的内容包括:类的保护成员、多重继承、对象的初始化与赋值的递归机制、抽象类、静态成员函数、const成员函数等;

C++ 3.0 1993年发布,最重要的新特征是模板(template),此外解决了多重继承产生的二义性问题和相应的构造函数与析构函数的处理等。

C++ 98 标准 C++标准第一版,1998年发布。正式名称为ISO/IEC14882:1998[18] ,绝大多数编译器都支持C++98标准。不过当时错误地引入了export关键字。由于技术上的实现难度,除了Comeau C++编译器export关键字以外,没有任何编译器支持export关键字。并且这个标准对现代的一些编译理念有相当的差距,有很多在高级语言都应当有的功能,它都没有,这也正是后来需要制定C++11标准的原因所在。

 

C++ 03 标准    C++标准第二版,2003年发布。正式名称为ISO/IEC14882:2003[19] 。这个标准仅仅是C++98修订版,与C++98几乎一样,没做什么修改。仅仅是对C++98做了一些“勘误”,就连主流编译器(受C99标准影响)都已支持的long long都没有被加入C++03标准。

C++ 11 标准   C++标准第三版,2011年8月12日发布。正式名称为ISO/IEC 14882:2011[20] 。由C++标准委员会于2011年8月12日公布,并于2011年9月出版。2012年2月28日的国际标准草案(N3376)是最接近于现行标准的草案(编辑上的修正)。C++11包含了核心语言的新机能,并且拓展C++标准程序库,并且加入了大部分的C++ TR1程序库(数学上的特殊函数除外)。此次标准为C++98发布后13年来第一次重大修正。

 

C++ 14 标准    C++标准第四版,2014年8月18日发布。正式名称为ISO/IEC 14882:2014[21] ,C++ 14 是 C++ 11 的增量更新,主要是支持普通函数的返回类型推演,泛型 lambda,扩展的 lambda 捕获,对 constexpr 函数限制的修订,constexpr变量模板化等等。C++14是C++语言的最新标准,正式名称为"ISO/IEC14882:2014(E) Programming Language C++"。C++14旨在作为C++11的一个小扩展,主要提供漏洞修复和小的改进。C++14标准的委员会草案(CommitteeDraft)N3690于2013年5月15日发表。工作草案(Working Draft)N3936已于2014年3月02日完成。最终的投票期结束于2014年8月15日,结果(一致通过)已于8月18日公布。

 

C++ 17 标准    C++17是C++标准第五版,2017年发布,虽说是2017年发布的标准,但是要等到各大编译器支持故意要等很久了,目前编译器都是部分支持而且是TS

 

三、如何理解C++

C++已经是个多重范型编程语言(multiparadigmprogramming language),一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、泛型形式(generic)、元编程形式(metaprogramming)的语言。将C++视为一个由相关语言组成的联邦而非单一语言,在其某个次语言中,各种守则与通例都倾向简单、直观易懂、并且容易记住。

C++的4个次语言:

C 语言:C++以C为基础。区块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(built-in datatypes)、数组(arrays)、指针(pointers)等都来自C。

Object-oriented C ++(OOP) :类(class)、封装(encapsulation)、继承(inheritance)、多态(polymorphism)、虚函数(virtualfunction)等都是面向对象设计在C++上的最直接实施。

Template C++(generic programming) :C++的范型编程(generic programming)部分。他们带来新的编程范型(programmingparadigm),也就是所谓的template metaprogramming(TMP,模板元编程),以及函数重载。

STL(Standard Template Library)template程序库,对容器、迭代器、算法以及函数对象的规约有极佳的紧密配合与协调。

 

四、C++与C的关系

C 语言是C++的基础,C++和C语言在很多方面是兼容的。C语言是一个结构化语言,它的重点在于算法与数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制。所以C语言和C++的最大区别在于它们解决问题的思想方法不一样。

C++对C的“增强”,表现在六个方面:

1)    类型检查更为严格。

2)    增加了面向对象的机制。

3)    增加了泛型编程的机制(Template)。

4)    增加了异常处理。

5)    增加了运算符重载。

6)    增加了标准模板库(STL)。

与C不兼容之处:

C++一般被认为是C的超集合(Superset),但这并不严谨。大部分的C代码可以很轻易的在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中失效,或者在C++中有不同的行为。最常见的差异之一是,C允许从void*隐式转换到其它的指针类型,但C++不允许。另一个常见的可移植问题是,C++定义了新关键字,例如如new,class,它们在C程序中可以作为识别字(例:变量名)的。在C标准(C99)中去除了一些不兼容之处,也支持了一些C++的特性,如//注解,以及在代码中混合声明。不过C99也纳入几个和C++冲突的新特性(如:可变长度数组、原生复数类型和复合逐字常数)。若要混用C和C++的代码,则所有在C++中调用的C代码,必须放在 extern "C" { /* C代码 */ } 内。

 

猜你喜欢

转载自www.cnblogs.com/wnwin/p/10681067.html