1/08/2008

Ruby 跟 Python 本質上不同

前言

對岸高手孟岩最近寫了一篇「Ruby 1.9不会杀死Python」,裡面提到 Ruby 1.9 一出,彷彿 Ruby 已經邁向完全體,所有的缺點都已經消失了。彷彿已經要一統武林
有人认为,这下子不得了了,Ruby要称霸动态语言了。你想想,Ruby已经几乎拥有了所有梦幻般的语言特性,神奇的动态能力,强大的支持库,内置的跟Perl可以比肩的正则表达式,Smalltalk级别的纯而又纯的面向对象特征,简洁明快的风格,跨语言整合也非常容易,唯一的缺点就是速度慢。现在连这个缺点都被弥补了,Ruby还能挡得住吗?其他的动态语言都该歇菜了。
然後他又提到一個很有趣的分類,Ruby 是魔幻語言,Python 是簡約語言。Robbin 老大也出來講了Ruby为什么会受程序员的欢迎?。一整篇看下來,實在是很過癮。

簡約語言

簡約語言是什麼呢?大致上是 C、PHP、Python和Lua,C# ,Java。他的大概意含可以由Python 的中心思想 EIBTI 可以略知一二
Explicit is better than implicit.
看不懂的話,用更白話的方式來解釋,The Zen of Python 裡面有提到
There should be one-- and preferably only one --obvious way to do it.
也就是,Python 有意的限制語言的表示方式,使得不好的 coding 習慣都不能 Compile 過,有意的強制使用者養成良好的習慣。

這雖然極端了點,但也不超乎其他簡約語言的中心思想。簡約語言不關心語言的表述方式,他們在乎的是「解決問題」。以工程來看,簡約語言在大專案裡面的協同工作上面較為吃香。

魔幻語言

我很喜歡這個詞。魔幻語言的代表有 C++、Perl、Javascript和Ruby。中心思想可以由 Perl 的 TMTOWTDI 來表示
There's More Than One Way To Do It.
魔幻語言的擁護者思考的東西,這位孟岩老大也描寫的很傳神
他们写的代码是一种谜语般的艺术,出谜语和猜谜语的人们都能从中获得巨大的精神满足
但是,請不要輕易的把 Ruby 歸於「華而不實」這一派。Robbin 老大也在這裡講到
C++的魔幻语法会导致代码的可读性变差,而Ruby的魔幻语法会导致代码的可读性大大提高。

不论是matz本人,还是整个Ruby社区,Rails社区诸多开源项目的作者,抑或整个Ruby和Rails开发者社区,在一个编程哲学问题上是高度统一的,这就是:

强调程序员的快乐编程,追求人性化编程,在代码的可读性上面有偏执的追求,拒绝难以阅读的代码和难用的API。也就是所谓的coding for fun!
Ruby 奇妙的手法,以及 DSL 的技巧,都是為了達到跟 Python 同樣的 Promise Land ,那就是「code 可讀性」。只是兩者作法不同而已。

兩者的不同

兩者最大的不同是在「開發者的審美觀以及開發風格」上。不是語言的不同,是使用者個性上的不同。
回到开头的话题,Ruby是一个典型的魔幻语言,而Python则是简约派的代表。两个语言的支持人群在审美观念和开发风格方面差距非常大。初学Ruby和Python的人,都会感受到一种欣喜和兴奋,但是原因却不太一样。Ruby的学习者会惊喜于很多新的表达方式,比如 :attr_accessor 之类的魔幻特性,而Python学习者则会惊喜于实现具体功能的简洁性。可以说从一开始他们追求的就是不同的东西。随着学习的深入,Python开发者当然也会发现Python中的不少深入的特性,不过却并不倾向于滥用它们。长次以往,Python人群对任何语言的魔幻面都会产生一种厌恶感。我认识的一个Django开发者,就明确表示,就算RoR比Django开发效率高一点,也绝不使用Ruby,因为Ruby这个语言充满了“不必要的小聪明”。
高手果然是高手,好露骨的講法。Python 人對於「語言的魔幻面」,或是你要稱為「奇技淫巧」有種本質上的厭惡感,很多 Ruby 人引以為傲的東西,都會被視為「惡魔」。儘管 Python 也可以玩出些好玩的把戲,但是他們的中心思想讓他們「選擇不去作」。

而 Ruby 正如上面所說得,Ruby 人會被鼓勵使用「語言的魔幻面」,並且從中獲得相當的精神上的樂趣。但是跟「華而不實」最大的不同,是在於 Ruby 是利用語言的炫技,達到超乎想像的開發效率跟可讀性。最後,偉大的傑作誕生了,Ruby on Rails 用本身的「魔幻面」,反而達成了比PHP 這種 Web 專用的簡約語言的更高的可讀性。

本質上的不同?還是人的不同?

人的 tone 不同,才是真正的問題所在。或許雙子座的我,永遠不會欣賞 Python :p

奇想

