您的位置:首页 > 编程语言 > C语言/C++

与孟岩先生商榷,就C++的一些一般问题的另一些观点

2010-09-20 13:51 288 查看
孟岩先生是本人非常尊敬的一位学者,尽管似乎不从事职业的开发工作,但是在C++方面有极深的造诣,在很早的时候就在国内C++技术社区推广真正的C++技术。在长时间的潜伏之后,孟岩先生宝剑再次出手,开始持续更新其在CSDN的博客。近日,在最新的一篇博客上,他谈到一些关于C++的思考和评论。由于文中涉及的点非常广泛,很难在文后的评论中一一论及,所以专门撰此文。就几个问题请教与孟先生。

第一个孟岩先生提到的所谓共识是“软件开发方面真正有价值的进步,应当是有利于用户、有利于项目管理、有利于解决领域问题,而不是有利于程序员”,似乎不妥。原因在于,程序员不是独立于“用户”,“项目管理”和“领域问题”的,相反,这些全部都是软件开发生态的一部分,而程序员是其核心。为何这么讲?因为是程序员是实现着一切。如果不能保证程序员在其中的关注度(或者利益?),程序员很容易转业到其他行业,而整个软件行业很快就会被淘汰。文后所举的例子,诸如使用汇编代替机器语言,从用户,项目管理以及领域问题的角度看来都是透明的。技术的进步都是首先是的程序员得到实惠,然后导致成本降低,从而用户得到实惠。由此也可见,他们是并生关系而非对立。孤立地从有利于什么的角度来使其对立起来,只能导致混淆和错误。

第二个是文中举的一个例子。孟岩兄认为,类似于操作符重载这样的技术带来的坏处远远大于其好处。对这样的观点真是遗憾。因为这个是非常技术的观点,我试着从几个方面来阐述之。

1) 从人类的认知角度考虑,一致的符号系统非常有利于快速理解接触全新的东西。这是使用基本的*,+,-,/等操作符,都是任何有基本数学背景的人都耳熟能详的,而且有一个直观的理解。我一直认为,消除复杂性是编程的根本任务。而用操作符重载就是其中的一个有效手段,因为它本质上减少了要记忆的符号数目,这对于快速的阅读代码是非常重要的,因为人类思维可以同时关注的概念只有几个。

2) 从代码的构造角度,使用同样的符号为OO系统中的覆盖提供了可能。虽然可能并不适用于这种运算符重载。但是其本质上是一致的。其中提到的另一个问题,就是这些特性的互作用导致的复杂性,确实是C++使用面临的很大的问题,也是需要我们需要努力的地方。可以期望,未来的C++会在这方面有更加长足的进步。具体到现实使用,使用一个根据情况具体限制的C++特性之极,并且遵循基本的最佳实践,完全可以规避其中导致的额外复杂性。C++所有的特性并不是必须要用的。

3) 从表达能力上看,“程序的表达能力,只有在反映了其抽象能力的提高时,才是重要的”,确实如此。不过,这里例子恰恰是抽象能力有所提升的例子(当然不会是质的提升,细微的提升也是进步)。对于原先的版本,其额外的表达能力表现在类数学性的表达式风格暗示着这些概念对应于其数学抽象,并且遵循基本的运算规则.这对于阅读并且理解代码很有好处。

关于几个抽象,总结的非常到位。这是最后关于静态类型的讨论,不敢苟同。一般认为,类型系统是伴随着编译模型。传统的编译模型中,目标代码是纯粹的数据和逻辑代码的集合,不包含任何的类型信息。所以类型系统的作用在于帮助避免程序员犯错。另一方面,类型系统还有一个很大的作用是表征设计概念的完整性,这个可能更加重要。动态类型系统使得二次开发成为可能,而静态类型系统则极大地提升了执行效率。这只是设计目的不同的导致的策略选择,而非任何一个有压倒性的优势。

最后一点不同意的是,模板并不是放松类型系统,而用提供了另外一种机制,使得构造强类型的系统更加有效。没有人为了抽象而抽象,每一中抽象背后都隐含着额外的需要,或者是编译器限制,或者是某种设计考虑,或者是为了更上一层次的可移植性。无论哪一种,都在其合适的领域有其作用。现在就评论是否有用还为时尚早。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: