python發展歷程

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!

Python是我喜歡的語言,簡潔,優美,容易使用。前兩天,我很激昂的向朋友宣傳Python的好處。
聽過之后,朋友問我:好吧,我承認Python不錯,但它為什么叫Python呢?
我不是很確定:呃,似乎是一個電視劇的名字。
朋友又問:那你說的Guido是美國人么? (Guido von Rossum,Python的作者)
我再次不是很確定:他從google換到Dropbox工作,但他的名字像是荷蘭人的 (有一個von在中間)。

所以,后面我花了些時間調查Python的歷史。這是很好的學習。我看到了Python中許多功能的來源和Python的設計理念,比如哪些功能是歷史遺留,哪些功能是重復,如何增加功能…… 而且,Python也是開源(open source)運動的一個成功案例。從Python的歷史中,我們可以一窺開源開發的理念和成就。

這也可以作為我寫的Python快速教程的序篇。

Python的起源

Python的作者,Guido von Rossum,確實是荷蘭人。1982年,Guido從阿姆斯特丹大學(University of Amsterdam)獲得了數學和計算機碩士學位。然而,盡管他算得上是一位數學家,但他更加享受計算機帶來的樂趣。用他的話說,盡管擁有數學和計算機雙料資質,他總趨向于做計算機相關的工作,并熱衷于做任何和編程相關的活兒。

在這里插入圖片描述
Guido von Rossum

在那個時候,他接觸并使用過諸如Pascal、C、 Fortran等語言。這些語言的基本設計原則是讓機器能更快運行。在80年代,雖然IBM和蘋果已經掀起了個人電腦浪潮,但這些個人電腦的配置很低 (在今天看來)。比如早期的Macintosh,只有8MHz的CPU主頻和128KB的RAM,一個大的數組就能占滿內存。所有的編譯器的核心是做優化,以便讓程序能夠運行。為了增進效率,語言也迫使程序員像計算機一樣思考,以便能寫出更符合機器口味的程序。在那個時代,程序員恨不得用手榨取計算機每一寸的能力。有人甚至認為C語言的指針是在浪費內存。至于動態類型,內存自動管理,面向對象…… 別想了,那會讓你的電腦陷入癱瘓。

然而,這種思考方式讓Guido感到苦惱。Guido知道如何用C語言寫出一個功能,但整個編寫過程需要耗費大量的時間 (即使他已經準確的知道了如何實現)。他的另一個選擇是shell。Bourne Shell作為UNIX系統的解釋器(interpreter)已經長期存在。UNIX的管理員們常常用shell去寫一些簡單的腳本,以進行一些系統維護的工作,比如定期備份、文件系統管理等等。shell可以像膠水一樣,將UNIX下的許多功能連接在一起。許多C語言下上百行的程序,在shell下只用幾行就可以完成。然而,shell的本質是調用命令。它并不是一個真正的語言。比如說,shell沒有數值型的數據類型,加法運算都很復雜。總之,shell不能全面的調動計算機的功能。

(關于shell,你可以參考Linux架構和Linux命令行與命令)

Guido希望有一種語言,這種語言能夠像C語言那樣,能夠全面調用計算機的功能接口,又可以像shell那樣,可以輕松的編程。ABC語言讓Guido看到希望。ABC是由荷蘭的CWI (Centrum Wiskunde & Informatica, 數學和計算機研究所)開發的。Guido在CWI工作,并參與到ABC語言的開發。ABC語言以教學為目的。與當時的大部分語言不同,ABC語言的目標是“讓用戶感覺更好”。ABC語言希望讓語言變得容易閱讀,容易使用,容易記憶,容易學習,并以此來激發人們學習編程的興趣。比如下面是一段來自Wikipedia的ABC程序,這個程序用于統計文本中出現的詞(word)的總數:

HOW TO RETURN words document:PUT {} IN collectionFOR line IN document:FOR word IN split line:IF word not.in collection:INSERT word IN collectionRETURN collection

HOW TO用于定義一個函數。一個Python程序員應該很容易理解這段程序。ABC語言使用冒號(:)和縮進來表示程序塊(C語言使用{}來表示程序塊)。行尾沒有分號。for和if結構中也沒有括號()。如果將HOW TO改為def,將PUT行改為collection = [],將INSERT行改為collection.append(word),這就幾乎是一個標準的Python函數。上面的函數讀起來就像一段自然的文字。

