Podcast Script (zh)
[0.120-12.487] SPEAKER_00: C++是面向对象的编程语言,它诞生,特别是随着 我们马上要聊到的新版本,抽象程度越来越高。 那怎么设计呢?让我们回到C++的源头,怎么设计
[12.567-17.570] SPEAKER_00: 一个抽象很多却依然高效,还能 让你管理、静态分析、加约束的东西,
[17.650-24.058] SPEAKER_00: 让它可靠,就像我们聊过的。对我来说, 高级抽象和效率之间有种微妙的紧张关系。
[24.358-36.873] SPEAKER_02: 问得好。我大概能开一年课来试着回答。 对,效率和抽象确实有张力, 但有趣的是,最好的抽象往往
[36.953-49.410] SPEAKER_02: 带来最好的效率。而我的主要工具, 用来提升性能效率的,其实就是抽象。所以回到 C++是怎么做到的。你说它是面向对象的语言。我
[49.490-61.471] SPEAKER_02: 其实没这么说过。别人常这么引用,但我没说过。我说C++ Plus支持面向对象编程和其他技术。这很重要,因为
[61.551-70.490] SPEAKER_02: 我觉得大多数复杂有趣的问题,最佳方案需要融合 面向对象、数据抽象、函数式、
[70.570-78.011] SPEAKER_02: 和传统C风格的思想和技术,全都用上。所以设计C++时,
[78.091-81.841] SPEAKER_02: 我很快意识到不能光加特性。
[81.921-86.425] SPEAKER_02: 如果只添加好看、别人要的、或者你觉得好的东西,
[86.505-90.591] SPEAKER_02: 别急,你得不到整体。需要一套指导方针,
[90.671-108.552] SPEAKER_02: 指导你决定:加不加特性?怎么改?这些在我写的书里。 《C++的设计与演化》里有整套规则。大部分 不是技术层面的。比如:别破坏静态类型,我喜欢它。
[108.632-126.479] SPEAKER_02: 类型系统。比如:别违反它,我喜欢静态类型。 系统。比如:别违反静态类型,我喜欢静态类型。 系统。原因很明显:我喜欢硬件上保持可靠性。 但其中一条是零开销原则。
[126.559-134.117] SPEAKER_02: 什么原则? 零开销原则,就是如果你有抽象, 它不该比底层等效代码代价更高。
[134.197-142.532] SPEAKER_02: 所以比如矩阵乘法,应该这样写: 让你没法降到C语言用数组指针跑得更快。
[142.612-146.385] SPEAKER_02: 有人已经这样写了,而且实际得到了
[146.465-160.420] SPEAKER_02: 比Fortran还快的代码。因为他们这样写, 他们能做到。因为有了正确抽象,就能消除临时变量, 做循环融合等优化。用手工或低级语言做很难。
[160.500-166.490] SPEAKER_02: 有很好的例子。关键是, 矩阵抽象让你写简单易用的代码。
[166.570-176.484] SPEAKER_02: 矩阵抽象让你能写简单易用的代码。 任何语言都能做到这点。 但C++的特性让你还能
[176.564-187.500] SPEAKER_02: 跑得比手写代码快。这类演讲已做过很多次。 我和别人演示超越Fortran的矩阵乘法后,常被问: 有人会问:
[187.580-202.905] SPEAKER_02: 是啊,但那是C++。用C重写能快多少? Dmitry B 这问题很蠢。 答案是慢得多。这事最早在80年代 我和朋友Doug McElroy演示过这效果。
[202.985-242.266] SPEAKER_02: Dmitry B 这问题很蠢。 原则是:给程序员工具,让抽象遵循零开销原则。 另外,给C++或标准库加特性时 C++中有一个函数能实现。如果你想,如果你有 能执行那个函数的程序,它就会做。但如果你想用语言特性写 比如C++,这不应叫C++函数。你做不到。 当用某种语言编写时,有个叫C++的函数。所以加特性时 或标准库特性,要满足这点。这不代表绝对最优
[242.346-254.466] SPEAKER_02: 但用常规工具手动编码,C++或C中,你不该超越它。 通常,用内联汇编生成机器码,利用编译器没有的部分。
[254.546-264.507] SPEAKER_02: 针对某些细节生成机器码,用上编译器没管到的部分。 明白。但在搞定抽象之前,得先到那一步。
[264.807-267.581] SPEAKER_00: 所以那是个很值得追求的美丽理想。
[267.881-270.934] SPEAKER_02: 而且我们经常能实现它。
[271.234-278.931] SPEAKER_00: 经常。那么魔力从哪来?一部分来自编译过程, 也就是C++的实现。一部分来自特性本身的设计和原则。
[279.011-289.169] SPEAKER_00: 所以我最近常和Chris Ladner聊天, 也就是Clang。只是好奇,你与不同 C++实现之间的关系?当你考虑自己、委员会和C++社区时,
[289.249-292.197] SPEAKER_00: 思考新特性或旧特性的设计,
[292.277-297.547] SPEAKER_00: 在追求零开销理想时,魔力是来自设计、 指导原则,还是来自实现?
[297.847-305.335] SPEAKER_02: 不完全。你追求编程技术、 编程语言特性和实现技术。这三者都得有。
[305.635-308.189] SPEAKER_00: 那怎么同时考虑这三者呢?
[308.489-316.407] SPEAKER_02: 这需要经验和实践,有时会出错。但过一段时间, 你基本就能做对了。我现在不写编译器了。
[316.487-321.258] SPEAKER_02: 但Brian Kernighan指出,C++成功的一个原因
[321.338-324.507] SPEAKER_02: 是我在早期编译器投入的工艺。
[324.587-334.443] SPEAKER_02: 当然,我做了语言设计。也写了大量代码 用这些东西。我觉得大多数成功都涉及这三个方面的进步。
[334.523-336.160] SPEAKER_02: 要是你看看这个
[336.240-360.286] SPEAKER_02: 对 评估,检查正确的环节 两者共同作用,人们创造了它 三个人就能做到,两三个人一起也成 理想是有人掌握所有技能,但没人全懂 要接近理想,需懂并发算法和无锁编程,诊断在A velocity中关键 无锁编程要了解编译器技术 还要了解应用领域
[360.366-363.976] SPEAKER_02: 比如图形或网络服务
[364.056-367.364] SPEAKER_02: 一个人难全掌握,小团队可以
[367.664-378.124] SPEAKER_00: 你在控制领域,要用Power BI 在自己游戏里,要知道新应用代码位置 再说,你得在控制领域才知代码位置 不知道代码位置,就开始多用 相同的代码
[378.204-380.793] SPEAKER_00: 我打算继续放这里