编程新手都有一个同样的问题:"我应该学习哪一种语言?"。
《Unix编程艺术》(Eric Raymond著)第十四章,对各种语言进行了评价,正好可以用来回答这个问题。下面是我的笔记,整理了六种主要计算机语言的优缺点。读完就会知道,对于不同的任务,应该选择哪一种语言了。
原文写于2003年。网上曾经有一个不完整的中译本,我也在这个网志中转贴过,所以今天贴的只能算修订版了。
====================
几种计算机语言的评价
作者:Eric Raymond
摘自《Unix编程艺术(第十四章)》
一、C
C语言的优点是,运行效率高和接近机器语言。它特别适用于以下几种程序:
1. 对运行速度要求很高的程序。
2. 与操作系统内核关系密切的程序。
3. 必须在多个操作系统上移植的程序。
除此之外,学习C语言有一个最大的理由,那就是它能帮助我们学会,在硬件层次上考虑问题。如果你想以编程作为自己的人生事业,C是一定要学习的。
C的最大缺点是,在编程过程中,你不得不花很多时间,考虑与你要解决的问题完全无关、且非常复杂的硬件资源管理问题。
二、C++
C++在80年代中期推出,支持OO(面向对象编程),原意是作为C语言的取代者。
但是它没能做到做一点,原因有以下几个:
1. 它也没有解决"内存管理"问题,虽然比C有所改善。
2. 标准化不成功。各个编译器都只支持自己选择的一个子集,导致跨平台性不如C。
3. 过分的精细和复杂了。C++的复杂度,超过了C和OO的复杂度之和。
4. OO并没有带来多少优势,反而带来了一些副作用,比如厚重的胶合层和庞大的代码体积。
总的来说,C++的优势还是程序效率,以及面向对象编程能力,糟糕之处是它鼓励复杂的设计。
三、Shell
Shell程序写起来很容易,对于简单的任务,开发速度很快。
当程序变大时,它就不太适合了,很难维护,而且将变得非常专用(只能在你自己的机器上使用),因为 Shell必须调用各种外部程序,无法保证每一台机器都同样安装了这些程序。
最常见的Shell是bash,它的一些语法规则很混乱,会产生很难阅读的代码。另外,shell只能在Unix上使用,无法跨平台。
Shell的最佳用途如下:
1. 执行简单的系统管理任务。
2. 编写系统启动时的初始化脚本。
3. 作为其他语言开发的程序的包装器。
四、Perl
Perl发布于1987年,基本上就是一个增强的Shell。
它的最大长处是强劲的文本处理能力,无以伦比的正则表达式支持,而且有全套Unix API的内部支持,显著减少了对C的需求。
Perl的主要缺点是某些部分设计得非常丑陋,且无法补救,某些部分也过于复杂。当程序规模增大时,必须严格遵守约定,才能保证模块化和设计的可控性,难于维护。
五、Python
Python发布于1991年,是一种与C语言紧密集成的脚本语言。
Python的优点是非常干净优雅,鼓励清晰易读的代码,易学易用;提供了面向对象编程的可能,但并不把这个选择强加于设计者;具有出色的模块化特性,同Java一样,适合用来做需要协同开发的大型复杂项目。在很多方面,它都比Java简单。此外,Python标准中包括了对许多网络协议的支持,因此也很适合网络管理任务。
Python的缺点主要是效率低下,速度缓慢。在执行速度上,它不仅无法与C/C++竞争,而且也不如其他主要的脚本语言。但是,这其实并不是一个严重的问题,有时网络或磁盘的延迟,会完全抵消Python本身消耗的时间。而且因为Python特别容易和C结合起来,因此性能关键的 Python模块,可以很方便地转化成C语言来提高速度。
总的来说,对于小型项目和大量依靠正则表达式的项目,Python不如Perl的表达能力强。至于更小的项目,Python则是大材小用,shell也许更适合。
六、Java
Java发布于1995年,设计目标有两个。
一个是"write once, run anywhere"(一次编写,到处运行),即不依赖于特定的平台;另一个是在网页中嵌入交互程序(applet),可以在任何一个浏览器中运行。由于它的所有者Sun公司的一系列失误,第一个目标并没有完全实现,第二个目标则是彻底失败。但是Java依然在系统编程和应用编程方面非常强大,足以挑战C和 C++。
Java的优点是比C++小巧简单,可以自动管理内存,支持类似C的语法和OO编程,与C程序的结合也很好。
Java的缺点是某些部分过于复杂,比如内部类和匿名类的运用会产生很混乱费解的代码;某些部分功能不完善,也无法利用操作系统提供的功能接口,比如在Java中读取和处理文本文件,并不像其他语言那样容易。此外,Java配置环境和版本的混乱,也让人很头疼。
总的来说,除了系统编程和某些对运行速度要求很高的编程之外,Java都是比C++更好的选择。如果和Python相比,Java可能在大型项目上有优势,但是也不是绝对的。
(完)
OwnWaterloo 说:
《Unix编程艺术》怎么可能公正的评价各种语言?
这本书本身就是一本王婆卖瓜的书。
2010年3月20日 18:08 | # | 引用
zxuan 说:
是否公正,和是否标榜公正,是两个概念。
最终的公正只存在于每个人的心里。
2010年3月20日 18:40 | # | 引用
半就业 说:
Basic和Pascal语言呢??
尤其是Pascal语言,因为它的足够严谨,很多软件专业都用它来开编程入门课的!(本人是C,当时碰到指针,真那个云里雾里)
最后还有MS的C#,现在用的人也不少
2010年3月20日 18:40 | # | 引用
wqxin 说:
我学过C,也学过C++,就是都没学好
2010年3月20日 19:04 | # | 引用
hongw 说:
现在主要用Python,简单且强大。对我这种不是以编程为职业的工程技术人员来说是个很好的选择。
2010年3月20日 19:53 | # | 引用
Daryl 说:
C+bash+Python
2010年3月20日 19:58 | # | 引用
alreadydone 说:
正在学Haskell
2010年3月20日 20:27 | # | 引用
史诗在线 说:
我不懂编程,不过想找点免费软件。请问有没有什么软件可以把别人公开的源代码直接照猫画虎地存成一个开源软件呢?
2010年3月20日 21:16 | # | 引用
Zoom.Quiet 说:
程序设计语言介绍
http://floss.zoomquiet.org/data/20051126171151/index.html
咔咔咔!
N年前收集到的,一个比较广泛的开发语言通介
2010年3月20日 21:16 | # | 引用
gastlygem 说:
俺曾经是Bash和Perl的轻度用户,目前转型成重度python用户了。
另据这个和这个,python也不见得比别的脚本语言慢。
2010年3月20日 22:06 | # | 引用
aptor_tt 说:
我俗人啊,现在用.NET
2010年3月21日 00:48 | # | 引用
roy_hu 说:
ESR最近高度评价了Haskell:
http://esr.ibiblio.org/?p=1796
2010年3月21日 01:17 | # | 引用
SweetRiver 说:
Java的最大优势:标准;而且在每个标准、领域内都有非常彪悍的解决方案、Lib供你使用。
Java现在最大的问题:所有项目必须依赖一大堆的lib,项目非常容易过度复杂。j2ee领域内有些混乱。
2010年3月21日 11:27 | # | 引用
chi 说:
因为用awesome WM的关系,我开始用lua写些脚本。感觉它的table很灵活。不过好像很少有人谈lua。
2010年3月21日 14:52 | # | 引用
横箫斜吹雨 说:
今天居然进不来,翻墙过来的,但愿只是小震荡@_@
2010年3月21日 16:22 | # | 引用
young 说:
"另外,shell只能在Unix上使用,无法跨平台。"
众所周知,shell不仅仅能在UNIX上使用,也可以在Linux上使用。
2010年3月21日 17:17 | # | 引用
macafee 说:
伟大的PASCAL,伟大的DELPHI呢?
2010年3月21日 19:15 | # | 引用
dylanklc 说:
Perl多年积累的丰富类库资源是python一直想获得的.Perl 6也一直想把perl做成全能语言,而非现在黏合剂式的存在
Python同样也是这样.python不如perl表达能力强的部分也就是perl有而python暂时还没有库类~
shell awk sed组合使用也是异常强大的,写些守护进程也是不错的.
2010年3月21日 21:22 | # | 引用
半就业 说:
据我所知地球上只有两个操作系统Windows和Unix。Mac用的是Unix的内核,Linux是Unix的修正版。然后就有了让我十分不爽的Big Endian 和 Little Endian
2010年3月21日 22:39 | # | 引用
stelee 说:
还有zOS哈。另外这个对语言的评价不仅不客观,也不全面。
2010年3月22日 08:50 | # | 引用
yang 说:
2010年3月22日 09:23 | # | 引用
张昭 说:
编程语言太多了,选择哪种语言的主观性很强,因此很难做到客观公正的评价。
我好奇的是根据什么把这6种语言做为主要的编程语言?
2010年3月22日 10:26 | # | 引用
kyt30 说:
只是unix内核
不过非要追溯七大姑八大姨osx(只是osx,以前的不是)和bsd是亲戚而已,但osx不是unix,去问jobs自己都未必说是unix
linux是类unix,严格说根本不是unix,linux最早的参考也不是unix是minix
小路子的OS也多了,但是全都没有可用性
2010年3月22日 13:24 | # | 引用
yang 说:
10.5的时候就拿到unix证书了,你去问jobs,他会建议你先去google下
http://www.macnn.com/articles/07/08/02/leopard.unix.certified/
2010年3月22日 18:14 | # | 引用
just猜想 说:
没有完美的语言
估计接近人类的语言才是最终的结果
2010年3月22日 20:41 | # | 引用
phnessu4 说:
不知道lz写这篇文章的时候,自己用过这些语言没有...
我甚至怀疑你懂编程么...
只是从网上和书上抄来的,任凭你再修订多少次也都是废话...切忌..
2010年3月23日 21:51 | # | 引用
似曾相识 说:
你们就自做多情吧,别人只是对所了解的语言做一个评价,说一下所了解的语言特点,并没说别的语言不好。每程语言的产生都是为了解决特定的领域内的问题,所以没有那一种语言的产生是完美的。想下我们产生的这些语言,如果能考虑到之间的相互协作性,那可以想象未来是多么的美妙呀。
2010年3月24日 08:53 | # | 引用
风夜未来 说:
其实还有很多语言均可列入,比如delphi,vb等,这是不可忽略的语言,在某些应用方面也是很高效的
2010年3月24日 09:21 | # | 引用
职业小三 说:
估计是个托控件的,回去老老实实托你的控件吧,在这留言...
2010年3月24日 09:57 | # | 引用
C 说:
这个评价有点太旧了。各个语言发展都很快。社会对程序员的需求也在改变。我两年前听的Brian Kernighan的一个讲座很有启发。这个演讲的slides在这个地址:
The Changing Face of Programming
好像网上有音频。听一听很有好处。
2010年3月25日 11:36 | # | 引用
wangtuma 说:
这一点上我同意 phnessu4 的留言。对自己确实不太了解的东西,还是藏拙比较好。并不是你google一下或者翻译一下就能搞得很明白的;即使是翻译,恐怕也翻译不确切,难免贻笑大方。
2010年3月25日 11:56 | # | 引用
神仙 说:
这几位都没发现lz只是copy了一下Unix编程艺术么
2010年3月25日 15:14 | # | 引用
月下 说:
后面的评价都不错。不过对C++的评价还是有失偏颇的。个人观点。呵呵
2010年3月27日 11:36 | # | 引用
controlsea 说:
分析的挺不错~下阶段准备着手Python的学习……
2010年4月25日 20:20 | # | 引用
TBAG 说:
个人觉得python是一门优雅的语言。代码清晰,易懂,良好的模块管理...
2011年8月17日 14:41 | # | 引用
智障 说:
当时的Python和现在的Python的正则表达式“风格”不同!
2011年12月22日 02:15 | # | 引用
代码 说:
一个是"write once, run anywhere"
想到了病毒。
2013年12月18日 21:19 | # | 引用