在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linux 创始人 Linus 的暴怒。
这一次 Linus Torvalds 发怒的原因在于 Andy 给出的移除 union 别名的原因是“根据标准行事”。Linus 回复邮件认为 Andy 这样的解释简直就是垃圾,并且还很危险,他解释使用 union 别名本身其实就是一种在 gcc 中开发的传统和标准,甚至它实际上已经是一种成文规定,并大骂对方白痴,同时大骂 C 标准是垃圾,言辞激烈。
“你为什么做出这样的解释呢,不要跟我说什么 C 标准描述得不清楚,C 标准有时就是一坨屎”,Linus 接着解释:“你所谓的这个标准,它对于别名规则的指导完全就是错误的!它需要被完全地无视,并且每个编译器都要为这样脑残的标准给出相应的解决方案,这就是我们使用 -fwrapv 和 -fno-strict-aliasing 的原因。而你现在竟然说根据这样一个标准来行事,你这样的理由真的没有任何意义。”
Linus 全程围绕 Andy 给出的理由“根据标准行事”进行抨击,他的意思是当标准与现实和代码的可靠性相冲突时,那么标准就是不重要的,“我一再强调:当标准与现实相冲突时,那标准文档就是卫生纸,它就完全没意义。事实上,在我面前卫生纸比标准文档还有用,至少它可以让我的屎不蘸到屁股上”,邮件最后他又平静地指出:“标准也需要质疑。”
随后在追加的第二封邮件中,Linus 表示他已经将 Andy 的 PR 合并,并且特别说明自己不是不喜欢他的代码,但是他还是“语重心长”(语气已经缓和了很多)地解释到:“我只是真的完全无法接受那种不顾现实的单方面的解释。”
同时他也解释了为什么说 Andy 给出这样的理由是很危险的,他认为这理由听起来就像是正确的,对于很多人来说,白纸黑字上的所谓标准是需要敬畏的,但是如果一些人不了解更多细节,比如在这件事情中,他不知道其实 union 别名就是 gcc 的标准做法,那他就被误导了!标准有它发挥作用的地方,但是它也有局限,Linus 最后写道。
Andy 回复邮件表示赞同 Linus 的说法,同时他也解释其实在设备属性框架中 union 别名确实是不合适的,所以才将它移除,而原因也不只是他之前说的“根据标准行事”,他在多个原因中可能选择了不太说得过去的一个。
最后 Andy 还补充了 Linus 关于“呼唤标准“(Appeal to Standards)在编程上应该被认为是一种逻辑谬误的看法,他认为这不仅仅只局限于编程领域。
此次 Linus 的发飙,怼出了一番大道理,标准有它的约束作用,但也是有作用条件的,道理其实很简单,不用过多分析。不去像 Andy 那样谈论到宽泛的领域,作为日常依据各种标准编程文档行事的程序员,欢迎你留言吐槽/赞美/...标准的那些事。
相关主题 |