负暄琐话

我的email: rot47('649@ 6(hF+`hd"w=92vhG{>}G3"@l M >:>6?4@56 \F')

囧囧ID:g9yuayon
903097次访问,排名34好友44人,关注者44
姓名:g9yuayon
前世:夜郎国厚脸皮神棍
魅力指数:0
名气:1
宠物:一只从来不对生人叫的看门狗
g9yuayon的文章
原创 244 篇
翻译 4 篇
转载 49 篇
评论 902 篇
g9的公告
最近评论
ErikLiu:看了这样的文章, 我会流泪.

如果说, 三十年前, 我流泪, 不奇怪,

30多岁的我, 流泪了
ErikLiu:看了这样的文章, 我会流泪.

如果说, 三十年前, 我流泪, 不奇怪,

30多岁的我, 流泪了
devil_hua:孤陋寡闻了。。。汗啊,看来知识缺得还真不是一丁点,哥们强
devil_hua:孤陋寡闻了。。。汗啊,看来知识缺得还真不是一丁点,哥们强
f891379133:好tuo,
文章分类
收藏
    相册
    旅游
    计算机科学
    Lambda the Ultimate
    软件开发
    Reddit编程专栏(RSS)
    正在读的书
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 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牛的大坑。众人笑。散场。人散后,一钩新月天如水。不,其实当时是下午。日头正好。我只是伪文青一把。
     

    发表于 @ 2007年07月17日 13:28:00|评论(loading...)|编辑

    新一篇: 跳棋被搞定了 | 旧一篇: 做习题的境界

    评论

    #easing 发表于2007-07-18 23:46:03  IP: 125.44.135.*
    其实我最想知道的是g9大大呆的是哪个公司.
    #pongba 发表于2007-07-19 03:53:57  IP: 222.94.3.*
    有免费讲座听,真羡慕:)
    g9的散记真是一绝啊:)
    是要写写concept了
    #Googol 发表于2007-07-20 08:09:22  IP: 221.216.30.*
    我也想知道,顺便最好贴个讲座的预告,大家去蹭听
    #uoyevoli 发表于2007-07-23 07:02:33  IP: 221.201.9.*
    大哥们多写写文章介绍一下0x,比如concept,呵呵。
    #niynehc 发表于2007-07-23 13:17:08  IP: 124.17.16.*
    八卦一下,IBM Canada?
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © g9