bjarne:请看看关于c++数值计算库的链接(例如blitz++、pooma、mtl和root),你可能还会跟踪到另外一些c++数值计算方面的网页。
davorama的评论
这些问题是如此不寻常,使我无法做出定论,或许你们这些人可以提供一些想法?
您怎么看待模板元编程(template meta programming)?您是否认为它是一种“恩赐”,使得聪明的程序员可以做出像blitz项目那样酷毙了的东西?抑或是它所带来的便利完全被其“晦涩乃至近乎看不懂”的实现代码给抵消了?
bjarne:我确实喜欢一些使用c++进行数值计算方面的东西。常见的思路是模板可被用于消除那些伪临时对象(spurious temporaries)。结果往往是以它们自己的游戏规则击败fortran,同时还保持了规范的数学记号。在我的个人主页上,你可以看到以下链接:来自lanl的pooma、来自warterloo u.的blitz++、来自notre dame的mtl。《tc++pl》在数值计算一章有关于这方面基本技术的解释。
我认为实现代码的复杂难懂无关紧要。实际上,我认为那些代码比另外一些代码(比如说c核心代码)要好懂多了。在效率头等重要时,你不该过分抱怨优化技术有多么难懂。毕竟如果你是一个真实用户的话,你没必要阅读它们的实现代码。
sethg的评论
在回答中似乎有一个普遍的主题,即“那些抱怨是基于过时的信息,请使用遵从标准的新编译器和stl。”
有没有人为我们这些c++新手维护一个图表,展示目前哪些可用的c++编译器违反了c++标准文件的哪些小节?
bjarne:一个大致的回答:目前大厂商提供的编译器都已相当符合标准(我使用它们),例如borland、gnu、 metrowerks、 microsoft以及sgi。
更详细的信息请参考lanl的列表(在我的c++网页上有对pooma站点的链接),或者参考一个试图跟踪这类信息的新西兰站点。一些厂商,例如borland,在它们的网站上公布plum hall评估的结果。
还有,你说的对,我认为针对c++而报告的问题有很大比例可以归结为“误解”和“误用”。“有一个现代的c++编译器”是试验我建议的一些技术的先决条件,但是请不要以为一个新编译器本身就会带来多大帮助。你需要真正地改变你的工作方式,不幸的是,现实世界中有太多因素使得这种改变难以实现(遗留代码、缺少学习新技术的时间、多人协作以及过时的风格规则等等)。我没说过这很容易,我只说过这有可能,而且很多人已经取得了成功。
hanwen的评论
可能如今标准库可以减轻我的一些苦恼,但我不想再学习这么一个大型c++组件,另外还因为我知道即便如此,c++仍然不够好。它究竟会不会支持反射(reflection)、高序函数(higher order functions)、垃圾回收?。
这么看来,我发现您的“c++的入门要比c的入门容易一些”的说法是危险的,您在《把标准c++当作一门新语言来学习》中所举出的例子也是如此,因为它们暗示这两门语言中的任意一门都能够或者应该成为一门“入门”语言。
一门语言,区别对待堆和栈上的非直接对象(non-immediate objects),没有自动垃圾回收机制,允许使用指针,无初始化机制,没有任何“高序(higher-order)”内容,您确实希望人们随着这样一门语言成长吗?
您教育人们关于c++的内容:和错误的思想斗争,告诉他们哪里适用c++。但是,您未曾告诉过他们哪里不适用c++。c++广为流行,以至人们容易产生这样的误解:这种流行性说明,c++是一门优秀的编程入门语言,或者,c++是一门适用于编写非常巧妙的程序的语言,等等。
bjarne:实际上,你说的没错。我认为让人们学习一种“当他们毕业后就再也不可能使用”的语言是不妥当的。lisp和函数型编程语言(functional language)社群并没有使得自动垃圾回收机制和高序(higher-order)的方方面面都成为主流,尽管它们拥有学院派以及教育机构长达20多年的热情支持。很明显,我认为让人们使用像c这样的低阶语言也非理想选择。
鉴于目前编程及设计教学的糟糕情况,c++可能会取得一个大的进步。当然了,人们也可能无法从c++的抽象机制中获益,而是退化到使用c或c++来编写等价于汇编代码的东西。通过stl,c++社群或许已经使更多的人了解函数型编程(functional programming)技术,或许c++社群已经将此类技术应用于现实问题之上,比以前所有语言所做的总和还要多。函数对象(function objects)不是最具弹性的闭包(closures),但这并不影响这样的事实:人们理解、喜欢并且使用它们。
《把标准c++当作一门新语言来学习》(在我的论文网页上有链接)一文清晰地陈述了这些方式的作用范围并探讨了原因。看看1988年的c++,它没有模板、异常、rtti和标准库,它的确是一门不同的语言 — 一门不支持绝大多数现代c++技术的语言。
如果你需要垃圾回收机制,有很棒的免费的或者商业支持的c++垃圾回收器可供选用(请参考我的c++网页上的链接)。c++垃圾回收器之所以如此高效,原因之一即是c++区别对待配置于栈上的对象和配置于自由存储区的对象。
姓coward的匿名人士的评论
啊,正是这个家伙,他一度篡用“c”这个名称来为他的新语言命名,还在at&t到处说k&r的c语言是“old c”……直到dennis ritchie叫他住嘴为止。
我想他不得不承认,委员会帮他摆平了这门语言早期版本中的大量的问题,而且我也认为他不会宣称目前的c++是完美无暇的。
鉴于他的成功和知名度,或许我自己有点狂妄自大了j
bjarne:我并不真的认为自己极其缺乏谦逊。
要知道,我与dennis(虽然不十分密切)还有brian kernighan(密切地)共事过十多年。我不认为我盗用过“c”这个名字,即使果真如此,也没有人会向我索赔j
说c语言是“old c”的人不是我。为了澄清混淆和避免对dennis名誉造成伤害,为“c with classes”取名为 “c++”的正是本人。
同样,我在委员会工作非常努力(很少有语言设计者为如此“乏味的细节”烦心),同时我也认为委员会做了出色的工作。
-完-