昨天看了一个牛人写的“Why C++”,于是在这里胡侃一下。呵呵,里面參杂了个人的感性因素(对语言的偏好)。
在我看来,C++真是一个恐怖的语言。它的两个特点决定了它的恐怖:
1. 有同C一样的破坏力,C++几乎可以做所有的底层操作,几乎没有运行时系统的检查和保护;
2. 比Java/Scala还要复杂,复杂不仅仅指它的语法和语义,还指它编写的程序的结构(例如,不同层次的抽象与各种封装);
这就好比一把AK47有着波音747的操作界面,更恐怖的是,每个程序员构造出来的“波音747”都互不相同,各有特点。(甚至存在着大量的不合格的“波音747”,这种不合格可能体现在结构上,也可能体现在不合格的模板定义、运算符重载、虚函数和多继承等细节上。)
我一直相信,当我们有更高级的语言时,应该使用更高级的语言,把细节的优化、管理交给运行时系统和编译器。程序员不要在陷于这些低级的复杂度中,只有在性能真的出现问题时,才去做出问题的模块的调整和优化。而不是一开始假设所有的模块都会出问题,而采用一种低级的语言,为每个模块人工管理这些细节。
事实上,今天的优化编译器和虚拟机,在内存管理、循环展开、函数内联、部分冗余消除等等方面,做得比绝大部分程序员都要好。这里的绝大部分指95%甚至更高。而且,对于有虚拟机的语言而言,JIT能做的优化比编译型语言更多,因为JIT有运行时的信息。
在http:// 这里,有更全面的对于类似Java这种语言的性能的说明,并且大量引用了第三方的评测数据。其中在Program Speed段说明了,Java的程序在一些情况下已经达到甚至超过了等价的C++程序的性能。一般的普遍共识是,Java程序的平均性能大约是C的50% 。
所以,如果仅仅是因为性能问题而使用C++,那可要考虑/评测清楚了。
C/C++擅长的地方是:内存操作。比如,如果你要实现TCP/IP协议栈,那么C/C++是不二之选,它们可以非常方便的操作缓冲区,拼接消息头和消息体。而如果用Java之类的高级语言,那可就痛苦多了。
长久依赖,我个人的想法就是:在一个软件的高级层次上,使用Java/Scala这样的语言去构造和编写。如果存在某些地方需要做大量性能相关的内存操作,那么就把那个模块(甚至是一个函数)用C/C++实现。
阅读(1666) | 评论(0) | 转发(0) |