Python是我喜歡的語言,簡(jiǎn)潔,優(yōu)美,容易使用。前兩天,我很激昂的向朋友宣傳Python的好處。
“好吧,我承認(rèn)Python不錯(cuò),但它為什么叫Python呢?”
“呃,似乎是一個(gè)電視劇的名字?!?/p>
“那你說的Guido是美國(guó)人么?”
“他從Google換到Dropbox工作,但他的名字像是荷蘭人的?!?/p>
“你確定你很熟悉Python嗎?”
所以為了雪恥,我花時(shí)間調(diào)查了Python的歷史。我看到了Python中許多功能的來源和Python的設(shè)計(jì)理念,看到了一門編程語言的演化歷史,看到了Python與開源運(yùn)動(dòng)的奇妙聯(lián)系。從Python的歷史中,我們可以一窺開源開發(fā)的理念和成就。
這也可以作為我寫的Python快速教程的序篇。
Python的作者,Guido von Rossum,確實(shí)是荷蘭人。1982年,Guido從阿姆斯特丹大學(xué)獲得了數(shù)學(xué)和計(jì)算機(jī)碩士學(xué)位。然而,盡管他算得上是一位數(shù)學(xué)家,但他更加享受計(jì)算機(jī)帶來的樂趣。用他的話說,盡管擁有數(shù)學(xué)和計(jì)算機(jī)雙料資質(zhì),他總趨向于做計(jì)算機(jī)相關(guān)的工作,并熱衷于做任何和編程相關(guān)的活兒。
在那個(gè)時(shí)候,Guido接觸并使用過諸如Pascal、C、 Fortran等語言。這些語言的基本設(shè)計(jì)原則是讓機(jī)器能更快運(yùn)行。在80年代,雖然IBM和蘋果已經(jīng)掀起了個(gè)人電腦浪潮,但這些個(gè)人電腦的配置很低。比如早期的Macintosh,只有8MHz的CPU主頻和128KB的RAM,一個(gè)大的數(shù)組就能占滿內(nèi)存。所有的編譯器的核心是做優(yōu)化,以便讓程序能夠運(yùn)行。為了增進(jìn)效率,語言也迫使程序員像計(jì)算機(jī)一樣思考,以便能寫出更符合機(jī)器口味的程序。在那個(gè)時(shí)代,程序員恨不得用手榨取計(jì)算機(jī)每一寸的能力。有人甚至認(rèn)為C語言的指針是在浪費(fèi)內(nèi)存。至于動(dòng)態(tài)類型,內(nèi)存自動(dòng)管理,面向?qū)ο蟆?別想了,那會(huì)讓你的電腦陷入癱瘓。
這種編程方式讓Guido感到苦惱。Guido知道如何用C語言寫出一個(gè)功能,但整個(gè)編寫過程需要耗費(fèi)大量的時(shí)間,即使他已經(jīng)準(zhǔn)確的知道了如何實(shí)現(xiàn)。他的另一個(gè)選擇是shell。Bourne Shell作為UNIX系統(tǒng)的解釋器已經(jīng)長(zhǎng)期存在。UNIX的管理員們常常用shell去寫一些簡(jiǎn)單的腳本,以進(jìn)行一些系統(tǒng)維護(hù)的工作,比如定期備份、文件系統(tǒng)管理等等。shell可以像膠水一樣,將UNIX下的許多功能連接在一起。許多C語言下上百行的程序,在shell下只用幾行就可以完成。然而,shell的本質(zhì)是調(diào)用命令。它并不是一個(gè)真正的語言。比如說,shell沒有數(shù)值型的數(shù)據(jù)類型,加法運(yùn)算都很復(fù)雜??傊?,shell不能全面的調(diào)動(dòng)計(jì)算機(jī)的功能。
Guido希望有一種語言,這種語言能夠像C語言那樣,能夠全面調(diào)用計(jì)算機(jī)的功能接口,又可以像shell那樣,可以輕松的編程。ABC語言讓Guido看到希望。ABC是由荷蘭的數(shù)學(xué)和計(jì)算機(jī)研究所開發(fā)的。Guido在該研究所工作,并參與到ABC語言的開發(fā)。ABC語言以教學(xué)為目的。與當(dāng)時(shí)的大部分語言不同,ABC語言的目標(biāo)是“讓用戶感覺更好”。ABC語言希望讓語言變得容易閱讀,容易使用,容易記憶,容易學(xué)習(xí),并以此來激發(fā)人們學(xué)習(xí)編程的興趣。比如下面是一段來自Wikipedia的ABC程序,這個(gè)程序用于統(tǒng)計(jì)文本中出現(xiàn)的詞的總數(shù):
- 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
HOW TO用于定義一個(gè)函數(shù)。一個(gè)Python程序員應(yīng)該很容易理解這段程序。ABC語言使用冒號(hào)和縮進(jìn)來表示程序塊。行尾沒有分號(hào)。for和if結(jié)構(gòu)中也沒有括號(hào)()。賦值采用的是PUT,而不是更常見的等號(hào)。這些改動(dòng)讓ABC程序讀起來像一段文字。
盡管已經(jīng)具備了良好的可讀性和易用性,ABC語言最終沒有流行起來。在當(dāng)時(shí),ABC語言編譯器需要比較高配置的電腦才能運(yùn)行。而這些電腦的使用者通常精通計(jì)算機(jī),他們更多考慮程序的效率,而非它的學(xué)習(xí)難度。除了硬件上的困難外,ABC語言的設(shè)計(jì)也存在一些致命的問題:
可拓展性差。ABC語言不是模塊化語言。如果想在ABC語言中增加功能,比如對(duì)圖形化的支持,就必須改動(dòng)很多地方。
不能直接進(jìn)行IO。ABC語言不能直接操作文件系統(tǒng)。盡管你可以通過諸如文本流的方式導(dǎo)入數(shù)據(jù),但ABC無法直接讀寫文件。輸入輸出的困難對(duì)于計(jì)算機(jī)語言來說是致命的。你能想像一個(gè)打不開車門的跑車么?
過度革新。ABC用自然語言的方式來表達(dá)程序的意義,比如上面程序中的HOW TO 。然而對(duì)于程序員來說,他們更習(xí)慣用function或者define來定義一個(gè)函數(shù)。同樣,程序員更習(xí)慣用等號(hào)來分配變量。盡管ABC語言很特別,但學(xué)習(xí)難度也很大。
傳播困難。ABC編譯器很大,必須被保存在磁帶上。當(dāng)時(shí)Guido在訪問的時(shí)候,就必須有一個(gè)大磁帶來給別人安裝ABC編譯器。 這樣,ABC語言就很難快速傳播。
1989年,為了打發(fā)圣誕節(jié)假期,Guido開始寫Python語言的編譯器。Python這個(gè)名字,來自Guido所摯愛的電視劇Monty Python's Flying Circus。他希望這個(gè)新的叫做Python的語言,能符合他的理想:創(chuàng)造一種C和shell之間,功能全面,易學(xué)易用,可拓展的語言。Guido作為一個(gè)語言設(shè)計(jì)愛好者,已經(jīng)有過設(shè)計(jì)語言的嘗試。這一次,也不過是一次純粹的hacking行為。
1991年,第一個(gè)Python編譯器誕生。它是用C語言實(shí)現(xiàn)的,并能夠調(diào)用C語言的庫文件。從一出生,Python已經(jīng)具有了:類,函數(shù),異常處理,包含表和詞典在內(nèi)的核心數(shù)據(jù)類型,以及模塊為基礎(chǔ)的拓展系統(tǒng)。
Python語法很多來自C,但又受到ABC語言的強(qiáng)烈影響。來自ABC語言的一些規(guī)定直到今天還富有爭(zhēng)議,比如強(qiáng)制縮進(jìn)。但這些語法規(guī)定讓Python容易讀。另一方面,Python聰明的選擇服從一些慣例,特別是C語言的慣例,比如回歸等號(hào)賦值。Guido認(rèn)為,如果“常識(shí)”上確立的東西,沒有必要過度糾結(jié)。
Python從一開始就特別在意可拓展性。Python可以在多個(gè)層次上拓展。從高層上,你可以直接引入.py文件。在底層,你可以引用C語言的庫。Python程序員可以快速的使用Python寫.py文件作為拓展模塊。但當(dāng)性能是考慮的重要因素時(shí),Python程序員可以深入底層,寫C程序,編譯為.so文件引入到Python中使用。Python就好像是使用鋼構(gòu)建房一樣,先規(guī)定好大的框架。而程序員可以在此框架下相當(dāng)自由的拓展或更改。
最初的Python完全由Guido本人開發(fā)。Python得到Guido同事的歡迎。他們迅速的反饋使用意見,并參與到Python的改進(jìn)。Guido和一些同事構(gòu)成Python的核心團(tuán)隊(duì)。他們將自己大部分的業(yè)余時(shí)間用于hack Python。隨后,Python拓展到研究所之外。Python將許多機(jī)器層面上的細(xì)節(jié)隱藏,交給編譯器處理,并凸顯出邏輯層面的編程思考。Python程序員可以花更多的時(shí)間用于思考程序的邏輯,而不是具體的實(shí)現(xiàn)細(xì)節(jié)。這一特征吸引了廣大的程序員。Python開始流行。
聯(lián)系客服