最近进了新书《深入理解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采众家之所长,有着非常优秀的基因,非常值得关注。
相关推荐
比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。 最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储...
程序的预定表达式为: E->E+T, E->T, T->T*F, T->F, F->(E), F->i 对该表达进行自上而下的语法分析 输入匹配字符串时,结束输入最后加# 例:请输入分析的字符串:i+i*i#
C++ pytoch -> onnx -> ncnn
最近项目需要,需要实现C++客户端和WCF服务器双工通信。但C++没有好用的WCF实现框架。经过一番折腾,想出了个通过COM与C#的WCF客户端通信的方法。拿出来分享一下。
编译原理 算符优先分析法 E->E+E|E-E|E*E|E/E|(E)|i 编译原理 算符优先分析法 E->E+E|E-E|E*E|E/E|(E)|i 虽然没有给出如何求优先关系,事先存储在矩阵中
汉诺塔算法 C++ 有截图 结果如下: 请输入盘子数:4 各步骤如下: ...A-->C B-->C A-->B C-->A C-->B A-->B A-->C B-->C B-->A C-->A B-->C A-->B A-->C B-->C 总步骤数为:15 Press any key to continue
project->settings->C/C++->preprocessor->additional include directory-> C:\temp\systemc-2.0.1\src Add Systemc.lib: project->add to project->files-> C:\temp\systemc-2.0.1\msvc60\systemc\debug\systemc....
一个好用的角度转换软件,用MFC做的。可以在度分秒-->度,度-->度分秒之间进行角度转换,release形式的,可以直接运行,不用安装vc和vs。
最近项目需要,需要实现C++客户端和WCF服务器双工通信。但C++没有好用的WCF实现框架。经过一番折腾,想出了个通过COM与C#的WCF客户端通信的方法。拿出来分享一下。 有不明白的请看博客:...
树的遍历系统 C语言 数据结构 C++ void preorder(Bitree *bt) //先序遍历二叉树 { if(bt) { printf("%c\t",bt->data); preorder(bt->lchild); preorder(bt->rchild); } } void inorder(Bitree *bt) //中序遍历...
string->int时只要遇到字母字符串就停止输入
2. 确认 项目属性-> C++ -> 代码生成 -> 运行库为 多线程DLL(/MD), 否则从ResultSet中getString() 会 crash 3. 修改 项目属性-> 链接器 -> 附加库目录 , 指向你的MSVC OCCI lib 和dll所在目录, 我的是: D:\Oracle\...
Dev-C++调试方法简明图文教程 把“生成调试信息”设置为 Yes 编译程序 设置断点(Break point) 开始调试(Debug) 查看变量的值
rotate.dev -> C 工程文件 (使用 dev-C++打开) rotate.dsw -> C 工作文件 (使用 Visual-C++ 6 打开) rotate.dsp -> Visual C++ 6 工程文件 dllmain.c -> 主要旋转函数 dll.h -> 头文件 (函数原型) cc.c -> 辅助功能,...
开发环境 C++标准:C++11 IDE:Visual Studio 2019 已在Windows VS 调测通过 有问题请csdn私信联系我 概述 一个用C++编写的学生成绩管理系统,通过 struct 结构体来储存成绩数据,...12.备份学生成绩数据 --> 菜单13
* (1)X ->+TX (2)X ->-TX (3)X ->ε * (4)T ->FY * (5)Y ->*FY (6)Y ->/FY (7)Y ->ε * (8)F ->(E) (9)F ->i * 思路:其中i指代数字。先通过词法分析,将实际数字识别 * 用i替代,再进行分析。如 * 3.14*2 => i*i *...
文件内容概要: ...6、 _debug改成NDEBUG进行调试,project->setting->C/C++->Preprocessordefinitions(中文版是项目->属性->C/C++->预处理器->预处理定义)(这里是debug和Release编译的重要不同之一)
cpp代码-C和C++:一些符号 || && ! :: . -> %
一款用C++编程实现的期末考试题目上机预测分析程序源代码,期末考试编程实现题,已通过老师满分测试,相信很多同学需要用到。
s->base=(char *)realloc(s->base,(s->stacksize+ADDlEN)*sizeof(char)); s->top=s->base+s->stacksize; } *s->top=e; s->top++; } char pop(stack *s) { char e; if(s->top==s->base) return 0; s->top--;...