Bjarne Stroustrup关于C++的讲座

 想知道细节的,可以直接到wg21的网站上看论文。这里是零散的笔记。

今天Bjarne Stroustrup到公司来做关于C++ 0x泛型编程的讲座。秉着不吃鸡蛋也可以看看母鸡的原则,我还是提前20分钟去前排占了个位子 —— 虽 说我们实验室除了编译器部门和数据库部门狂用C++外,主要还是Java作坊,我还是不能低估了这群老大赏鸡的好奇心。虽说有了心理准备,大家热情之高还是吓了俺一跳:讲座开始前300多人的大厅居然基本满了。
 
没有什么开场白。Bjarne直切主题,高唱Template的赞歌:template灵活,通用,时间和空间的性能良好,广泛用于现代C++类库的构建,高性能C++类库的构建,和元编程。接着过度在类库的问题。一是亲者痛仇者快的编译错误信息。模板的编译检查在扩展以后做,错误信息总是庞大繁杂,难以理解。用g++编译过list<int> list; sort(list.begin(), list.end())的老大们肯定对2K字节的出错信息记忆深刻。二是overloading不好用。三是不少人滥用各种奇技淫巧,写出花哨但脆弱的代码。Bjarne说很多老大看到template就说:爽!改良版的宏。然后就开始乱来。脆弱代码是对他们态度的报应。但是,用户不应该被连坐。三是代码非常难读懂。四是有些地方代码冗长。用Bjarne的话总结,是我们写的代码不应该多过我们想表达的东西。不过这好像正是C++被人批评的地方。Bjarne觉得模板问题的症结在于我们没有给编译器提供足够的信息。编译器在扩展模板代码时不知道该检查什么,自然也不能给出合适的错误信息或者支持简洁的重载。所以C++ 0x的目标之一是在泛型编程中支持丰富的类型信息。做到让编译器忽略一些正确性的检查以加大优化力度;进一步优化已经很牛X的模板系统;以及让程序变得容易维护,不至于只有MIT的Ph.D能用(引用了Kristen Nygaard的话,可惜我没有记全)。
 
然后就开始谈Concepts了。Concepts其实很像Java Interfaces或者Haskell的type classes。以前我们只能用<typename T>,但有了Concept就可以不用大堆traits代码也能限制T的范围了。比如说STL里的min
template<typename T>
const T& min(const T& x, const T& y){
     return x < y ? x : y;
}
会在C++ 0x里变成
template <LessThanComparable T>
const T& min(const T& x, const T& y){
    return x < y? x : y;
}
而这个LessThanComparable定义为
auto concept LessThanComaprable<typename T>{
   bool operator<(T, T);
};
 
这样让C++有了编译时duck typing的功能:不管一个类是什么,只要编译器说它实现了DuckConcept里规定的walk(), quack(),就是只鸭子。当然Concept的功能远不止限定函数签名。它还能限定constructors, operators, member function template, deference等各种操作。而且还能限定类能接受的类型,甚至可以用axiom关键词设定不变量。Bjarne举的例子是用axiom限定一个半群的操作符必须满足结合律 。真是geeky到极点啊。除了这些,不同的Concepts还可以组合起来,甚至通过所谓的concept map把一个concept映射到另外一个concept上,让代码量大幅降低。Bjarne特意强调Concept和Haskell的Type Class或者Java/C#的泛型不是一回事,列举了三点不同。最重要的是Concepts不像Java或Type Class那样有层级结构。二是Concept的实现不需要用到间接函数调用。最后就是Concepts能够完美支持原始数据类型,无需auto boxing。一个例子是栈上固定长度的数组可以用Concepts轻松描述,而Java或者Type class就不行。不过我奇怪的是Java都没有栈上的数组,干嘛用这个例子。可惜后来忘记问了。最后Bjarne说整个STL会用Concepts重写。
 
Concepts之后讨论一些相对较小的改动,比如句法同意的initializer。有意思的是同样的{}句法可以用到struct的初始化。还有就是类型自动推断的关键词auto。Bjarne说他83年就搞出这个东东了,现在终于成功加入C++。另外就是<T, My_alloc<T>>终于可以正确解析了,不需要在两个>间加入空格,以便同位移符号区分。最后谈了R-value, move()的语义,和typedecl。不过我分神了,没有写下什么笔记。
 
提问时间比较有趣。先是有人问R-value的细节。Bjarne说没有幻灯片的情况下他不能回答,因为细节太多。我私下暗笑,早知道给你看 pongba的大作了。一个老大问Bjarne如果有机会重来,他最希望改变C++的哪一部分。Bjarne回答得很坚决:insane syntax。下面爆笑。接着有人抛出杀手问题:你用vi还是emacs?自然上下笑得花枝乱颤。结果Bjarne说他20年前就发誓不用这俩编辑器了。他用一个叫什么Korsan(音,没怎么听清楚)的编辑器,只有Copy, paste, cut, 和find。比Notepad还原始。Bjarne说他追求极致的简单。这点我颇不以为然。不过Bjarne主要在白板前写画,偶尔用一下编辑器,也不需要那么花哨的功能。另外追求极致简单的老大搞出C++,也算是诡异的人生。最后有人问他C++/C以外最喜欢那门语言。Bjarne老大说Simula67和Algo 68。不过他有补充说其实除了C++是他常用的语言外,其它的优秀语言太多了。他也喜欢一些函数编程语言。不过他不说是什么,绝不跳Haskell好还是Ocaml牛的大坑。众人笑。散场。人散后,一钩新月天如水。不,其实当时是下午。日头正好。我只是伪文青一把。
 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值