|
|
上个礼拜,首届 CppCon 在西雅图举办,大拿们(Bjarne Stroustrup, Herb Sutter, Andrei Alexandrescu, Scott Meyers)纷纷到场谈笑风生,应该算是 C++ 程序员的年度节日了吧。废话不多说,俺把读过的 slides 粗粗分了一下类,遇到有趣的,就简单说上两句;感觉没啥意思的,就直接略过。所以这个列表是不完全的,完全的可以看 这里 。
分类标题后的标签说明 (beginner / intermediate / advance) 是俺对内容涉及深度的简单划分,不是很严谨,见谅。
文末是俺挑出的十大推荐阅读列表。
分类合辑
教程和介绍 (beginner)
An Overview of C++11 and C++14 - Leor Zolman 比较全面地过了一遍 C++11/14 的内容,109页ppt都是关于语言本身,不包括标准库。想走马观花来一遍的同学可以看一下。
The Canonical Class - Michael Caisse 讲解了在现代 C++ 中,实现一个类应该注意哪些问题。俺认为这个选题的立意很有趣,讲解也很不错。值得一看。
Boost - a Bridge from C++98 to C++11 - Michael VanLoon 介绍了 boost 库在 C++ 新标准形成过程中发挥的作用,以及哪些新特性是化生自 boost 的,内容较浅显。
[游戏开发] Quick game development with C++11-C++14 非常初级的游戏开发介绍性材料
Unicode in C++ - McNellis Visual C++ Team 的同学介绍 Unicode 的前因后果及 C++ 实现的方方面面的考虑,值得一读。
Anatomy of a Smart Pointer - Michael VanLoon 解释了一下智能指针内部实现的一些方案。
思维和理念 (intermediate)
Back to the Basics! Essentials of Modern C++ Style - Herb Sutter Herb Sutter 的发言,描述了现代 C++ 如何帮助程序员简化头脑模型 (mental model) 的,值得一读。说到 B.S. 的发言 “Make Simple Tasks Simple” 中提到 “&&” 的次数为——0次;说到大家达成共识——“T&&这个东东的确需要个新名字”,只是不接受 Scott Meyers 的 “universal reference” 提法,倾向于使用 “forwarding reference” 这个词。俺认为,这个词的确更准确一些,精确地描述了它的行为(把参数的引用性(reference-ness)恰当转发进函数内部),不像所谓 universal reference 只是在概念上概括了一下。
Data-Oriented Design and C++ - Mike Acton 面向数据的设计,注意不要跟“数据驱动开发”搞混了。这想法不新鲜,只是日常开发中通常更容易强调方法的比较和筛选,围绕数据本身的思维方式容易被忽视。
Make Simple Tasks Simple - Bjarne Stroustrup 运用新特性来简化开发。BS的唯一一个 session。
The Implementation of Value Types - Lawrence Crowl 值类型的实现。感觉说得抽象了点。
The Philosophy of Google’s C++ Style Guide - Titus Winters Google 的同学出来谈 Google 的 C++ 编程规范背后的哲学。Google 有四千个 C++ 程序员。要点:#1. 为读代码的人优化(Optimize for the Reader, not the Writer) #2. 规则要体现出价值,不要陷入琐屑的小细节 (Rules Should Pull Their Weight) #3. 尊重标准,但不过分地膜拜 (Value the Standard, but don’t Idolize) #4. 一致性 (Be Consistent) #5. 如果有啥特殊情况,一定要在代码中明确地说清楚 (If something unusual is happening, leave explicit evidence for the reader) #6. 少玩花样,不要搞奇技淫巧 #7. 不要污染全局 namespace #8. 必要的时候,为性能让步。
Viewing the world through array-shaped glasses 微软的同学讲解现代 C++ 的一些设计时可供考虑的方案,内容比较丰富,值得一看。
工程实践 (intermediate)
Making C++ Code Beautiful - Gregory and McNellis 来自 Visual C++ Team,一些比较偏向于基础的工程实践,有一点点价值观上的引导。
Modernizing Legacy C++ Code - Gregory and McNellis 同样来自 Visual C++ Team,改良已有代码,易读,有用,推荐。
C++ in Huge AAA Games - Nicolas Fleury 来自育碧的蒙特利尔工作室 (Ubisoft Montreal 现有 2600+ 人,是世界上最大的游戏工作室) 演讲内容主要涉及编译链接时间优化,性能调整,调试辅助增强等方面,非常实用。
How Ubisoft Montreal Develops Games for Multicore - Before and After C++11 - Jeff Preshing 主要讲了蒙特利尔工作室利用多核的几种传统模式,以及在 C++11 中利用 std::atomic 改善原有的同步机制
Practical Cross-Platform Mobile C++ Development at Dropbox - Alex Allain 讲了 Dropbox 是如何使用 C++ 来开发移动端 Android/iOS 的 app 的,跟具体平台的交互方面讲得比较多。
Hourglass Interfaces for C++ APIs - Stefanus Du Toit 沙漏型接口设计,使用C89做中间的接口层,回避了 ABI 问题;避免了二进制接口出现 C++ 类型;隐藏了内部数据布局;跟其他语言的绑定更为简单一致。
0xBADC0DE 如何着手处理手头的 Bad Code,谈了一下维护,重构和重新设计。
Adventures in Updating a Legacy Codebase - Billy Baker - CppCon 2014 主要是讲 FlightSafety 从老系统迁移到 C++11 的过程。
Hardening your code - Marshall Clow 一些改良代码的工程实践,主要有 sanitizer, static/dynamic analyzer 等
专题 (general)
[科学应用] C++ On Mars - Mark Maimone 介绍了火星漫游者上的 C++ 应用。火星车的资源非常有限;系统的基础环境(大部分驱动)都是C++写的;大部分逻辑用于处理采集的火星表面立体图像(17个摄像机);周围环境测量和分析,路径规划和地表导航,防碰防摔(这一段感觉有点像扫地机器人);两个机器人通过互相采样和分析,实现协调和帮助;嵌入式C++的定制内存管理;强调真实环境测试(Test As You Fly);大多数传回的数据都使用C++分析和处理后发到手机;介绍了C++在各种航空器和人造卫星上的应用 这个演讲的关键字是“实时”和“资源受限”。演讲的图片很丰富,大部分是真实运作中的火星漫游者(真的很酷),推荐。
[科学应用] Gamgee - A C++14 library for genomics data processing and analysis - Mauricio Carneiro 使用 C++14 处理基因组数据的一些应用。基因数据的特性(对任意一个样本充分理解需要与十万份样本进行对比);对比了用 java 时受到的一些限制(如不同数据结构间内存连续性的控制);使用 auto 来解耦模块间 API 调用(避免大量被动修改);一些真实的科学运算方面的简化的代码样例。
[军事应用] The Joint Strike Fighter Coding Standard - Bill Emshoff 使用 C++ 在 JSF 联合战机上的系统及应用实现。战斗机的环境约束有:硬实时,内存有限,极高的安全性(出问题可能会导致坠机和生命危险),可移植性(适应不同的模拟系统),可维护性(数十年的维护成本)
[并行] Overview of Parallel Programming in C++ - Pablo Halpern 描述了并发 (concurrency) 和并行 (parallelism) 的区别及相关的语言支持。
[并行] Parallelizing the Standard Algorithms Library - Jared Hoberock 来自 nVidia 的并行实践,主要讲述了把标准库中的算法部分并行化的一些实践。
[异步] Asynchronous Computation in C++ - Hartmut Kaiser - CppCon 2014
[异步] await 2.0 - Stackless Resumable Functions - Gor Nishanov - CppCon 2014 微软在 VS “14” 中实现的可恢复协程(可能会入 C++17)
[并发] [Lock-Free Programming (or, Juggling Razor Blades) - Herb Sutter](https://github.com/CppCon/CppCon2014/tree/master/Presentations/Lock-Free%20Programming%20(or%2C%20Juggling%20Razor%20Blades%29) 使用 C++11 提供的并发支持实现无锁的一般方法。
[优化] Where did my performance go - Fedor Pikus 怎样剖析并发程序的性能热点,非常值得一看。
[优化] Optimization Tips - Andrei Alexandrescu 一些细节上的优化实践。
[跨平台] Multiplatform C++ - Edouard Alligand 归纳了一些跨平台开发的要点。
[设计模式] Accept No Visitors - Yuriy Solodkyy 比较了 Visitor 模式的两个替代物 Pattern Matching 和 Open Multi-Methods,值得一读。
[Web] Using C++ to Connect to Web Services - Steve Gates C++ 在 Web Service 下的应用,来自微软。
工具和库 (general)
Sanitize your C++ code - Kostya Serebryany 来自 Google 的工具集,ASan / TSan / MSan / UBSan 各种自动侦测,各种辅助调试,真的强大,推荐一看。
STL Features And Implementation Techniques - Stephan T. Lavavej 来自 Visual C++ Team 的同学手把手教你实现 STL 的功能,值得一看。
Embind and Emscripten - Blending C++11, JavaScript, and the Web Browser - Chad Austin C++ 和 Javascript 的绑定。
Implementing wire protocols with Boost Fusion - Thomas Rodgers boost.fusion 的一个应用——实现一个数据协议。
Introduction to C++ AMP 来自微软的 AMP 简介,介绍性材料。俺认为在一众类似的异构计算工具中,这个是相对比较有前途的,没听说过 AMP 的同学值得一看。
Writing Data Parallel Algorithms on GPUs - Ade Miller 又是一篇 AMP 的,这篇比较深入一点。讲了如何把一些算法分解到 GPU 上跑。
sqlpp11 - An SQL Library Worthy of Modern C++ 使用现代 C++ 实现的 sql 库,语法已经简洁到几乎是在 C++ 里写 sql 语句了。不过这种重 template 库的缺点是编译速度慢,出错时信息晦涩,调试时各种符号信噪比太低,有时候 expand 一个类型就能把 watch 窗口给累趴下了。
其他
C++ Type Deduction and Why You Care - Scott Meyers Scott Meyers 同学谈类型推导。这个内容基本上跟俺前段时间翻译的 EMC 前几条有点重复了,可移步这里查看。
C++ Test-driven Development - Peter Sommerlad TDD,没啥新意,比较基础。
C++11 in the Wild - Techniques from a Real Codebase 几个小技巧。
Decomposing a Problem for Parallel Execution - Pablo Halpern 任务分解和并行化,提到了一个数据分块分区来增强局部性的想法。
Types Don’t Know # - Howard Hinnant 一种简单的合并哈希的方法,很简单但也很实用的组织形式。
Generic Programming with Concepts Lite - Andrew Sutton 泛型编程里的 Concept 和 Constraints。
Practical Type Erasure - A boost::any Based Configuration Framework Pragmatic Type Erasure: Solving Classic OOP Problems with an Elegant Design Pattern 两篇跟 Type Erasure (类型抹除) 有关的演讲,一个是实际应用,一个是设计探讨,感兴趣的同学可以看一下。俺的感觉是类型抹除虽然能帮助简化接口,但是更容易使用不当,形成 ugly code,造成不相干的耦合。
Cheap, Simple, and Safe Logging Using Expression Templates - Marc Eaddy 表达式模板的一个技巧性应用,有点意思。
十大推荐阅读列表
- Make Simple Tasks Simple - Bjarne Stroustrup
- The Canonical Class - Michael Caisse
- Back to the Basics! Essentials of Modern C++ Style - Herb Sutter
- Modernizing Legacy C++ Code - Gregory and McNellis
- C++ in Huge AAA Games - Nicolas Fleury
- C++ On Mars - Mark Maimone
- Sanitize your C++ code - Kostya Serebryany
- The Philosophy of Google’s C++ Style Guide - Titus Winters
- Unicode in C++ - McNellis
- Where did my performance go - Fedor Pikus
本文链接较多,有可能会出现 GitHub 上原库目录名有变动的情况。如果有链接失效,请不吝指出,俺在此先谢过了。
(全文完)