我理解的C++

C++用了很多年了,昨天有机会和技术高手讨论了一下,感触很多,记录一下吧。

一.编程语言C++

这个小节是把C++作为Programming Language这个topic下面来讨论,C++有三个主要方面的语言特性:面向对象编程,函数式编程,模板编程。

1.     面向对象编程

这个应该是用的最多的方面了,说起来都是教科书上的封装,继承,多态。我个人理解面向对象威力最大的是封装,而面向对象引发出来的设计模式最关键的部分其实也是设计类的封装,继承和多态用来实现。如果封装能够做的很好,C也可以做很多事情,比如gtk就是一个很好的例子。如果要分析原因,大概是因为在内存里面,C++的类和C的struct组织结构本来就是类似的,C里面只需要显式的传递this指针就可以了。继承的话嵌套的struct也可以勉强,但是多态我不清楚怎么能在C做到,访问控制的话也比较难,所以说C++比C抽象高级一点,对一般程序员友好一点,开发效率也高一点。

2.     函数式编程

函数式最大的特征就是无状态,也就是说,是线程安全的,而且是最高级别的线程安全,所以说函数式在多线程,并行方面有天然的优势。因为用过lisp, 所以我一看到对一个container里面的每一个元素要做什么操作,第一反应就是上lambda,可读性什么的都是小事,最大的好处是,假如foreach,map,filter等函数有了并行的版本,代码不需要修改就可以享受到并行带来的提速。

当然函数式也有一些特性C++并没有引入,比如pattern maching,据说C++17要引入。

3.     模板编程

模板编程强大的地方是静态类型安全。因为很多的代码错误都是因为类型引起的,静态类型安全可以在编译期就发现这类问题,这个是工程界的福音,虽然还没有普及开,但是肯定会用的越来越多,因为用了都说好。还有模板元编程,因为是Turing complete,再配合上函数式,可以更高效更优雅的完成很多事情,当然也有了更多的奇技淫巧。

     研究过Programming Langrage以后,看什么语言感觉都挺像的,会自动脑补成一些AST,甚至汇编,唯一的不一样就是语法设计的美丑。C++的语法设计的其实挺好的,不过也可能是我看习惯了,一些新语言就看不惯,比如Ruby, Rust,看上去很不老实。

    昨天和高手聊的时候我很自信的说了一句“我觉C++对我来说没有什么我不知道的”,前提还是我想不起来mutual, 说不出RAII是什么,就显得很自负,其实我真实的意思是“C++对我来说没有什么新鲜的东西了”,因为程序语言就那么多东西。但是理解程序语言和实际应用语言是两个维度的事情,接下来谈谈C++的应用。

二.工程语言C++

有很多程序语言设计的比C++高级,优雅,但是就工程应用方面来说C++还是强无敌,我个人工程经验比较单薄,只操练过一些小项目,做出来能够展示的作品的语言有C++,Java,Common Lisp,Python,C# + asp.net,PHP,Javascript,VB等,但是没吃过猪肉也见过猪跑,厚着脸皮勉强谈一下吧。

1.      C++最强大的理念就是zero-overheadabstraction,保证了C++在运行时的效率,这在工程上来说是很重要的一个指标。C++在改进的时候还在考虑提升运行时的效率,比如右值应用,还有模板元编程。

2.      第一节里面的C++支持的三个特性也是C++的优势,可以在开发中随便选用适合的特性。面向对象用来组织有明显层次结构的数据结构,用来实现RAII,模板用来开发通用的一些算法和组件,函数式在C++的应用还没有完全体现它应有的威力,不过现在机器学习,人工智能这么火,应该也很快能爆发出它的价值吧。

3.      然后就是C++语言标准里面的标准库,能写在语言标准里面,可以看出对这些库的重视程度,为的就是大规模应用起来的方便,当然现在还有很多库的标准还在建立的过程中,比如正则表达式,网络等,对大规模开发很重要的Module好像也已经提到了C++语言标准的提案里面,C++还在变得越来越强大。

4.      现在还有一个优点就是从C++11开始对程序员的友好。C++的复杂一方面是由于自身本身的复杂性,第一节里面提到的三个特性每一个都不太好对付;另一方面是因为C++11以前确实表达起来很复杂。但是C++11之后就好很多了,比如auto, using, for循环的一些简写,让C++的可读性变得非常棒。工程上人力的考虑也很重要,Java能有现在的地位有一个功劳就是学习起来简单粗暴。如果可读性高了,那么学习起来也比较容易,开发效率也会显著提高。

    除了项目中用过的语言,我学习研究过的语言还有Scheme,Racket, Ruby,Lua,OCmal,汇编。对于工作而言,我最爱的是C++,就像战士爱手里的枪,不过下了战场以后,我最喜欢的程序语言的还是Scheme。

    这就是我对C++的理解,程序语言算是“气宗”,工程语言算是“剑宗”,每个人适合修炼的方式不一样,学习加实践,最后总能融会贯通。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值