有比Perl“好”的语言。操,有很多比Perl好的语言,如果你定义“好”为“不是给疯子用的”的话。Lisp,Smalltalk,Python,妈呀,我可能可以列出二三十种比Perl“好”的语言。从这些语言不像这个夏天在台湾街头爆了肚皮的抹香鲸这个角度来说。鲸鱼肠子到处都是,汽车上,机车上,行人身上。这就是Perl。让人着迷,真的。
但是Perl有很多很多好的特性,直到最近,都是其他语言没有的。它们弥补了Perl肠子在外的不足。你可以从爆了肚皮的鲸鱼可以做很多有用的东西出来,比如香水。这很有用。Perl也是这样。
当其他的那些语言(尤其是Lisp和Smalltalk)都想假装操作系统并不存在,列表(Lisp的)和对象(Smalltalk的)就是把屎搞出来的唯一存在,Perl却走了截然相反的路子。Larry说:Unix和字符串是搞出屎来的唯一存在。
对很多任务来说,他绝对是正确的。所以Perl绝对是Unix系统管理和字符串处理的史上最强语言,除了一个,刚出来的一个,从哥斯拉(电影哥斯拉看过没)之地出来的一个。我一会儿会讲到那一个。
可惜,Larry太太太太在意Unix系统管理和字符串处理以致他压根忘了列表和对象,等他明白过来想改正的时候已经晚了。实际上,在Perl早期的…好吧,对鲸鱼肠子我实在不想用“设计”这个词,就说生命周期中吧,他犯的几个关键错误让把列表和对象加进来变得如此尴尬,以致Perl已经进化成一个真正的Rube Goldberg机器,至少当你想在Perl里用列表和对象的时候。(Rube Goldberg是一漫画家,常画一些很复杂的机器,但只完成简单的工作,比如一个小球滚过很多关卡,最后把门打开。译者注)。
列表和对象也他妈的是很重要的,Larry!(farging应该是作者不想说fucking那么直白,译者注)
Perl没法表达列表因为Larry一早犯了一个悲剧性的愚蠢的错误,把列表全抹平。于是(1,2,(3,4))魔术般地变成(1,2,3,4)。不是说你会想让它这样工作,而是Larry刚好那天在搞一个这样会更方便的问题。于是Perl的数据结构从此就变得爆炸了的鲸鱼了。
今天你看Perl的书,小教程或PPT的时候,不花三分之一的时间在“引用”上是不可能的。这就是Larry可怜的,坏了的,Goldberg(漫画家,想起来没? 译者注)式的对他那抹平列表的疯狂错误的解决方案。但是Perl的市场宣传做得那么难以置信地好以致它让你觉得这是你身上发生过的最好的东西。你可以对任何东西取它的引用。这很有趣!闻起来也很香(说肠子呢,译者注,呵呵)!
Perl不能支持面向对象编程因为Larry压根不相信这玩意儿。这可能没什么大不了; 我也不是很确定我是不是信这个OOP。但是那么为啥他又要试着把对象加进Perl呢? Perl的面向对象是个半成品,且在Perl社区里没多少人重视。它就是不像字符串处理或Unix集成那样充满灵感。
当然了,Perl还有其他很多怪怪的特性。比如它的“上下文”,这是Larry要有N个变量名字空间的喜剧式决定的一个恐怖片式的产物。这些空间由sigil来区分(就是Perl里变量名前面的‘$’,‘@’,‘%’字符),看着像是从shell脚本里拷贝来的。在Perl里,所有的运算符,所有的函数,所有的操作其行为都是六取一的随机的,取决于当前的“上下文”。没有一些规则或助记法能帮你搞定这些特定操作在特定上下文里的特定行为。你得把它们全记在脑子里。
想要个例子? 这儿有一个:在一个值量(scalar,对应于vector,向量)上下文里对一个哈希取值你得到一个字符串,里面是个分数,分子是目前已分配的键,分母是总共有多少个桶。鲸鱼肠子,我告诉你。
但就像我说的—直到最近,没啥能像Perl那样把屎搞定。 Ruby
每过15年左右,一门语言就会被更好的代替。C被C++代替,至少对大应用开发而又需要性能和数据类型的人们来说。C++被Java代替,而Java无疑在7年后又会被更好的东西代替—好吧,我说的是完全代替C++的7年后,这到目前为止还没有发生,主要是因为微软能在Java霸占桌面系统之前狙击它。但是在服务器上的应用而言,C++的阵地已经慢慢让给Java了。
Perl有一天也会消逝。那是因为一门新的语言Ruby刚刚终于被翻译成英语了。没错,它是在日本发明的,这么多地儿,没想到日本人搞出来了,还以为他们只是硬件和制造上占有名气,而不是他们的软件业,所以大家都跟你一样惊奇。为什么呢,大家可能都在想。但是我认为这都是跟打字有关。我根本不能想象他们以前能打字打得足够快,英文字母只有26个,他们却有上万个字。但是Emacs几年前支持多字节字符了,所以我猜他们现在打字速度他妈的快多了。(所以能搞出Ruby来了,译者猜作者是这个意思) (是的,他们也用Emacs—事实上日本人负责了Emacs多字节支持的大部工作,而且搞得坚不可摧。)
不管怎么样,Ruby从Perl那里偷师了所有的好东西; 实际上,Matz,Ruby的作者(Yukihiro Matsumoto,如果我没记错的话,但是他外号“Matz”),觉得他从Perl那里偷的有点太多了,他的鞋上也粘了些鲸鱼肠子。但是只是一丢丢。
最重要的是,Ruby拿来了Perl的串处理和Unix集成,一点没改,就是说语法都是一样的,于是乎啥也不说了,你就拥有了Perl最好的那部分。这是个不错的开局,特别是如果你不把Perl剩下的东西也拿进来的话。
但是之后Matz还从Lisp那里拿来的最好的列表处理,Smalltalk和其他语言那里拿来了最好的面向对象,CLU那里拿来了最好的迭代器,以及基本上是每个人每个事的最好的东西。
而他让这些东西全部都跑起来,跑得那么顺,你都不会注意到这些东西在那儿。我比其他任何语言都快就学会了Ruby,我总共会三十到四十门语言; 而我花了大概三天时间就能用Ruby比Perl还流畅地工作了,当了八年的Perl黑客后。这些东西是这么的和谐你都能自己猜它们是怎么工作的,而且大多数时候你都能猜对。漂亮。有趣。靠谱。
如果把语言比成自行车,那么AWK就是一辆粉系的儿童自行车,前面有个白色小框,还插块小旗,Perl就是沙滩车(还记得那有多酷吧? 唉。),而Ruby则是一辆七千五美金的钛合金山地自行车。从Perl飞跃到Ruby意义不下于从C++到Java的飞跃。却没有任何缺陷,因为Ruby几乎是Perl功能的一个超集,而Java却拿掉了一些人们想要的东西,且没有真正的提供一个替代品。
下次我会写更多关于Ruby的东西。我先需要灵感。去读读Lucky Stiff的(poignant) guide to Ruby吧。那本书是一本有灵感的书。真的,读一下。超赞。我不理解产生它的那种头脑,但它很有趣,很犀利,且全是关于Ruby的。好像。你会看到的。 Python
啊,Python怎么说呢,一个不错的语言,这么多年来一直旁边在等待它的机会? Python社区很长时间以来是那些勇敢地吞下红药片从Perl骇客帝国中醒来的人的避难营。
啊,有点像Smalltalk的人们,他们永远在等待替代C++,没想到半路杀出Java一下把它们操翻了,漂亮地,永久地。哎哟。Ruby正在对Python做着同样的事,现在,今天。可能会在一夜之间吧。
Python本来可以统治世界,可惜它有两个致命缺陷:空格,和冷淡。
空格很简单,就是说Python是用缩进来表达代码块之间的嵌套。它强制你必须按一定格式把所有的东西缩进,他们这样做是为了让所有人写的代码看上去一样。不料蛮多程序员讨厌这点,因为他们觉得自己的自由被拿走了; 感觉就像Python侵犯了宪法赋予他们的可以随便缩进格式和全写在一行上的权利。
Python的作者,Guido Van Rossum,也在早期犯过一些很傻地技术错误—没有像Larry的失误那么严重,但是还是有几个。比如,最早Python没有字面变量范围,但它同时也没有动态变量范围,而动态变量范围可能会有它一些问题,但它还是有用的。Python却没有这些,只有全局的和本地(函数)的两种范围。所以即使它是一个真正的OO系统,类甚至不能访问它们自己的动态成员变量。你必须给成员函数传“self”参数,一大堆self参数很快就会把你搞疯掉,即使你不在意空格问题。
等等之类。
但在我看来,Python不行其实是因为冷淡。这阻止了它成为首选脚本语言,或者首选一切语言。靠,人们现在还在用Tcl作嵌入解释执行器,虽然Python比Tcl好得不要太多—除了,我说,这个冷淡问题。
此处开始我不知所云。呵呵,这样吧,把原文贴在最后面。
注1,Eric告诉我当时几乎全是Jamie Zawinski,当他们在Lucid工作的时候。
注2,我写了这个之后很多人告诉我Paul Graham是用VI的,想不到。
注3,为了有据可查,我个人根本不介意空格问题。我认为因为这个而不喜欢Python是很傻的。我只是说有一堆比例让人惊奇的其他工程师讨厌空格问题。
What's the frost thing, you ask? Well, I used to have a lot of exceptionally mean stuff written here, but since Python's actually quite pleasant to work with (if you can overlook its warts), I no longer think it's such a great idea to bash on Pythonistas。The "frost thing" is just that they used to have a tendency to be a bit, well, frosty。Why?
Because they were so tired of hearing about the whitespace thing!
I think that's why Python never reached Perl's level of popularity, but maybe I'm just imagining things。
Coda
That was the ADJ article I really wanted to write。Or at least something like it。For some reason, though, my true feelings only seem to come out during insomniac attacks between 3am and 6am。Time for bed!2 hours 'til my next meeting。
这才是我真正想给亚马逊开发者杂志写的文章。或者至少是这样的。出于某些原因,我的真感情好像只有在我凌晨三点到六点失眠的时候都会流露。该睡觉了!我下个会议再过两小时就开始了。
(发布于2004年9月,小小的更新在3/28/2006)