C++恶性录——之二

C++中有很多东西是发现的,而不是设计者故意设计的。STL,Template Metaprogramming都不是设计者预先料想到的。所以Bjarne给他的书起名为“C++的设计与演化 (The Design and Evolution of C++)”,我认为这是它迷人的地方,它能够进化。你不能把这些称为workaround或show off

——樊志岩对《C++恶性录——之一》的评论

It’s risky to design minilanguages that are only accidentally Turing-complete. If you do this the odds are good that, sometime in the future, some clever fellow is going to think he needs to press your language into doing loops and conditionals for him. Because these are only available in an obfuscated way, he’ll produce obfuscated code. The results may be serviceable in the short term, but are likely to be a nightmare for those who come after him.

——《The Art of UNIX Programming》


认为C++“迷人”的同学中,有一部分是因为从C++里面发现了那么多意想不到的东西。意想不到的东西给人悲伤、震惊、或者乐趣。但是带来惊喜和乐趣的意想不到并不一定代表好的工程设计。

从C++里能“发现”这么多东西,是不是说明了C++的设计是经过深思熟虑、抑或就是其设计者灵感迸发、(相比那些后来从中“发现”的东西不那么多的语言的设计者更)才华横溢的体现呢?看来有一部分人是这么认为的。但是崇拜经常来自于知识的缺乏。如果你了解了“图灵完备”的概念,然后把template考虑成一种compile-time minilanguage,再把两个概念放到一起,就会把“迷人”的外衣剥落。只要你让一种语言达到compile-time图灵完备,不从中“发现”那么多东西倒是奇怪的了。达到图灵完备是任何一个语言设计者都轻而易举能掌握的技巧。事实上,正如《The Art of UNIX Programming》所告诫的,了解图灵完备概念的意义在于避免无意中触发它而不是不必要的实现它。

那么,抛开“发现”这么多东西的原因,“发现”的这些东西是对工程有实际作用的吗?“[S]erviceable in the short term, … nightmare for those who come after …” C++里面发现的东西,可读性都很差,如果出了编译错误更是没法收拾。例如,C++曾经用template实现了一个LL(k) parser generator,很奇妙么?但是这个东西产生的parser对unpredictable syntax的处理是silent failure。所以这个东西只能是孤芳自赏的玩具!

C++ template是为了静态类型安全设计的。但是当一个在高级语言里可以用smoke test很快发现的错误在C++里变成一个晦涩的编译错误的时候,只能说C++的设计者失去了更广的视角。静态安全在一定限度内是有益的,不知道在什么地方停步是C++设计者的问题。不舍得付出任何代价,用template specialization这种补丁来达到效率提升从而意外的引入“图灵完备”,最终让C++失去的东西更多。

