Python的起源python
Python的做者,Guido von Rossum,確實是荷蘭人。1982年,Guido從阿姆斯特丹大學(University of Amsterdam)得到了數學和計算機碩士學位。然而,儘管他算得上是一位數學家,但他更加享受計算機帶來的樂趣。用他的話說,儘管擁有數學和計算機雙料資質,他總趨向於作計算機相關的工做,並熱衷於作任何和編程相關的活兒。程序員
在那個時候,他接觸並使用過諸如Pascal、C、 Fortran等語言。這些語言的基本設計原則是讓機器能更快運行。在80年代,雖然IBM和蘋果已經掀起了我的電腦浪潮,但這些我的電腦的配置很低 (在今天看來)。好比早期的Macintosh,只有8MHz的CPU主頻和128KB的RAM,一個大的數組就能佔滿內存。全部的編譯器的核心是作優化,以便讓程序可以運行。爲了增進效率,語言也迫使程序員像計算機同樣思考,以便能寫出更符合機器口味的程序。在那個時代,程序員巴不得用手榨取計算機每一寸的能力。有人甚至認爲C語言的指針是在浪費內存。至於動態類型,內存自動管理,面向對象…… 別想了,那會讓你的電腦陷入癱瘓。web
而這種思考方式讓Guido感到苦惱。Guido知道如何用C語言寫出一個功能,但整個編寫過程須要耗費大量的時間 (即便他已經準確的知道了如何實現)。他的另外一個選擇是shell。Bourne Shell做爲UNIX系統的解釋器(interpreter)已經長期存在。UNIX的管理員們經常用shell去寫一些簡單的腳本,以進行一些系統維護的工做,好比按期備份、文件系統管理等等。shell能夠像膠水同樣,將UNIX下的許多功能鏈接在一塊兒。許多C語言下上百行的程序,在shell下只用幾行就能夠完成。然而,shell的本質是調用命令。它並非一個真正的語言。好比說,shell沒有數值型的數據類型,加法運算都很複雜。總之,shell不能全面的調動計算機的功能。shell
Guido但願有一種語言,這種語言可以像C語言那樣,可以全面調用計算機的功能接口,又能夠像shell那樣,能夠輕鬆的編程。ABC語言讓Guido看到但願。ABC是由荷蘭的CWI (Centrum Wiskunde & Informatica, 數學和計算機研究所)開發的。Guido在CWI工做,並參與到ABC語言的開發。ABC語言以教學爲目的。與當時的大部分語言不一樣,ABC語言的目標是「讓用戶感受更好」。ABC語言但願讓語言變得容易閱讀,容易使用,容易記憶,容易學習,並以此來激發人們學習編程的興趣。好比下面是一段來自Wikipedia的ABC程序,這個程序用於統計文本中出現的詞(word)的總數:express
1234567 <span style="font-size: 18px;">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</span> 編程
HOW TO用於定義一個函數。一個Python程序員應該很容易理解這段程序。ABC語言使用冒號(:)和縮進來表示程序塊(C語言使用{}來表示程序塊)。行尾沒有分號。for和if結構中也沒有括號()。若是將HOW TO改成def,將PUT行改成collection = [],將INSERT行改成collection.append(word),這就幾乎是一個標準的Python函數。上面的函數讀起來就像一段天然的文字。windows
儘管已經具有了良好的可讀性和易用性,ABC語言最終沒有流行起來。在當時,ABC語言編譯器須要比較高配置的電腦才能運行。而這些電腦的使用者一般精通計算機,他們更多考慮程序的效率,而非它的學習難度。除了硬件上的困難外,ABC語言的設計也存在一些致命的問題:數組
可拓展性差。ABC語言不是模塊化語言。若是想在ABC語言中增長功能,好比對圖形化的支持,就必須改動不少地方。服務器
不能直接進行IO。ABC語言不能直接操做文件系統。儘管你能夠經過諸如文本流的方式導入數據,但ABC沒法直接讀寫文件。輸入輸出的困難對於計算機語言來講是致命的。你能想像一個打不開車門的跑車麼?app
過分革新。ABC用天然語言的方式來表達程序的意義,好比上面程序中的HOW TO (如何)。然而對於程序員來講,他們更習慣用function或者define來定義一個函數。一樣,程序員也習慣了用等號(=)來分配變量。這儘管讓ABC語言顯得特別,但實際上增長了程序員的學習難度 (程序員大都掌握不止一種語言)。
傳播困難。ABC編譯器很大,必須被保存在磁帶(tape)上。當時Guido在訪問的時候,就必須有一個大磁帶來給別人安裝ABC編譯器。 這樣,ABC語言就很難快速傳播。
1989年,爲了打發聖誕節假期,Guido開始寫Python語言的編譯/解釋器。Python來自Guido所摯愛的電視劇Monty Python’s Flying Circus (BBC1960-1970年代播放的室內情景幽默劇,以當時的英國生活爲素材)。他但願這個新的叫作Python的語言,能實現他的理念(一種C和shell之間,功能全面,易學易用,可拓展的語言)。Guido做爲一個語言設計愛好者,已經有過設計語言的(不很成功)的嘗試。這一次,也不過是一次純粹的hacking行爲。
Python的誕生
1991年,第一個Python編譯器(同時也是解釋器)誕生。它是用C語言實現的,並可以調用C庫(.so文件)。從一出生,Python已經具備了:類(class),函數(function),異常處理(exception),包括表(list)和詞典(dictionary)在內的核心數據類型,以及模塊(module)爲基礎的拓展系統。
Python語法不少來自C,但又受到ABC語言的強烈影響。來自ABC語言的一些規定直到今天還富有爭議,好比強制縮進。但這些語法規定讓Python容易讀。另外一方面,Python聰明的選擇服從一些慣例(特別是C語言的慣例)。好比使用等號賦值,使用def來定義函數。Guido認爲,若是「常識」上確立的東西,沒有必要過分糾結。
Python從一開始就特別在乎可拓展性(extensibility)。Python能夠在多個層次上拓展。從高層上,你能夠引入.py文件。在底層,你能夠引用C語言的庫。Python程序員能夠快速的使用Python寫.py文件做爲拓展模塊。但當性能是考慮的重要因素時,Python程序員能夠深刻底層,寫C程序,編譯爲.so文件引入到Python中使用。Python就好像是使用鋼構建房同樣,先規定好大的框架。而程序員能夠在此框架下至關自由的拓展或更改。
最初的Python徹底由Guido本人開發。Python獲得Guido同事的歡迎。他們迅速的反饋使用意見,並參與到Python的改進。Guido和一些同事構成Python的核心團隊。他們將本身大部分的業餘時間用於hack Python (也包括工做時間,由於他們將Python用於工做)。隨後,Python拓展到CWI以外。Python將許多機器層面上的細節隱藏,交給編譯器處理,並凸顯出邏輯層面的編程思考。Python程序員能夠花更多的時間用於思考程序的邏輯,而不是具體的實現細節 (Guido有一件T恤,寫着:人生苦短,我用Python)。這一特徵吸引了廣大的程序員。Python開始流行。
咱們不得不暫停咱們的Python時間,轉而看一看這時的計算機概況。1990年代初,我的計算機開始進入普通家庭。Intel發佈了486處理器,windows發佈window 3.0開始的一系列視窗系統。計算機的性能大大提升。程序員開始關注計算機的易用性 (好比圖形化界面)。
因爲計算機性能的提升,軟件的世界也開始隨之改變。硬件足以知足許多我的電腦的須要。硬件廠商甚至渴望高需求軟件的出現,以帶動硬件的更新換代。C++和Java相繼流行。C++和Java提供了面向對象的編程範式,以及豐富的對象庫。在犧牲了必定的性能的代價下,C++和Java大大提升了程序的產量。語言的易用性被提到一個新的高度。咱們還記得,ABC失敗的一個重要緣由是硬件的性能限制。從這方面說,Python要比ABC幸運許多。
另外一個悄然發生的改變是Internet。1990年代仍是我的電腦的時代,windows和Intel挾PC以令天下,盛極一時。儘管Internet爲主體的信息革命還沒有到來,但許多程序員以及資深計算機用戶已經在頻繁使用Internet進行交流 (包括email和newsgroup)。Internet讓信息交流成本大大降低。一種新的軟件開發模式開始流行:開源 (open source)。程序員利用業餘時間進行軟件開發,並開放源代碼。1991年,Linus在comp.os.minix新聞組上發佈了Linux內核源代碼,吸引大批hacker的加入。Linux和GNU相互合做,最終構成了一個充滿活力的開源平臺。
硬件性能不是瓶頸,Python又容易使用,因此許多人開始轉向Python。Guido維護了一個maillist,Python用戶就經過郵件進行交流。Python用戶來自許多領域,有不一樣的背景,對Python也有不一樣的需求。Python至關的開放,又容易拓展,因此當用戶不知足於現有功能,很容易對Python進行拓展或改造。隨後,這些用戶將改動發給Guido,並由Guido決定是否將新的特徵加入到Python或者標準庫中。若是代碼能被歸入Python自身或者標準庫,這將極大的榮譽。Python自身也所以變得更好。
(Guido不得不做出許多決定,這也是他被稱爲Benevolent Dictator For Life的緣由)
Python被稱爲「Battery Included」,是說它以及其標準庫的功能強大。這些是整個社區的貢獻。Python的開發者來自不一樣領域,他們將不一樣領域的優勢帶給Python。好比Python標準庫中的正則表達(regular expression)是參考Perl,而lambda, map, filter, reduce函數參考Lisp。Python自己的一些功能以及大部分的標準庫來自於社區。Python的社區不斷擴大,進而擁有了本身的newsgroup,網站(python.org),以及基金 (Python Software Foundation)。從Python 2.0開始,Python也從maillist的開發方式,轉爲徹底開源的開發方式。社區氣氛已經造成,工做被整個社區分擔,Python也得到了更加高速的發展。
(因爲Guido享有絕對的仲裁權,因此在Python早期maillist的開發時代,很多愛好者至關擔憂Guido的生命。他們甚至做出假設:若是Guido掛了的話,Python會怎樣。見If Guido was hit by a bus)
到今天,Python的框架已經確立。Python語言以對象爲核心組織代碼(Everything is object),支持多種編程範式(multi-paradigm),採用動態類型(dynamic typing),自動進行內存回收(garbage collection)。Python支持解釋運行(interpret),並能調用C庫進行拓展。Python有強大的標準庫 (battery included)。因爲標準庫的體系已經穩定,因此Python的生態系統開始拓展到第三方包。這些包,如Django, web.py, wxpython, numpy, matplotlib,PIL,將Python升級成了物種豐富的熱帶雨林。
今天Python已經進入到3.0的時代。因爲Python 3.0向後不兼容,因此從2.0到3.0的過渡並不容易。另外一方面,Python的性能依然值得改進,Python的運算性能低於C++和Java(見Google的討論)。Python依然是一個在發展中的語言。我期待看到Python的將來。
Python啓示錄
Python崇尚優美、清晰、簡單,是一個優秀並普遍使用的語言 (TIOBE語言排行第八,Google的第三大開發語言,Dropbox的基礎語言,豆瓣的服務器語言)。這個世界並不缺少優秀的語言,但Python的發展史做爲一個表明,帶給我許多啓示。
在Python的開發過程當中,社區起到了重要的做用。Guido自認爲本身不是全能型的程序員,因此他只負責制訂框架。若是問題太複雜,他會選擇繞過去,也就是cut the corner。這些問題最終由社區中的其餘人解決。社區中的人才是異常豐富的,就連建立網站,籌集基金這樣與開發稍遠的事情,也有人樂意於處理。現在的項目開發愈來愈複雜,愈來愈龐大,合做以及開放的心態成爲項目最終成功的關鍵。
Python從其餘語言中學到了不少,不管是已經進入歷史的ABC,仍是依然在使用的C和Perl,以及許多沒有列出的其餘語言。能夠說,Python的成功表明了它全部借鑑的語言的成功。一樣,Ruby借鑑了Python,它的成功也表明了Python某些方面的成功。每一個語言都是混合體,都有它優秀的地方,但也有各類各樣的缺陷。同時,一個語言「好與很差」的評判,每每受制於平臺、硬件、時代等等外部緣由。程序員經歷過許多語言之爭。我想,爲何不以開放的心態和客觀的分析,去區分一下每一個語言的具體優勢缺點,去區份內部和外部的因素。說不定哪一天發現,我不喜歡的某個語言中,正包含了我所須要的東西。
不管Python將來的命運如何,Python的歷史已是本頗有趣的小說。
學習版本建議:Python 3.0
《Python人工智能和全棧開發》2018年07月23日即將在北京開課,120天衝擊Python年薪30萬,改變速約~~~~