`
duanhengbin
  • 浏览: 383417 次
  • 性别: 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采众家之所长,有着非常优秀的基因,非常值得关注。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics