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