人生苦短,我用Python
Python 是我喜歡的語言,簡潔,優美,容易使用。前兩天,我很激昂的向朋友宣傳 Python 的好處。
“好吧,我承認 Python 不錯,但它為什么叫 Python 呢?”
“呃,似乎是一個電視劇的名字。”
“那你說的 Guido 是美國人么?”
“他從 Google 換到 Dropbox 工作,但他的名字像是荷蘭人的。”
“你確定你很熟悉 Python 嗎?”
<p data-block_=""> 所以為了雪恥,我花時間調查了 Python 的歷史。我看到了 Python 中許多功能的來源和 Python 的設計理念,看到了一門編程語言的演化歷史,看到了 Python 與開源運動的奇妙聯系。從 Python 的歷史中,我們可以一窺開源開發的理念和成就。</p>
<p data-block_=""> 這也可以作為我寫的 Python 快速教程的序篇。</p>
<h2 data-block_=""> 起源</h2>
<p data-block_=""> Python 的作者,Guido von Rossum,確實是荷蘭人。1982 年,Guido 從阿姆斯特丹大學獲得了數學和計算機碩士學位。然而,盡管他算得上是一位數學家,但他更加享受計算機帶來的樂趣。用他的話說,盡管擁有數學和計算機雙料資 質,他總趨向于做計算機相關的工作,并熱衷于做任何和編程相關的活兒。</p>
<p data-block_=""> 在那個時候,Guido 接觸并使用過諸如 Pascal、C、 Fortran 等語言。這些語言的基本設計原則是讓機器能更快運行。在 80 年代,雖然 IBM 和蘋果已經掀起了個人電腦浪潮,但這些個人電腦的配置很低。比如早期的 Macintosh,只有 8MHz 的 CPU 主頻和 128KB 的 RAM,一個大的數組就能占滿內存。所有的編譯器的核心是做優化,以便讓程序能夠運行。為了增進效率,語言也迫使程序員像計算機一樣思考,以便能寫出更符 合機器口味的程序。在那個時代,程序員恨不得用手榨取計算機每一寸的能力。有人甚至認為C語言的指針是在浪費內存。至于動態類型,內存自動管理,面向對 象…… 別想了,那會讓你的電腦陷入癱瘓。</p>
<p data-block_=""> 這種編程方式讓 Guido 感到苦惱。Guido 知道如何用C語言寫出一個功能,但整個編寫過程需要耗費大量的時間,即使他已經準確的知道了如何實現。他的另一個選擇是 shell。Bourne Shell 作為 UNIX 系統的解釋器已經長期存在。UNIX 的管理員們常常用 shell 去寫一些簡單的腳本,以進行一些系統維護的工作,比如定期備份、文件系統管理等等。shell 可以像膠水一樣,將 UNIX 下的許多功能連接在一起。許多C語言下上百行的程序,在 shell 下只用幾行就可以完成。然而,shell 的本質是調用命令。它并不是一個真正的語言。比如說,shell 沒有數值型的數據類型,加法運算都很復雜。總之,shell 不能全面的調動計算機的功能。</p>
<p data-block_=""> Guido 希望有一種語言,這種語言能夠像C語言那樣,能夠全面調用計算機的功能接口,又可以像 shell 那樣,可以輕松的編程。ABC 語言讓 Guido 看到希望。ABC 是由荷蘭的數學和計算機研究所開發的。Guido 在該研究所工作,并參與到 ABC 語言的開發。ABC 語言以教學為目的。與當時的大部分語言不同,ABC 語言的目標是“讓用戶感覺更好”。ABC 語言希望讓語言變得容易閱讀,容易使用,容易記憶,容易學習,并以此來激發人們學習編程的興趣。比如下面是一段來自 Wikipedia 的 ABC 程序,這個程序用于統計文本中出現的詞的總數:</p>
HOW TO RETURN words document: PUT {} IN collection FOR line IN document: FOR word IN split line: IF word not.in collection: INSERT word IN collection RETURN collection
<p data-block_=""> HOW TO 用于定義一個函數。一個 Python 程序員應該很容易理解這段程序。ABC 語言使用冒號和縮進來表示程序塊。行尾沒有分號。for 和 if 結構中也沒有括號()。賦值采用的是 PUT,而不是更常見的等號。這些改動讓 ABC 程序讀起來像一段文字。</p>
<p data-block_=""> 盡管已經具備了良好的可讀性和易用性,ABC 語言最終沒有流行起來。在當時,ABC 語言編譯器需要比較高配置的電腦才能運行。而這些電腦的使用者通常精通計算機,他們更多考慮程序的效率,而非它的學習難度。除了硬件上的困難外,ABC 語言的設計也存在一些致命的問題:</p>
<p data-block_=""> 可拓展性差。ABC 語言不是模塊化語言。如果想在 ABC 語言中增加功能,比如對圖形化的支持,就必須改動很多地方。</p>
<p data-block_=""> 不能直接進行 IO。ABC 語言不能直接操作文件系統。盡管你可以通過諸如文本流的方式導入數據,但 ABC 無法直接讀寫文件。輸入輸出的困難對于計算機語言來說是致命的。你能想像一個打不開車門的跑車么?</p>
<p data-block_=""> 過度革新。ABC 用自然語言的方式來表達程序的意義,比如上面程序中的 HOW TO 。然而對于程序員來說,他們更習慣用 function 或者 define 來定義一個函數。同樣,程序員更習慣用等號來分配變量。盡管 ABC 語言很特別,但學習難度也很大。</p>
<p data-block_=""> 傳播困難。ABC 編譯器很大,必須被保存在磁帶上。當時 Guido 在訪問的時候,就必須有一個大磁帶來給別人安裝 ABC 編譯器。 這樣,ABC 語言就很難快速傳播。</p>
<p data-block_=""> 1989 年,為了打發圣誕節假期,Guido 開始寫 Python 語言的編譯器。Python 這個名字,來自 Guido 所摯愛的電視劇 Monty Python's Flying Circus。他希望這個新的叫做 Python 的語言,能符合他的理想:創造一種C和 shell 之間,功能全面,易學易用,可拓展的語言。Guido 作為一個語言設計愛好者,已經有過設計語言的嘗試。這一次,也不過是一次純粹的 hacking 行為。</p>
<h2 data-block_=""> 一門語言的誕生</h2>
<p data-block_=""> 1991 年,第一個 Python 編譯器誕生。它是用C語言實現的,并能夠調用C語言的庫文件。從一出生,Python 已經具有了:類,函數,異常處理,包含表和詞典在內的核心數據類型,以及模塊為基礎的拓展系統。</p>
<p data-block_=""> Python 語法很多來自C,但又受到 ABC 語言的強烈影響。來自 ABC 語言的一些規定直到今天還富有爭議,比如強制縮進。但這些語法規定讓 Python 容易讀。另一方面,Python 聰明的選擇服從一些慣例,特別是C語言的慣例,比如回歸等號賦值。Guido 認為,如果“常識”上確立的東西,沒有必要過度糾結。</p>
<p data-block_=""> Python 從一開始就特別在意可拓展性。Python 可以在多個層次上拓展。從高層上,你可以直接引入 .py 文件。在底層,你可以引用C語言的庫。Python 程序員可以快速的使用 Python 寫 .py 文件作為拓展模塊。但當性能是考慮的重要因素時,Python 程序員可以深入底層,寫C程序,編譯為 .so 文件引入到 Python 中使用。Python 就好像是使用鋼構建房一樣,先規定好大的框架。而程序員可以在此框架下相當自由的拓展或更改。</p>
<p data-block_=""> 最初的 Python 完全由 Guido 本人開發。Python 得到 Guido 同事的歡迎。他們迅速的反饋使用意見,并參與到 Python 的改進。Guido 和一些同事構成 Python 的核心團隊。他們將自己大部分的業余時間用于 hack Python。隨后,Python 拓展到研究所之外。Python 將許多機器層面上的細節隱藏,交給編譯器處理,并凸顯出邏輯層面的編程思考。Python 程序員可以花更多的時間用于思考程序的邏輯,而不是具體的實現細節。這一特征吸引了廣大的程序員。Python 開始流行。</p>
<h2 style="text-align:left;" data-block_=""> </h2>
人生苦短,我用 python!
<h2 data-block_=""> 時勢造英雄</h2>
<p data-block_=""> 我們不得不暫停我們的 Python 時間,轉而看一看瞬息萬變的計算機行業。1990 年代初,個人計算機開始進入普通家庭。Intel 發布了 486 處理器,windows 發布 window 3.0 開始的一系列視窗系統。計算機的性能大大提高。程序員開始關注計算機的易用性 ,比如圖形化界面。</p>
<h2 data-block_=""></h2>
<h2 data-block_=""> Windows 3.0</h2>
<p data-block_=""> 由于計算機性能的提高,軟件的世界也開始隨之改變。硬件足以滿足許多個人電腦的需要。硬件廠商甚至渴望高需求軟 件的出現,以帶動硬件的更新換代。C++和 Java 相繼流行。C++和 Java 提供了面向對象的編程范式,以及豐富的對象庫。在犧牲了一定的性能的代價下,C++和 Java 大大提高了程序的產量。語言的易用性被提到一個新的高度。我們還記得,ABC 失敗的一個重要原因是硬件的性能限制。從這方面說,Python 要比 ABC 幸運許多。</p>
<p data-block_=""> 另一個悄然發生的改變是 Internet。1990 年代還是個人電腦的時代,windows 和 Intel 挾 PC 以令天下,盛極一時。盡管 Internet 為主體的信息革命尚未到來,但許多程序員以及資深計算機用戶已經在頻繁使用 Internet 進行交流,比如使用 email 和 newsgroup。Internet 讓信息交流成本大大下降。一種新的軟件開發模式開始流行:開源。程序員利用業余時間進行軟件開發,并開放源代碼。1991 年,Linus 在 comp.os.minix 新聞組上發布了 Linux 內核源代碼,吸引大批 hacker 的加入。Linux 和 GNU 相互合作,最終構成了一個充滿活力的開源平臺。</p>
<p data-block_=""> 硬件性能不是瓶頸,Python 又容易使用,所以許多人開始轉向 Python。Guido 維護了一個 maillist,Python 用戶就通過郵件進行交流。Python 用戶來自許多領域,有不同的背景,對 Python 也有不同的需求。Python 相當的開放,又容易拓展,所以當用戶不滿足于現有功能,很容易對 Python 進行拓展或改造。隨后,這些用戶將改動發給 Guido,并由 Guido 決定是否將新的特征加入到 Python 或者標準庫中。如果代碼能被納入 Python 自身或者標準庫,這將極大的榮譽。由于 Guido 至高無上的決定權,他因此被稱為“終身的仁慈獨裁者”。</p>
<p data-block_=""> Python 被稱為“Battery Included”,是說它以及其標準庫的功能強大。這些是整個社區的貢獻。Python 的開發者來自不同領域,他們將不同領域的優點帶給 Python。比如 Python 標準庫中的正則表達是參考 Perl,而 lambda, map, filter, reduce 等函數參考了 Lisp。Python 本身的一些功能以及大部分的標準庫來自于社區。Python 的社區不斷擴大,進而擁有了自己的 newsgroup,網站,以及基金。從 Python 2.0 開始,Python 也從 maillist 的開發方式,轉為完全開源的開發方式。社區氣氛已經形成,工作被整個社區分擔,Python 也獲得了更加高速的發展。</p>
<p data-block_=""> 到今天,Python 的框架已經確立。Python 語言以對象為核心組織代碼,支持多種編程范式,采用動態類型,自動進行內存回收。Python 支持解釋運行,并能調用C庫進行拓展。Python 有強大的標準庫。由于標準庫的體系已經穩定,所以 Python 的生態系統開始拓展到第三方包。這些包,如 Django、web.py、wxpython、numpy、matplotlib、PIL,將 Python 升級成了物種豐富的熱帶雨林。</p>
<h2 data-block_=""> 啟示錄</h2>
<p data-block_=""> Python 崇尚優美、清晰、簡單,是一個優秀并廣泛使用的語言。Python 在 TIOBE 排行榜中排行第八,它是 Google 的第三大開發語言,Dropbox 的基礎語言,豆瓣的服務器語言。Python 的發展史可以作為一個代表,帶給我許多啟示。</p>
<p data-block_=""> 在 Python 的開發過程中,社區起到了重要的作用。Guido 自認為自己不是全能型的程序員,所以他只負責制訂框架。如果問題太復雜,他會選擇繞過去,也就是 cut the corner。這些問題最終由社區中的其他人解決。社區中的人才是異常豐富的,就連創建網站,籌集基金這樣與開發稍遠的事情,也有人樂意于處理。如今的項 目開發越來越復雜,越來越龐大,合作以及開放的心態成為項目最終成功的關鍵。</p>
<p data-block_=""> Python 從其他語言中學到了很多,無論是已經進入歷史的 ABC,還是依然在使用的C和 Perl,以及許多沒有列出的其他語言。可以說,Python 的成功代表了它所有借鑒的語言的成功。同樣,Ruby 借鑒了 Python,它的成功也代表了 Python 某些方面的成功。每個語言都是混合體,都有它優秀的地方,但也有各種各樣的缺陷。同時,一個語言“好與不好”的評判,往往受制于平臺、硬件、時代等等外部 原因。程序員經歷過許多語言之爭。其實,以開放的心態來接受各個語言,說不定哪一天,程序員也可以如 Guido 那樣,混合出自己的語言。</p>
<p data-block_=""> 無論 Python 未來的命運如何,Python 的歷史已經是本很有趣的小說。</p>
<span id="shareA4" class="fl">
</span>