跳转到内容

第六部分导读:看全局

学完前面五部分,每种语言的每个特性都有了位置,但还有两个问题没有回答。一个是方向:Python 加了 match,C# 加了可空引用类型,Go 加了泛型,JS 靠 TS 补上了类型,语言们是不是在往同一处走?另一个是实用的:一个写惯 Python 的人去写 Go,哪些顺手的写法会悄悄出错?

这一部分把前面各章合起来看,共同问题是:语言在往哪走,换语言时要调整什么。第 23 章看趋同,面对同样的问题,答案越来越像,模式匹配、async/await、泛型、类型标注、空值检查在四种语言里都以不同深度出现了;但各家跟进时按自己的运行时改了形状,也各有坚持不抄的地方,几乎都能追到运行时的限制、向后兼容的包袱或设计者明说的取舍。第 24 章看迁移,从 X 到 Y 要忘掉什么,最贵的坑很少出在语法上,多半出在四个默认假设上:类型什么时候检查,失败怎样传给调用方,同一时刻有几条线程在跑你的代码,赋值是复制数据还是共享对象。

这两章主要把前面的机制重新排一遍,新特性只在第 23 章末尾预告几项。读的时候可以拿着前面的章节对照,每条结论背后的原因,在括号里或“详见”指向的章节里都能找到。

章 一句话 四种语言差异最大的一点
第 23 章 语言在互相抄什么:模式匹配、async、泛型、类型标注的趋同与分歧 过去二十年,四种语言从彼此那里学来了哪些特性,各自跟进时改成了什么样,又有哪些东西坚持不加 实现方式各不相同:模式匹配、async/await、泛型、类型标注、空值检查、记录类型、迭代器、lambda 这八项大多四家都有了,但同样是泛型,就有擦除、具化、按形状分组三种实现
第 24 章 换语言最容易踩的坑:从 X 到 Y 要忘掉什么 转到另一种语言时,哪些顺手的旧习惯会悄悄出错,各自该换成什么新习惯 坎大致分四类:类型检查的时机、失败的传递方式、执行代码的线程数、赋值是复制还是共享;换语言前先确认新旧语言在这四处各站哪一边

下面这张图列出这部分的五类问题,以及各自该翻的章。

遇到的问题与该看的章

图的左列是你可能遇到的问题,右列是该先翻的章或节。

遇到什么问题先看哪章:

  • 你想知道四种语言在互相学什么、各自改成了什么样 → 看第 23 章 语言在互相抄什么。
  • 你想判断一个“即将到来”的特性值不值得为它做计划 → 看第 23 章的“以后该预期什么”,看它的正式状态再决定。
  • 你想知道某个特性为什么有的语言一直没加 → 看第 23 章的“坚持不抄的”和“为什么有的不抄”。
  • 你要从一种语言转到另一种 → 看第 24 章 换语言最容易踩的坑,先找到自己的方向,再读那一节。
  • 你换语言后遇到一处说不清原因的错误行为 → 看第 24 章的总表,再按括号里的章节回去读那一章的机制。