个人对c++语言的理解,猜测一下语言创造者的思想
2016-08-13 04:29
295 查看
c++语言被创造出来已经好几十年了,赞誉有之,批评有之。
它所蕴含的理念也有了各种各样的解读。
为什么c++会变得如此庞大,为什么会被设计成这样?
我个人也有一些思索,帮助初学者如何更好理解c++语言。
从历史上看,c语言的许多特效是为了方便编译器的设计者而建立的。
基于这种理念,c语言假定程序员完全知道自己在做什么,使用者对底层的实现细节了如指掌,保证自己的所作所为是正确的。
所以c语言没有数组越界检查,各种复杂奇怪的操作符写法,重复定义的操作符等等。
而c++显然部分继承了这个思想。
c++提供了非常多的功能,每个功能又包含众多细节,几乎被全世界抱怨难以学习。
我今天晚上突然想到:“c++的创始者多半是个军迷。”
当然,这是玩笑话。
但是用军事战争来类比,实在太恰当了。
士兵们要上战场了,c++的创始者可能经过了如下思索:
1. 首先要准备一把高精度的步枪,方便远距离杀敌。
2. 准备一把冲锋枪,方便中近距离压制敌人。
3. 准备一把手枪,弹夹容量不能太小,方便在危机时使用。
4. 准备工兵铲,可以挖战壕,以及用来肉搏。
5. 不要忘了准备手榴弹,对付躲起来的敌人很好用。
6. 还要携带RPG,否则在对付装甲目标时,会手足无措。
…………
…………
我们还可以写上更多的东西,比如防弹衣,单兵通讯设备等等。
最后看起来那个士兵象什么?
借用一个来自网络的图片:
c++庞大的体系正是这样的,它的创造思路实际上体现了一种选择权。
程序员(士兵)有足够多的选择,以应对不同的情况。
显而易见,一个菜鸟士兵,肯定不如一个老兵。
老兵能熟练掌握这些武器,并且知道在什么环境下,以何种方式使用它们。
从这个角度来说,c++没有任何错误,它避免了最糟糕的情况——士兵们只有手枪,却要去对付装甲目标,因为士兵们没有选择。
c++从来没有要求程序员,必须时刻背着“小山”一样庞大的武器战斗。
了解了这个,我们回过头来看 bjarne stroustrup 的话:“轻松使用这种语言,不要觉得必须使用所有的特性。”
而另一位创造者anderw koenig说:"编程中最困难的的部分不是去学习语言细节,而是理解问题的解决之道。面向对象仅仅是c++的手段之一,而不是全部。“
如果不分场合背着所有的武器装备,别说参加战斗了,连走路都困难。
还记得开头部分,c++部分继承了c的思想么? 它假定程序员完全知道自己在做什么,并能恰当的使用。
听起来似乎是“推卸责任”,实际上真不是,它的设计思想就是如此。
最后总结:
实际上使用不当者违背了剃刀原理:“如无必要,勿增实体”,如果你面对的问题不需要,那就不要去用。
而c++的创造者并没有违背:“提供更多选择,以应对不同的情况,非常有必要。”
它所蕴含的理念也有了各种各样的解读。
为什么c++会变得如此庞大,为什么会被设计成这样?
我个人也有一些思索,帮助初学者如何更好理解c++语言。
从历史上看,c语言的许多特效是为了方便编译器的设计者而建立的。
基于这种理念,c语言假定程序员完全知道自己在做什么,使用者对底层的实现细节了如指掌,保证自己的所作所为是正确的。
所以c语言没有数组越界检查,各种复杂奇怪的操作符写法,重复定义的操作符等等。
而c++显然部分继承了这个思想。
c++提供了非常多的功能,每个功能又包含众多细节,几乎被全世界抱怨难以学习。
我今天晚上突然想到:“c++的创始者多半是个军迷。”
当然,这是玩笑话。
但是用军事战争来类比,实在太恰当了。
士兵们要上战场了,c++的创始者可能经过了如下思索:
1. 首先要准备一把高精度的步枪,方便远距离杀敌。
2. 准备一把冲锋枪,方便中近距离压制敌人。
3. 准备一把手枪,弹夹容量不能太小,方便在危机时使用。
4. 准备工兵铲,可以挖战壕,以及用来肉搏。
5. 不要忘了准备手榴弹,对付躲起来的敌人很好用。
6. 还要携带RPG,否则在对付装甲目标时,会手足无措。
…………
…………
我们还可以写上更多的东西,比如防弹衣,单兵通讯设备等等。
最后看起来那个士兵象什么?
借用一个来自网络的图片:
c++庞大的体系正是这样的,它的创造思路实际上体现了一种选择权。
程序员(士兵)有足够多的选择,以应对不同的情况。
显而易见,一个菜鸟士兵,肯定不如一个老兵。
老兵能熟练掌握这些武器,并且知道在什么环境下,以何种方式使用它们。
从这个角度来说,c++没有任何错误,它避免了最糟糕的情况——士兵们只有手枪,却要去对付装甲目标,因为士兵们没有选择。
c++从来没有要求程序员,必须时刻背着“小山”一样庞大的武器战斗。
了解了这个,我们回过头来看 bjarne stroustrup 的话:“轻松使用这种语言,不要觉得必须使用所有的特性。”
而另一位创造者anderw koenig说:"编程中最困难的的部分不是去学习语言细节,而是理解问题的解决之道。面向对象仅仅是c++的手段之一,而不是全部。“
如果不分场合背着所有的武器装备,别说参加战斗了,连走路都困难。
还记得开头部分,c++部分继承了c的思想么? 它假定程序员完全知道自己在做什么,并能恰当的使用。
听起来似乎是“推卸责任”,实际上真不是,它的设计思想就是如此。
最后总结:
实际上使用不当者违背了剃刀原理:“如无必要,勿增实体”,如果你面对的问题不需要,那就不要去用。
而c++的创造者并没有违背:“提供更多选择,以应对不同的情况,非常有必要。”
相关文章推荐
- 编程思想之理解符号语言
- 黑马程序员--07.集合框架--并发访问异常理解:一个单线程程序的多线程运行思想【个人总结】
- 个人编程思想理解的片段(主要是面向对象的,参考了许多人的观点,还不成熟,没形成系统,请大家多指点)
- 从零开始学java:面向过程,面向对象等编程思想个人理解
- P86页《数据结构与算法 Python语言表达》关于“判断谓词”的个人理解
- msOS 中分层与注册思想的个人理解
- Objective-C是动态运行时语言的个人理解
- JSP---MVC思想的一点个人理解
- 简单梳理一下Android中MVP设计思想,个人学习用
- go语言连接mysql数据库的个人理解
- 谈一下个人对编程的理解
- 黑马程序员--面向对象思想的个人理解以及类中成员
- 翁恺老师零基础学JAVA语言第五周数组--求平均数例题-个人理解
- 计算机语言发展史的个人理解
- Java语言的个人理解
- 翁恺老师零基础学JAVA语言第五周数组--投票程序例题-个人理解
- 第2篇 入门-tinyos编程思想(我对TinyOS1.x的理解,个人心血之作)
- 1.说说你个人理解的存储解决方案的发展趋势,作图描述。 11.png 2.画一张说明ASM实例同数据库实例协同工作的原理图,并给出语言描述。 14.png 一个监听器可以为多个实例
- AOP思想个人理解以及实战静态代理、JDK动态代理、CGlib动态代理
- Java编程思想个人理解 第二章 一切都是对象