[课业] 16 | C++ | C++的发展

C++的发展路径

C++的发展路径总图示

结构化编程特性的发展

结构化编程特性的发展路径对应总图中的左边的轨迹

  1. 1953年,John Backus发表了首个高级程序设计语言Fortran
    Backus提出:汇编程序是符号化的机器语言程序,本质并未改变,这样不太好
    Backus提出speedcoding的概念,目标并不是作为针对计算问题描述的形式,只是为了加速编程,这在移植上带来很大问题
    Fortran与纯粹的高级程序设计语言(即与机器无关的语言)之间还是有一些差距的,Fortran的诞生展示了可以用科学界采用的表示方法来描述计算过程
  2. 1958年开始,人们觉得可以将与机器脱离的语言提升到一个新高度,脱离计算机本身的地方性,将高级程序语言作为科学来研究,制作出通用语言
    1958年开始,大家发现程序可以不用机器语言来描述,语言作为独立的学科;并由一批人开始做这方面的研究
    – Perlis主持(Backus也有参与),进行程序设计语言的研究,称之为IAL(国际代数语言),致力于让program脱离机器(机器指冯诺伊曼结构的机器);结论是,想脱离机器,就要有compiler(因为只有compiler才能使对程序的描述脱离机器本身
    – Dijkstra也参与了上述研究,他设计了compiler
    这一研究成果(如上两点所述),最终发展成语言Algol 60
    附:Dijkstra还提出GO TO是有害的观点(与Knuth一起)
  3. 1965、1966年,Algol 60在结构化编程方面又进一步发展,诞生了Algol 68(其实在Algol 60与Algol 68之间还有一个Algol W)
    Algol 68的诞生有三个重点人物的影响:Knuth,Hoare,Wirth
    Wirth,在Algol 60的基础上,在IBM上做了Algol W,Algol W最后走到了Algol 68
    Knuth,提出GO TO是有害的,并有论文论证:没有GO TO,依旧可以表示结构化编程
    Hoare,进行了操作语义方面的研究

这就是C++语言从Algol 68中继承部分的发展

贴近机器特性的发展

贴近机器特性的发展路径对应总图中的中间轨迹

  1. BCPL由CPL发展而来
    CPL是由剑桥来做的程序设计语言
    后来CPL延伸到BCPL,BCPL贴近机器本身,是为了能写出高效程序设计的
  2. BCPL的一个想法:由于不同计算机的I/O系统差异很大,故I/O不作为语言成分,而是作为Lib成分剥离开来,是程序设计语言有更好的移植性(如cout、cin等,是函数,不是语言成分)
  3. BCPL后续发展为C,两位科学家Ritchie,Thompson
    Thompson,要写Unix操作系统,他发现,BCPL可以胜任因为BCPL贴近机器,但他发现该语言太乱;Thompson去掉了BCPL中他觉得乱的部分发展成B,又与Ritchie一同将它发展成C

C++能从系统程序软件一直写到应用软件,他的这种很强的与底层硬件沟通交流的能力是由BCPL继承来的
从C,与面向对象特征结合形成C with class,再结合结构化部分与其他特性,形成C++

面向对象特性的发展

面向对象特性的发展路径对应总图中的右边轨迹

  1. 面向对象的首个提出者:Dahl,Nygaard
  2. 首个面向对象语言:Simula 67,诞生于1967年
  3. 初衷不是为了解决结构化编程的问题,而是为了解决实际问题时不经意间得到了该思想
  4. Simula 67的背景
    1962年,Nygaard有一个仿真系统项目,要开发一个仿真语言来描述系统
    他有两个选择:Fortran与Algol 60
    结果选择Algol 60作为描述新系统的Simulation Language的Base,因为Algol 60中已经有了block structure的概念(即局部性的概念),更容易写出更安全的产品
    但是Algol 60不能胜任作为仿真语言,需要进行改动:需要打破LIFO(后进先出)原则(这个原则是编译器决定的)(因为实际上的仿真系统中单元的生命周期要看其具体演化,不是由编译器决定,而是由相互作用与外部环境决定)
    改进措施:
    – 把所能够表示的基本单元封装起来(联想到对象)
    – 既然单元生命周期并不是由compiler能决定的,必得有一个能控制单元生命周期的机制:由pointer对应simulation中的单元,来决定它的生命周期
    – 既然有不同的个体,那么他们的访问控制也是要区分开的(结构化编程里只有一个访问控制,大家都是公开的)
    – 有一个schedule来调度不同个体的运作
    实现:
    – 做了一个runtime system机制来支持这套体制的运行
    – 在Algol 60的基础上做语言扩充,加关键字,又可兼容Algol 60,加个前缀Simula;即语言是在Algol 60基础上扩充,但运行是由一套runtime system机制来支持的,这就是Simula I
    做完Simula I后发现还可以继续做,Simula系统的思想还可以用在别的地方
    进一步扩充:
    – 抽象出公共部分,形成class:在Tony Hoare的帮助下,把描述的个体的公共部分形成了一个抽象层次,叫class和subclass;类和子类就是为了解决复用问题,把公共部分少写代码(并非这些代码不存在,而是由compiler代写)
    – 加入inherit
    – 提出虚函数
    – 加入garbage collector机制
    ——最后形成了Simula 67
  5. Simula 67中,基本提出了所有面向对象的概念
  6. Simula 67影响到之后所有面向对象的语言
  7. Simula 67没被大范围应用的原因:有严重的问题,设计时没有考虑到工业界的普适情况,runtime会带来很大的效率问题

一些高层特性的发展

CLu、Ada等,代表人物Barbara Liskov

C++的诞生

C++语言由Bjarne Stroustrup设计和发展

史前时期:剑桥大学等PhD.论文

  1. 源于Stroustrup1979年剑桥大学博士论文的需要,主题为“研究分布式系统的系统软件组织”(即研究如何将计算机任务分成部分,协作完成任务),这需要多个节点的协作,就想到需要一个能描述单个计算个体的语言
    可选语言:Pascal、Algol 68、Simula等,选择了Simula
  2. 第一阶段
    Simula优点:优秀的组合形式、可读性、支持并发、类型系统、编译捕错能力
    但是失败了,因为性能差(来源于runtime的类型检查与废料收集)(Simula支持动态类型)
    问题出现点:连接器出现问题
    Simula最缺一个高效的Linker

连接器简述
写了程序后,分成两部

  • 编译:有一个文件在理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值