盡管已經具備了良好的可讀性和易用性,ABC語言最終沒有流行起來。在當時,ABC語言編譯器需要比較高配置的電腦才能運行。而這些電腦的使用者通常精通計算機,他們更多考慮程序的效率,而非它的學習難度。除了硬件上的困難外,ABC語言的設計也存在一些致命的問題:

  • 可拓展性差。ABC語言不是模塊化語言。如果想在ABC語言中增加功能,比如對圖形化的支持,就必須改動很多地方。
  • 不能直接進行IO。ABC語言不能直接操作文件系統。盡管你可以通過諸如文本流的方式導入數據,但ABC無法直接讀寫文件。輸入輸出的困難對于計算機語言來說是致命的。你能想像一個打不開車門的跑車么?
  • 過度革新。ABC用自然語言的方式來表達程序的意義,比如上面程序中的HOW TO (如何)。然而對于程序員來說,他們更習慣用function或者define來定義一個函數。同樣,程序員也習慣了用等號(=)來分配變量。這盡管讓ABC語言顯得特別,但實際上增加了程序員的學習難度 (程序員大都掌握不止一種語言)。
  • 傳播困難。ABC編譯器很大,必須被保存在磁帶(tape)上。當時Guido在訪問的時候,就必須有一個大磁帶來給別人安裝ABC編譯器。 這樣,ABC語言就很難快速傳播。
    在這里插入圖片描述
    IBM tape drive:讀寫磁帶

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 logo: 由Guido的兄弟Just von Rossum設計

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開始的一系列視窗系統。計算機的性能大大提高。程序員開始關注計算機的易用性 (比如圖形化界面)。
在這里插入圖片描述
Windows 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產生了興趣,歡迎閱讀Python快速教程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455777.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455777.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455777.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Django】RBAC權限管理系統模塊-理解

今天文章分為兩部分 :) PART1 RBAC權限管理內容分享/ PART2 關于字節跳動一面 10 Minutes Django-RBAC: PART 1 這權限管理系統主要功能是什么? 顧名思義,在系統中可以靈活的劃分角色組,可以根據功能特性來劃分:- 比如設置系…

NAL的基本特征

為了保證視頻流在不同傳輸環境中能有效地傳輸,單純的高壓縮率是不夠的,必須提供有效的方法,使視頻流能夠與傳輸協議無縫連接,才能應用到各種網絡。在以前的標準中,MPEG標準包含系統層,同時制定了H&#xff…

Linux使用circos

1.在conda中安裝bioconda conda install -c bioconda circos -y # 測試是否所有的module都安裝好了 circos -module # 所有都顯示OK則成功 ok 0.39 Font::TTF::Font ok 2.68 GD ok 0.2 GD::Polyline ... .... 2.檢查模塊是否齊全 circos -module 3.下…

下一步工作的一些思考和問題

前期PL和PS部分基本開發完成了,現在開始做界面交互集成的工作,總結一些思考和問題。 1,關于software cpu的計算時間,可能會比現在長。前期實驗時是裸跑程序,加入操作系統時,由于系統的多任務,PS…

python numpy教程_Python中的Numpy入門教程

這篇文章主要介紹了 Python 中的 Numpy 入門教程,著重講解了矩陣中的數組操作 , 需要的 朋友可以參考下 1 、 Numpy 是什么 很簡單, Numpy 是 Python 的一個科學計算的庫, 提供了矩陣運算的功能, 其一般與 Scipy 、 matplotlib 一…

jquery中的 jquery.contains(a,b)

