最近拜读新书《深入理解C++11》和《GO语言编程》,都是国人撰写或参与的佳作。记录一下心得。
?
1972年? C
??? 由struct领衔,简单而直观的内存布局。
??? 威力强大的指针的广泛使用,参数传递为传值。?
??? 缺点:过程式的语言,对于大型软件开发效率低(当然偏硬件的软件如linux是当仁不让的首选)
??
1980年? C++
??? 完全兼容C的基础上,对象特性的导入(public,virtual,::等)?
??????? ->后果:导致C++的内存布局非常复杂
??? 构造函数和析构函数的设计导致new和delete的出现。
??????? ->后果:程序员的很大精力在于维护delete是否被正确地执行。
??? 第一大难题就是应对,传值给对象赋值语句造成的麻烦。(到处都有白白浪费无谓的构造函数在执行)
????? 1)引入caozuofu.html" target="_blank">操作符重载和引用,实现拷贝赋值操作符。
????? 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,引入受验异常(必须强制捕获)和非受验异常的概念,语言级别强化代码安全性。
??? 缺点:代码臃肿问题越来越明显(好像真不好找呢)
?
2009年? GO?
??? 参考了前面各种语言的长处,以实用为要义研发的新语言,这里只列举最重要的部分。
????重新回到C时代,完全使用类似C的简洁的数据结构,指针也全面复活!
??? 同样使用垃圾回收。
??? 面向对象时,没有继承!完全用组合替代!(不知道是不是受JAVA得启发)
??? 异常处理增加了defer关键字,相比JAVA的“finally”更加简洁。
??? 语言级别实现了map这个重要的集合关键字。
??? 引入了非侵入性接口,这个东东很有意思,完全颠覆了JAVA的面向接口的传统方法。
???? (不过是否更具威力还有待观察)
??? 从Erlang 借鉴(基于消息传递的并发模型)实现出简洁易用的goroutine并发编程模型。
??? 缺点:库函数和开发群体正在茁壮成长中,当然还不能和上面的老大哥们相提并论。
?
小结:每一个“新语言”都是站在前辈的肩膀之上,不断吸取优点,摈弃弱点。
????????????易用性是语言的进化的动力源。
?????????? GO采众家之所长,有着非常优秀的基因,非常值得关注。