10条回应 to “C++恶性录——之二”

  1. zy Says:

    这里的关键不是图灵完备。关键是你突然发现了一个工具具备一个能力或潜力,而这个能力或潜力是当初设计它时没想到的。我强调的是发现,而你强调的是发现的结果。

    狭义相对论有点文化的人只要认真读,都应该能读明白 (我听别人说得,别以为我懂)。如果抱着你这种态度,爱因斯坦有什么了不起,做出的东西很好理解吗!

    使用模板时,对于开发者来说,是更高阶的抽象。关键是更高阶的抽象。你倒好,一下退到图灵完备。我们再往后退,就到“道可道,非常道“了。

    • sipoint Says:

      关键是你突然发现了一个工具具备一个能力或潜力,而这个能力或潜力是当初设计它时没想到的。—— 你应该再看看我引用的《The Art of UNIX Programming》的原文。“突然发现了一个工具具备一个潜力”并不说明这个潜力就好。如果C++ template图灵完备”这个能力或潜力是当初设计它时没想到的“只能说明设计者无知,而我相信B.S.还不至于如此无知,只是对于《The Art of UNIX Programming》的告诫(或者类似告诫、因为《The Art …》一书03年才出版)不知道或者不相信。

      如果抱着你这种态度,爱因斯坦有什么了不起,做出的东西很好理解吗!—— 你在混淆概念。我说的是C++的设计导致了开发者只能写出不好理解的代码。我没有责怪开发者。如果你用爱因斯坦做比较,那你只能去责怪上帝,创造的世界只能用不好理解的理论解释。

      你倒好,一下退到图灵完备。 —— 要解释为什么能从C++里“发现”那么多东西,图灵完美是最准确的理论。不是因为你用“退到”这个词来贬低就能混淆的。C++里的所谓“发现”一旦用图灵完备解释就完全失去了神秘感。当C++在工程上导致失败的时候,还有人用其神秘感来误导,这篇blog就是要撕下这种神秘感。

  2. zy Says:

    《The Art …》一书03年才出版,这只能说明他这段话是有明确的所指,而不是他老人家在面对芸芸众生讲宇宙间最抽象的道理。

    将一本阐述理念的书奉为圭皋,说明两件事:1)这本书好 2)个人的倾向。

    • sipoint Says:

      1) 个人倾向无法避免。2) 好书难得。

      “明确的所指”我没看到。因为把《The Art …》这段话和C++ template联系到一起的纽带是我看到的另一篇为C++ template的compile time turing completion叫好的Blog。”03年才出版” -> ”只能说明他这段话是有明确的所指“ -> “不是…宇宙间最抽象的道理。” 这个reasoning chain既不符合逻辑,也不符合事实,而且得出的结论我也不明白到底是在帮助那一方。

      另外,这段引文出自《The Art … 》的Chapter 8.3.1 Choosing the Right Complexity Level。题目更加一针见血,C++就是为了解决类型安全而(无意中?)祭出了turing completion的大器。岂不是打开了潘多拉魔盒?回头呼应那句话,C++不知道什么时候停步,这既非好的工程,也非好的艺术。

  3. zy Says:

    我在表达作者是事后诸葛。

  4. cppof286 Says:

    鼓掌鼓掌,如此老哥你这就站在俺这边了,虽则口气是冲了一点。

    大体上俺的看法相同。代码的主要目的是给人理解而不是给机器看的,考虑到大多数一线coder的精力有限,特别是站在俺这种专职给别人维护代码的Test的立场看,过于精妙甚至诡异的语法只会给维护带来无穷无尽的痛苦——也包括维护自己的代码,毕竟不是每个人都有照相机一般的记忆力。

    C++ 的模板的编译错误是一个非常好的反面教材。俺现在还记得自己第一次模仿STL容器写HashTable类出错的时候的感觉。铺天盖地的错误信息,任何一条在终端上都是五六行的输出。俺的VIM的make窗口显示一瞬间变得乱七八糟。从那时候开始俺对模板就开始有一种恐惧感,虽然后来也还在用,但是总是倾向于尽量简单地用法,而不是到处使用诸如偏特化之类的“现代”特性。

  5. zy Says:

    前几天看了下C++0x的新功能,包括解决编译时间(extern template)和编译报错(concept)的办法。当然了,又增加了复杂度。讨厌它复杂或不讨厌它复杂是个态度问题。比如我特别讨厌Mac API的复杂,事件模型弄得也复杂。但有人就喜欢,如Fengdong。他让我仔细了解,说它们设计得有道理,越想越有道理。我想不明白的是,在Mac发送个Apple Event得先准备好几步,找函数操作Opaque Struct,怎么就比Windows上调用PostMessage好呢?

  6. whoischelseahandlerdating Says:

    Chelsea Handler is year accomplished stand up comic making appearances all across the country. She edge Be seen regularly one the Oxygen network show Girls Behaving Badly, one the E! Chanel ace has regular commentator, one the Tonight Show ace has Tonight Show Correspond, ace well ace in many TV guest appearances. Chelsea’ S new book ” My Horizontal Life – has Collection One-Night Stands” off; is Who is chelsea handler dating already available one Amazon and the foreign rights cuts sold in over 16 countries.

  7. WhoisChelseaHandlerdating Says:

    Who is Chelsea Handler dating

    In July 2007, Who is Chelsea Handler dating began starring on her own half-hour late-night comedy series on E! titled Chelsea Lately. This series places Handler against a slew of male-dominated talk shows, and adding a considerable amount of scorn and rib to the format. On the express’s 100th episode, Chelsea revealed to viewers that E! had picked up Chelsea Lately seeking another 150 episodes.] The inform has proved a clip and averaged more than a half-million viewers since its initial (much more than the norm for a belated gloaming telegram program) and has clips on Youtube with more than a million views. All this success is regardless of the Who is Chelsea Handler dating fact that Handler’s guests repeatedly are not A-list celebrities. In a 2008 question Handler said, “The worse the Who is Chelsea Handler dating guests are, the more heart-rending they are, the funnier the show is.”0] The New York Times reported that Chelsea Lately has been renewed nigh E! to vie until December 2009;1] Handler received another agree proportions in Hike 2009 to nourish Chelsea Lately on the breeze through 2012.2]

sipoint 发表评论 取消回复