jquery.contains(a,b) 判斷元素 a中是否包含 b 元素: 源碼: contains isNative(docElem.contains) || docElem.compareDocumentPosition ?function( a, b ) {var adown a.nodeType 9 ? a.documentElement : a,bup b && b.parentNode;return a bup || !!( bup &a…

【Mysql】數據庫主從搭建-基于docker

后臺可回復【1024】即可獲取相關寶藏內容分享 :) 為什么基于Docker搭建? 資源有限 虛擬機搭建對機器配置有要求,并且安裝mysql步驟繁瑣 一臺機器上可以運行多個Docker容器 Docker容器之間相互獨立,有獨立ip,互不沖突…

塑料封裝可靠性問題淺析

塑料封裝可靠性問題淺析 摘 要: 塑料封裝器件在現在的封裝產業中具有無可比擬的優勢,諸如成本、可靠性、尺寸以及重量等.但是還是有相當一部分人對于塑封器件的可靠性持懷疑態度.文章的目的就是使讀者能夠更深入地了解到塑封器件的可靠性,尤其是在塑封器件應用于高…

java創建對象new后面為啥可以傳入參數_你有認真了解過自己的“Java對象”嗎?渣男...

對象在 JVM 中是怎么存儲的對象頭里有什么?作為一名 Javaer,生活中的我們可能暫時沒有對象,但是工作中每天都會創建大量的 Java 對象,你有試著去了解下自己的“對象”嗎?我們從四個方面重新認識下自己的“對象”創建對…

【技術+某度面經】Jenkins 內容+百度面經分享

后臺可回復【1024】即可獲取相關寶藏內容分享 :) Q1: Jenkins是什么?? A:Jenkins是一款開源 CI&CD 軟件,用于自動化各種任務,包括構建、測試和部署軟件。 今天文章分為兩部分 :) PART1 Jenkins技術分享 / PART2 關…

xcode多工程聯編 - 詳細教程

2019獨角獸企業重金招聘Python工程師標準>>> 一、創建workspace (MyProject)放入MyProject文件夾內 二、先 打開workspace 創建app1工程 點擊next之后注意選擇 workspace 同理創建app2 或者更多的工程 完成之后的工作 重新打開workspace的樣子 三、使用pod 庫 首先…

動態規劃入門 合并石子 COGS1660 石子合并

1660. 石子合并(加強版) ★★ 輸入文件:stone3.in 輸出文件:stone3.out 簡單對比時間限制:1 s 內存限制:256 MB 【題目描述】 在一個圓形操場的四周擺放N堆石子,現要將石子有次序地合并成一堆.規定…

python實現百錢買百雞

個人博客點這里 Python語言基礎(百元買百雞) 需求分析 百錢買百雞的問題算是一套非常經典的不定方程的問題,題目很簡單: 公雞5文錢一只,母雞3文錢一只,小雞3只一文錢, 用100文錢買一百只雞,其中公雞,母雞…

實數是不是python數據類型_python 基本數據類型

一、數據類型及操作 #整數類型,和數學中整數的一樣,可正可負 *十進制:210 *二進制:以0B或者0b開頭:0b1010 *八進制:以0O或者0o開頭:0o123 *十六進制:以0x或者0X開頭:0x9a…

python之用循環實現五子棋小程序

在python中我們學過流程控制中的循環結構,現在我們來進行一個小應用的練習 本程序是通過循環控制結構來實現五子棋小程序的 游戲規則 五子棋的規則如下: 對局雙方各執一色棋子。空棋盤開局。黑先、白后,交替下子,每次只能下一子。棋子下在棋盤的空白點…

Principle of Computing (Python)學習筆記(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputing-001/wiki/view?pagetrees 1.2 CODE無parent域的樹 http://www.codeskulptor.org/#poc_tree.py class Tree:"""Recursive definition for tree…

C#線程篇---Task(任務)和線程池不得不說的秘密

我們要知道的是,QueueUserWorkItem這個技術存在許多限制。其中最大的問題是沒有一個內建的機制讓你知道操作在什么時候完成,也沒有一個機制在操作完成是獲得一個返回值,這些問題使得我們都不敢啟用這個技術。 Microsoft為了克服這些限制&…

關于編譯FFMPEG的初級教程

關于編譯FFMPEG的初級教程1.首先我們要下載相關工具,這里不多說,大家按照我的地址去下載文件就好了 MINGW下載地址:http://prdownloads.sourceforge.net/mingw/MinGW-3.1.0-1.exe?download 然后在下載MSYS :http://prdownloads.…

電子科學與技術相關索引匯總

電子科學與技術相關索引匯總 關于安裝deepinwindow10雙系統有時沒有聲音的問題關于deepin系統安裝design compiler的問題解答基于51單片機的交通燈控制設計基于物聯網的智能垃圾桶設計基于FPGA 的8b10b編解碼電路前端電路設計金屬磁記憶傳感器封裝集成電路版圖與工藝課程設計之…