`
duanhengbin
  • 浏览: 384836 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

从 C -> C++ -> JAVA -> GO 看语言进化历程

阅读更多

最近进了新书《深入理解C++11》和《GO语言编程》,都是国人撰写或参与的佳作。记录一下心得。

 

1972年  C
    由struct领衔,简单而直观的内存布局。
    威力强大的指针的广泛使用,参数传递为传值。 
    缺点:过程式的语言,对于大型软件开发效率低(当然偏硬件的软件如linux是当仁不让的首选)

  

1980年  C++
    完全兼容C的基础上,对象特性的导入(public,virtual,::等) 
        ->后果:导致C++的内存布局非常复杂
    构造函数和析构函数的设计导致new和delete的出现。

        ->后果:程序员的很大精力在于维护delete是否被正确地执行。
    第一大难题就是应对,传值给对象赋值语句造成的麻烦。(到处都有白白浪费无谓的构造函数在执行)
      1)引入操作符重载和引用,实现拷贝赋值操作符。
      2)引用还顺便解决了参数传递的效率问题。
      3)C++11又增加了移动构造函数和完美转发,终于基本解决了堆中临时对象被反复构造对象的情况。

        ->后果:C++的编译器为了上面这些特性真是煞费苦心,C++11中有多达14个默认函数(6个成员函数,8个操作符函数)。很多场合需要各种智能指针来支援(再次引入复杂性)。
    引入异常机制try-catch。
        ->后果:更是让正确调用析构函数的难度雪上加霜。 
    引入泛型和模板,解决集合类型安全问题。(替换法) 
    引入STL,一个经典的集合类实现源码。
    在不断解决C的遗赠问题和导入新特性的同时,也打开了C++编程复杂度的潘多拉魔盒。
    缺点:还用说吗,太复杂了。(从C++那为数众多的“必读”进阶书可以看出学习曲线多么陡峭)
               新的C++11标准更新面之宽,更是让C++有不堪重负的倾向。(目前还在研究中。。。)

 

1995年  JAVA 
    以C++的成功经验为基础,引入虚拟机作为中间层并对C++的特性做了大刀阔斧地改进。

    将所有对象都建在堆上,并且由于垃圾回收机制的引入,废掉了C++的罪恶之源“析构函数”。
    完全使用引用,用很小的代价(所有对象都有引用)规避了C++中传值带来的种种麻烦。

    引入接口interface,简化C++中多重继承的复杂性(组合实现继承)。
    部分实现了泛型。(擦除法)
    参考STL,在JDK中实现了同样经典的JCF版本。(库代码难度比C++低很多)
    对异常的改良,对C++中的try-catch增加了finally,引入受验异常(必须强制捕获)和非受验异常的概念,语言级别强化代码安全性。

    终上所述,JAVA在易用性上的改进是革命性的,直接导致开源项目在JAVA上的极度繁荣。
    缺点:代码臃肿问题越来越明显(好像真不好找呢)

 

2009年  GO 
    参考了前面各种语言的长处,以实用为要义研发的新语言,这里只列举最重要的部分。
    重新回到C时代,完全使用类似C的简洁的数据结构,指针也全面复活(不过不能指针运算)!
    同样使用垃圾回收。

    面向对象时,没有继承,完全用组合替代!(不知道是不是受JAVA得启发)兼顾对象语义与简单内存模型。

    异常处理增加了defer关键字,相比JAVA的“finally”更加简洁。
    语言级别实现了map这个重要的集合关键字。加上slide,相当于实现了STL库中使用率最高的vector和map。

    引入了非侵入式接口,这个东东很有意思,完全颠覆了JAVA的面向接口的传统方法。

     (不过是否更具威力还有待观察)
    从Erlang 借鉴(基于消息传递的并发模型)实现出简洁易用的goroutine并发编程模型。
    缺点:库函数和开发群体正在茁壮成长中,当然还不能和上面的老大哥们相提并论。

 

小结:每一个“新语言”都是站在前辈的肩膀之上,不断吸取优点,摈弃弱点。

            易用性是语言的进化的动力源。
           GO采众家之所长,有着非常优秀的基因,非常值得关注。

分享到:
评论

相关推荐

    编程语言的进代图,编程语言的发展历程。

    C语言的成功催生了一系列派生语言,如C++和Objective-C。 C++在C语言的基础上引入了面向对象编程的概念,允许创建类和对象,增强了代码的封装、继承和多态性,极大地提高了软件开发的效率和复用性。随后,Java在C++...

    编程语言进化史1

    编程语言的进化历程是一部充满创新和技术革新的历史。自20世纪50年代以来,编程语言的发展推动了计算机科学的进步,极大地改善了程序员的工作效率,同时也塑造了现代软件开发的格局。 1956年,FORTRAN(公式翻译)...

    Java2参考大全

    C语言的成功在于它不仅解决了早期语言的问题,还为后来的编程语言(如C++和Java)奠定了基础。 #### 二、Java语言的特点与优势 **2.1 面向对象的特性** Java语言继承了C++中的面向对象特性,同时对其进行了改进和...

    计算机语言发展史大全

    计算机语言的发展历程是一个丰富多彩的故事,它反映了人类与机器交流方式的不断进化。这份"计算机语言发展史大全"涵盖了从早期的机器语言、汇编语言,到高级编程语言,再到现代的脚本语言和面向对象语言的整个演变...

    计算机程序设计语言的发展

    计算机程序设计语言的发展历程是计算机科学史上的一个重要篇章,它伴随着计算机技术的演进而逐步进化。自20世纪40年代计算机诞生以来,程序设计语言已经经历了四个主要阶段:机器语言、汇编语言、高级语言以及现代...

    计算机程序设计语言的发展史及现状.pdf

    Eiffel、C++和Java等语言是这一时期的代表,它们极大地促进了软件工程的效率和代码的可复用性。 目前,汇编语言仍用于特定场合,如系统级编程和高性能计算,而高级语言如Python、Java、C#和JavaScript等已成为主流...

    ITeye新闻月刊 - 2015年04月 - 总第86期1

    随着开发环境的不断进化,IntelliJ IDEA逐渐崭露头角,成为Java开发者的新宠。它以其强大的代码感知、内置版本控制集成以及丰富的插件生态系统,挑战了Eclipse作为主流IDE的地位。尽管Eclipse仍然有着广泛的用户...

    计算机程序设计语言的发展史及现状资料.pdf

    Eiffel、C++和Java等语言的诞生,极大地推动了这一概念的发展,使得大型软件项目的设计和管理变得更加有序和高效。 进入九十年代,随着“信息高速公路”计划的提出,互联网的快速发展对计算机语言提出了新的需求。...

    软件架构的趋势

    ##### 静态语言的进化:C至C++至Java/C# C语言作为计算机科学的基石,提供了对内存管理和程序执行效率的深入理解。它不仅教会了开发者如何高效地操作数据结构和算法,还揭示了操作系统层面的细节。C语言的影响深远...

    programming_languages_diagram:编程语言的演变图

    编程语言的演变图展示了计算机编程语言自诞生以来的演进历程,从最早的机器语言到现代的高级编程语言,这一过程反映了计算机科学和技术的快速发展。在编程语言的发展历史中,每一种新语言的出现都是为了更好地解决...

Global site tag (gtag.js) - Google Analytics