发信人: RAII (RAII IS CORE OF C++), 信区: CPlusPlus
标 题: [周末随笔]复杂的C++
发信站: BBS 水木清华站 (Sun Jan 16 14:22:29 2005), 站内
对C ++最致命的批评, 在我看来, 就是C++过于复杂, 或者说庞杂. 这一特性, 无论在美学上还是实用中都引起不快并招致尖锐的批评.有一个漂亮的参照物作对比, LISP. 从语法上来说, LISP更简单, 更符合简约主义者"简单即美"的审美观, 从表达能力来说, LISP则是惊人地强大, 有人甚至认为, 常规编程界不过是在重新实现多年前LISP程序员们已经实现过的技术. 从实现技术上来说, 据说现代的LISP编译器编译的本地代码一点都不输给C编译器. 照这种说法, 今日的程序员应该广泛地使用LISP语言, 而不是其它语言. 问题是现实中这样的事情并没有发生, LISP只闻达于象牙塔或者成为少数程序员的业余消遣. 问题发生在哪里?
对于LISP的问题, 有一个调侃般的说法, 要读懂LISP程序, 先得把自己变成一台LISP机器. 什么是LISP机器? LISP机器本质上可以归于一台符号代数机器, 这也是LISP语言表达能力如此强大的源头, 但是LISP机器本质上就是抽象代数机器, 这样的机器, 需要普通计算机科学系本科生水平来理解, 需要研究生水平去精通. 这是其一, 最致命的地方在于LISP无处不在的谓词前缀的表达方式, 在表达普通命令时还可理解, 在表达复杂的数学运算公式时就和平时人们习惯见到的中缀形式大相泾庭了. 当然, 如果我们改变教育方式, 从小教育孩子们(+ 1 1)而不是1+1, 自然就不会出现这样的问题. 说到底, 就是一个习惯问题, 习惯并非天生的, 习惯是可以改变的. 但是, 改变习惯, 特别是那些根深缔固的习惯, 真的那么容易么?
反过来, 考察今日流行的编程语言, C, C++, Java等, 无一不是归于更符合人类自然表达习惯的算法语言, 也就是说, 人们习惯于接受更符合人类自然语言习惯的表达方式, 其它不符合人类自然表达习惯的编程语言, 都只能困于象牙塔内不能闻达. 这也正是Python这类语言近年崛起背后的心理因素, 简单并符合人类语言自然表达习惯.
而C++复杂. 明显不合潮流. 真的如此? 未必. C++的先驱和大师Andy Koenig在他的"C++沉思录"里回击了对C++复杂的攻击. 他认为, 这取决于要解决的问题. 世上没有万灵药, 要解决复杂的问题, 必然要依赖于复杂的工具.C++程序员是实用主义者, 他们的首要保证是能解决问题, 其次才能谈得上其他. 我以为, 除此之外, 还有一个理由: 要解决的问题(目标域)是复杂的, 实现的机器(实现域)是不完美的, 人类的自然语言体系(表达域)就更是不完美和复杂的, 而一门成熟的通用编程语言, 要在这三极之间保持平衡, 就不可能简单了去! Java语言通过削减矛盾(用虚拟机代替真实机器), 削减表达能力来获得简单性, 这也同时限制了它在实时性高计算密集的领域里得到应用.
但是复杂性确实是一个问题, 在实践上表现为生产率的损失. 工具的简单化专门化能带来生产率的提高, 这已是无庸置疑的事实. 这是不是说, C++就没有市场了呢? 当然不是. 在我看来, C++更适合大规模的需要运行效率的核心应用.使用媒体编辑软件, 你肯定不希望大型媒体内容还没装入内存, 编辑软件本身先吃掉一半内存; 使用机场调度软件, 你肯定不希望飞机准备降落的时候, 控制中心却在忙于整理内存垃圾. 无论是调度仿真实时控制还是媒体编辑, 一触及重量型的关健性应用, 除了C++你别无选择. C++的复杂性源于其承诺. 这个道理, 就好比现实生活里思想简单的人不能承担重大的责任. 是的, 全面掌握C++需要全面的头脑, 但是, C++的威力在于, 你不需要全面掌握C++也能解决你的问题, 你可以把你对C++的理解限制在一个相对简单的程度, 只要你需要解决的问题的复杂度不超过你所掌握的工具的复杂度. 否则, 这不是C++或者工具的问题, 而是你的问题. 如果你能够理解问题的复杂度, 你自然就能够理解解决问题所需工具的复杂度. 所以, 最终就归结为个人能力问题. 在C++方面需要提高的是, 为初学者提供一个简明的路径图, 把C++分解为逻辑上层次上难度上比较独立的部分, 初学者根据自己的需要循序渐进, 最忌速成和一锅端. 这里需要把实用库和惯用法也作为C++教育不可分割的一部分考虑. 这就好比学习外语, 除非条件限制, 没人是把语言和其惯用法分开学习的, 也没人是把整个语言都学习之后才开始使用的.
C++是一门严肃的成熟的实用的通用编程语言. 它不仅需要认真的学习, 也需要良好的心态.
[ 此贴被XChinux在2005-09-06 09:24重新编辑 ]