不知道為什麼,寫這篇文章的時候,總是把魔幻語言想成魔法師,簡約語言想成戰士。所以腦中一直圍繞著 Ruby 是魔法技能點數 10 的魔法師,前面還有一個血防加到滿的戰士在前面罩著(Java),然後組隊一起打怪。

16 則留言:

godfat 真常 提到...
作者已經移除這則留言。
Plumm 提到...

同感呀, 我也是覺得如此, 只是...到 2.0 恐怕還沒這咩快...

gasolin 提到...

聲明我是偏向 Python 的.

引用了一下,發表點關於程式風格的意見
http://inet6.blogspot.com/2008/01/blog-post.html

Plumm 提到...

關於程式風格, 我覺得 Ruby 本身的程式風格就是主打簡潔明快的風格, 在這方面和 Python 不相上下, 但是對個人來說, Ruby 風格在 OO 方面簡明, 建置 DSL 容易, 使得要打造底層容易, 寫上層的程式設計師不會有種, 明明應該可以寫得更簡單輕鬆, 還要多寫一堆有的沒的的感覺, 關於這種我對 Python 還不夠深入所以不算瞭解. 另外要說的是, Ruby 程式設計師有很多不是從 Perl 出來的, 寫 Perl 的人還是繼續寫 Perl 的也不少, 主因是寫 Perl 的人如果喜歡 Perl 式的寫法也不會跳到 Ruby 了, 目前 Perl 人氣還是比 Ruby 高的, 而如果是從 Perl 跳至 Ruby 的人, 多半是比較欣賞 Ruby 語法的.

fauzty 提到...

我從不喜歡Python。它的縮排規定令我一見就不喜歡。但是這個特色或許正是喜歡她的人喜歡的原因呢~。

Mark 提到...

其實我喜歡 python 正好是因為他的縮排~

gasolin 提到...

寫程式跟寫文章一樣,要表達清楚,當然要善用換行跟縮排呀。

gasolin 提到...

魔法師跟戰士的比喻還是蠻有道理的,
Python 社群看到太怪的 convention 語法(ex: book/books) 時,愛掛在嘴邊的就是 'no magic' XD

而且看完下面範例你會發現, Python 語言確實跟戰士一樣,不用怎麼去學就可以當戰士 :D
http://code.google.com/p/zhpy/wiki/ControlFlow

我想這確實是兩者間的不同吧。

godfat 真常 提到...
作者已經移除這則留言。
Plumm 提到...

其實 Python 的縮排規定, 要套到其他語言也可以, 大家看過的程式之中, 應該超過 90% 都有用縮排吧, 不過一般語言使用者應該是不會連這寫法都訂得這麼一板一眼.而上方所列網址, 就這個其實要用 Ruby 做到同樣效果, 或說是其他語言要做到同樣效果幾乎寫法都差不多, 實在不能說是 Python 的優勢說.

Yuren Ju 提到...

但在其他的程式裡面,看到縮排亂七八糟的情形到處都是吧 :P

你在 python 裡面幾乎看不到縮排亂七八糟的情形。更何況用縮排就省了 {},這點也讓我蠻喜歡的。

godfat 真常 提到...
作者已經移除這則留言。
匿名 提到...

python与缩进无关,那只是一个小问题,刚开始用会有点不习惯,用三次就习惯了,就那么回事。
主要还是要一埋头,写几万行程序,而且挺放心的,不用担心整个系统要重写。
这里主要是能够错误比较少,性能比较稳定。
这个谁做的好,我就用谁。

bear 提到...

要說到奇淫技巧, c++ 社群才是極致, modern c++ design 的精神搞出了像boost 的 mpl 之類的 library
但代價是什麼? 底層機制越來越難以維護, 事情順利的時候都很讚, 一出問題根本難以追蹤

而 c++ 社群對 python 比對 ruby 友好的多, 雖然 c++ 社群善於使用奇淫技巧, 但他們卻不愛"濫用"奇淫技巧, mpl 是為了追求效率和簡潔而逼不得已所發明和使用的技巧, 但他們不會因此而偏好 ruby 這樣的語言

如果你兩種語言都有了解, 就會知道 python 也可以寫得滿滿的全是奇淫技巧, 這是動態語言本身就有的一種能力, ruby 只有在語法上"看起來"更像奇淫技巧, 事實上兩者可以做一模一樣的事, 但 ruby 的語法的可讀性就比較 magic (和 perl 同源)

python 的精神則偏好於, 只有好處比成本來得高時, 才會採用 magic, 但功能上兩者相差無幾, 只是 python 社群不喜濫用 magic, 為 magic 而 magic 叫做玩耍, 但 python 有沒有充滿 magic? 也是有, 看應用領域

匿名 提到...

Hola,

Felicito, que palabras adecuadas..., el pensamiento magnГ­fico
[url=http://ss20.myftp.org/]DingoDogg[/url]

Luoshu 提到...

不错,嘿嘿。