译者著:
\) N% K) c1 [: _- m1 lEricRaymond是
开源运动的领袖人物,对于UNIX开发有很深的造诣,主持开发了fetchmail。他的《大教堂与集市》被奉为开源运动的
经典之作。下面对几大开发语言的评价非常中肯,是我近年来看到的比较出色的评论。特别是他评价中抱有的那种%26;#8220;简单就是好%26;#8221;的
思想,很值得我们深思。我特别选译出一些段落,供大家阅读思考。
5 ~: n' K* |* T4 S' z. f' z
/ B; n4 R0 U% a$ {; `! g. M8 qRaymond此文不是在泛泛地去谈语言的优劣,而是要回答一个问题:在UNIX下开发开源项目,如何选择开发工具?我翻译的很零散,建议大家去看原文。
( L& p3 t$ G7 B( O2 A2 F* f" i9 F) {+ }! `5 Q4 p
C
! k' H9 B8 d+ a虽说C语言在
内存管理方面存在严重的缺陷,不过它还是在某些应用领域里称王称霸。对于那些要求最高的效率,良好的实时性,或者与操作
系统内核紧密关联的
程序来说,C仍然是很好的选择。
2 A* k: a- Y; ]9 |
8 }& L, ^$ k d4 Z' t! p! ^4 e3 uC良好的可移植性也为它加了分。不过现在很多其他的语言可移植性越来越好,C在这方面的优势可能会逐渐丧失。
& d0 q' _6 s# i* a5 y8 l
4 l `3 ]* l v3 a O现有的很多程序可以产生非常棒的C代码,比如语法分析器、GUIBuilder等,这时候C语言也是有吸引力的,因为你所需要编写的代码只是整个程序的一小部分。
' B! u3 ?8 H+ d9 r6 L6 _! l9 T) ]$ @' ~( `7 A- b; }
再有,我们当然应该认识道,C语言对于
程序员来说具有无可替代的价值。就我这里讨论的每一种语言而论,只要你发掘的足够深,到最后你会看到它们的内核都是用纯正的、可移植的C写成的。
, n6 j3 h8 F* X4 q; l# U0 M& L
* i! o3 Y6 }* d8 P# N到了今天这个时候,我们最好把C看成是UNIX虚拟机上的高级汇编语言。
! h0 |; a* O5 b5 B* u0 ^2 z, Q- ?( ~. f! r/ }, n6 z- p% l
就算是其他的高级语言完全可以满足你的工作需要,抽出
时间来学习C语言也仍然有益,它能帮助你在
硬件体系的层次上思考问题。
! C5 O0 a, O+ S# c4 q1 F6 \
7 Z- N% p- v6 K即使到了今天,最好的C语言教程仍然是1988年出版的K%26;amp;R第二版TheCProgrammingLanguage.
6 C R( ]) B8 W. I7 X( |- N0 f+ N. V( @
总结:C最出色的地方在于其高效和贴近
机器,最糟糕的地方在它的内存管理地狱。
0 h6 ~! g4 C8 f- ^
9 O3 T# l% L" w: MC
8 K8 r o" k" r" `2 _C最初发布于1980年代中期,当时面向
对象语言被认为是解决
软件复杂性问题的银弹。C的
面向对象特性看相去使其全面超越了C,支持者认为C将迅速把上一代语言挤到陈列馆里去。
# g/ o: D6 l& u2 `; t+ x! a
; ^ D3 J9 J( n9 F3 Q但是历史并非如此。究其原因,至少有一部分归咎于C本身。为了与C兼容,C被迫作出了很多重大的设计妥协,结果导致语言过分华丽,过分复杂。为了与C兼容,C并没有采用自动内存管理的策略,从而丧失了修正C最严重问题的机会。
6 j* I1 F4 _, K7 L
5 G9 }3 h) A5 E0 u另外一部分原因,恐怕要算到面向对象身上。看起来OO并没有很好的达成人们当年的预期。我就这个问题调研过,我发现使用OO方法导致组件之间出现很厚的粘合层,并且带来了严重的可维护性问题。今天让我们来看看开放源码社区,你会发现C的应用还是集中在GUI,游戏和
多媒体工具包这些方面,在其他地方很少用到。要知道,面向对象也只是在这些领域被证明非常成功,而开放源码社区的选择,很大程度上体现了程序员的自由意志,而不是公司管理层的胡乱指挥。
% K2 m2 Y# T) ? e9 e3 ?2 J! {! ~5 n {4 w3 S
也许C实现OO的方法有问题。有证据表明C程序在整个
生命周期的开销高于相应的C,Fortran和Ada程序。不过,究竟这是否应该归咎与C的OO实现上,还不清楚。
. p+ F3 r2 c& K) G% R( G) o. V* e/ U
最近几年,C加入了很多非OO的思想,其异常思想
类似Lisp,STL的出现是非常了不起的。
) v8 M9 ]0 f+ _8 ?% A& _( n# F) Z4 B# |/ {
其实C最根本的问题在于,它基本上只不过是另一种传统的语言。STL中的内存管理比先前的new/delete和C的
方案要好的多,但是还是没有解决问题。对于很多应用程序而言,其OO特性并不明显,相比与C,除了增加复杂度之外没有获得很多好处。
y% M( |: k2 }* t$ M
& d8 h* J% Z+ Z. I总结:C优点在于作为编译型语言,把效率与泛型和面向对象特性结合起来,其缺点在于过于华丽复杂,倾向于鼓励程过分复杂的设计。
2 V" j8 i8 }6 @7 Z! d/ a" b; y2 E; M% u! u
Java
( t6 d6 `' ]1 ?4 w, iJava的设计很聪明,它采用了自动内存管理,这是最大的改进,支持OO设计带来的好处虽然不那么突出,不过也很值得赞赏,相比C,其OO设计规模小而且简单。
, C8 o, d- S7 S4 b+ I
1 s' E/ [5 t C2 l; O$ i, q/ G相对于
Python而言,Java有一些明显的失误。有些地方设计的还是太复杂,甚至有缺陷。Java的类可见性和隐式scoping规则太复杂了。Interface机制是为了避免多继承带来的问题而设计的,但是要理解和使用它还是挺难。内部类和匿名类导致令人困惑的代码。缺乏有效的析构机制,使得除了内存之外的其他资源(比如互斥量和锁)管理起来很困难。Java的线程不可靠,其I/O机制很强大,但是读取一个文本文件却非常繁琐。
4 ~ T0 u, k9 \5 i. ? x8 C
9 h% e! q' Q5 g$ _2 O: W( EJava没有管理库版本的机制,从而形式上重蹈了了
WindowsDLL地狱的覆辙。在类似应用
服务器这样的
环境里,这引起了大量的问题。
! z4 `& \+ i i) K5 u0 `7 v3 Q7 t+ X
) K" X+ X/ b6 g( F a( B* k总体而言,我们可以说除了系统
编程和对效率要求极高的程序之外,Java在大部分领域优于C。经验表明,Java程序员似乎不太容易象C程序员那样构造过度的OO层,不过在Java中这仍然是个严重问题。
, `2 k7 N2 m% d8 X
& o2 K5 d/ \( O% l! ^9 E6 k- N
Java是否优于诸如Perl,Python这样的语言?我们还不是很清楚,很大程度上似乎跟程序规模有关。其擅长的领域基本上于Python相似,在效率上无法跟C/C相提并论,在小规模的、大量使用模式匹配和
编辑的项目里也无法匹敌Perl。在小项目里,Java显得过分强大了。我们猜测Python更适合小项目,而Java适合大项目,不过这一点并没有得到有力的证明。
$ q$ V. v/ d1 c2 e
) W: ]& m! t/ W7 X
Python7 O% @. J1 k: R8 ^+ J
Python是一种
脚本语言,可以与C紧密整合。它可以与动态加载的C库模块交换
数据,也可以作为内嵌脚本语言而从C中调用。其语法类似C和模块化语言的杂合,不过有一个独一无二的特征,就是以缩进来确定语句块。
7 J6 }6 ^7 I! x" l0 ^
/ k1 i7 y' O' b0 p$ k9 _5 [Python语言非常干净,设计优雅,具有出色的模块化特性。它提供了面向对象能力,但不强迫用户进行面向对象设计。其类型系统提供了强大的表达能力,类似Perl,具有匿名lambda表达式,这点又让Lisp
黑客们感到亲切。Python依靠Tk提供方便的GUI界面开发能力。
+ n& k$ d; t7 [ P2 h! m* J+ t+ H6 R4 S) I5 G
在所有的解释型语言里,Python和Java最适合多名程序员以渐进方式协同开发大型项目。在很多方面,Python比Java要简单,它非常适合与构造快速原型,这一点使得它对于Java有独特优势:对于那些既不很复杂,又不要求高效率的程序,Python十分合适。
' p2 G7 y4 `% _, v: f9 I* I% L0 I: k7 k6 U" T x
Python的
速度没法跟C/C相比,不过在今天的高速
CPU上,合理地使用混合语言编程策略使得Python的上述弱点被有效地弥补。事实上,Python几乎被认为是主流脚本语言中最慢的一个,因为它提供了动态多态性。在大量使用正则表达式的小型项目,它逊于Perl。对于微型项目而言,
shell和Tcl可能更好,Python显得太过强大了。
" t6 _% |$ ]+ A+ |
0 o' s2 g- X6 @( m* Z6 f总结:Python最出色的地方在于,它鼓励清晰易读的代码,特别适合以渐进开发的方式构造大项目。其缺陷在于效率不高,太慢,不但跟编译语言相比慢,就是跟其他脚本语言相比也显得慢