我的朋友曾對一位著名的作業系統專家說他想要設計一種真正優秀的程式語言。那位專家回答,這是浪費時間,優秀的語言不一定會被市場接受,很可能無人使用,因為語言的流行不取決於它本身。至少,那位專家設計的語言就遭遇到了這種情況。
那麼,語言的流行到底取決於什麼因素呢?流行的語言是否真的值得流行呢?還有必要嘗試設計一種更好的語言嗎?如果有必要的話,怎樣才能做到這一點呢?
為了找到這些問題的答案,我想我們可以觀察黑客,了解他們使用什麼語言。程式語言本來就是為了滿足黑客的需要而產生的,若且唯若黑客喜歡一種語言時,這種語言才能成為合格的程式語言,而不是被當作「指稱語義」(denotational semantics)或者編譯器設計。
流行的秘訣
沒錯,大多數人選擇某一種程式語言,不是因為這種語言有什麼獨特的特點,而是因為聽說其他人使用這種語言。但是我認為,外界因素對於程式語言的流行其實沒有想像中那麼大的影響力。我倒是覺得,問題出在對於什麼是優秀程式語言,黑客的看法與大多數的語言設計者不一樣。
大多數程式設計師也許無法分辨語言的好壞。但是,這不代表優秀的程式語言會被埋沒,專家級黑客一眼就能認出它們,並且會拿來使用。雖然他們人數很少,但就是這樣一小群人寫出了人類所有優秀軟體。他們有著巨大的影響力,他們使用什麼語言,其他程式設計師往往就會跟著使用。老實說,很多時候這種影響力更像是一種命令,對於其他程式設計師來說,專家級黑客就像自己的老闆或導師,他們說哪種語言好用,自己就會乖乖地跟進。
專家級黑客的看法不是決定一種語言流行程度的唯一因素,某些古老的軟體(Fortran和Cobol的情況)和鋪天蓋地的廣告宣傳(Ada和Java的情況)也會起到作用。但是,我認為從長期來看,專家級黑客的看法是最重要的因素
即使不考慮語言本身的優秀是否能帶動流行,我想單單流行本身就肯定會使得這種語言變得更好,只有流行才會讓它保持優秀。程式語言的最高境界一直在發展之中。雖然語言的核心功能就像大海的深處,很少有變化,但是函數庫和開發環境之類的東西就像大海的表面,一直在洶湧澎湃。
外部因素會影響到語言的流行。一種語言必須是某一個流行的計算機系統的腳本語言(scripting language),才會變得流行。Fortran和Cobol是早期IBM大型機的腳本語言。C是Unix的腳本語言,後來的Perl和Python也是如此。Tcl是Tk的腳本語言,Visual Basic是Windows的腳本語言,(某種形式的)Lisp是Emacs的腳本語言,PHP是網絡伺服器的腳本語言,Java和JavaScript是瀏覽器的腳本語言。
如果一種程式語言只有語法規則,沒有一個好的實現(implementation),那麼它就不能算完整的程式語言。這些都是很正常很合理的事情,程式語言本來就該如此。
當然,程式語言本來就需要一個好的實現,而且這個實現必須是免費的。商業公司願意出錢購買軟體,但是黑客作為個人不會願意這樣做,而你想讓一種語言成功,恰恰就是需要吸引黑客。
程式語言還需要有一本介紹它的書。這本書應該不厚,文筆流暢,而且包含大量優秀的範例。布賴恩 · 柯尼漢和丹尼斯 · 裡奇合寫的《C程序設計語言》(C Programming Language)就是這方面的典範
程式語言還應該有在線文檔。事實上,在線文檔可以當作一本書來寫,但是目前它還無法取代實體書。實體書並沒有過時,它們讀起來很方便,而且出版社對書籍內容的審核是一種很有用的質量保證機制(雖然做得很不完美)。書店則是程式設計師發現和學習新語言的最重要的場所之一
假定你的語言已經能夠滿足上面三項條件——一種免費的實現,一本相關書籍,以及語言所依附的計算機系統——那麼還需要做什麼才能使得黑客喜歡上你的語言?
黑客欣賞的一個特點就是簡潔。黑客都是懶人,他們同數學家和現代主義建築師一樣,痛恨任何冗餘的東西或事情。
不要覺得為用戶著想就是讓他們使用像英語一樣又長又囉嗦的語法。這是不正確的做法,Cobol就是因為這個毛病而聲名狼藉。如果你讓黑客像下面這樣求和:
add x to y giving z
而不是寫成:
z=x+y
那麼你就是在侮辱黑客的智商,或者自己作孽了。
簡潔性是靜態類型語言的力所不及之處。不考慮其他因素時,沒人願意在程序的頭部寫上一大堆的聲明語句。只要計算機可以自己推斷出來的事情,都應該讓計算機自己去推斷。舉例來說,hello-world本應該是一個很簡單的程序,但是在Java語言中卻要寫上一大堆東西,這本身就差不多可以說明Java語言設計得有問題了。
① hello-world程序的唯一作用就是顯示出「Hello, world!」這句話。使用Java語言,你需要這樣寫:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
如果你從來沒有接觸過編程,看到上面的代碼可能會很奇怪,讓計算機顯示一句話為什麼要搞得這麼複雜?有意思的是,資深程式設計師的反應與你一樣。
(未完待續,具體查看上文圖書連結)——本文節選自《黑客與畫家:矽谷創業之父Paul Graham文集》[美]Paul Graham 著