Python是一門什么樣的語言


先做個總結:Python是一門動態解釋型的強類型定義語言。

那何為動態?何為解釋?何為強類型呢?

我們需要了解編譯型和解釋型、靜態語言和動態語言、強類型定義語言和弱類型定義語言這6個概念就可知曉。

編譯型和解釋型

  我們先看看編譯型,其實它和匯編語言是一樣的:也是有一個負責翻譯的程序來對我們的源代碼進行轉換,生成相對應的可執行代碼。這個過程說的專業一點,就稱為編譯(Compile),而負責編譯的程序自然就稱為編譯器(Compiler)。如果我們寫的程序代碼都包含在一個源文件中,那么通常編譯之后就會直接生成一個可執行文件,我們就可以直接運行了。但對於一個比較復雜的項目,為了方便管理,我們通常把代碼分散在各個源文件中,作為不同的模塊來組織。這時編譯各個文件時就會生成目標文件(Object file)而不是前面說的可執行文件。一般一個源文件的編譯都會對應一個目標文件。這些目標文件里的內容基本上已經是可執行代碼了,但由於只是整個項目的一部分,所以我們還不能直接運行。待所有源文件的編譯都大功告成,我們就可以最后把這些半成品的目標文件“打包”成一個可執行文件了,這個工作由另一個程序負責完成,由於此過程好像是把包含可執行代碼的目標文件連接裝配起來,所以又稱為鏈接(Link),而負責鏈接的程序就叫鏈接程序(Linker)。鏈接程序除了鏈接目標文件外,可能還有各種資源,像圖標文件、聲音文件什么的,還要負責去除目標文件之間的冗余重復代碼,等等,所以...也是挺累的。鏈接完成后,一般就可以得到我們想要的可執行文件了。

上面我們大概介紹了編譯型語言的特點,現在再看看解釋型。從字面上看,“編譯”和“解釋”的確有“翻譯”的意思,他們的區別在於翻譯的時機安排不大一樣。打個比方:假如你打算閱讀一本外文書,而你不知道這門外語,那么你可以找一名翻譯,給他足夠的時間讓他把整本書從頭到尾翻譯好,然后把書的母語版交給你閱讀;或者,你也立刻讓這名翻譯輔助你閱讀,讓他一句一句給你翻譯,如果你想往回看某個章節,他也得重新給你翻譯。

兩種方式,前者相當於我們說的編譯型:一次把所有代碼朱煥為機器語言,然后寫可執行文件;而后這就相當於我們說的解釋型:在程序運行的前一刻,還只有源程序沒有可執行程序;而程序每執行到源程序的某一條指令,則會有有一個稱為解釋程序的外殼程序將源代碼轉換成二進制代碼以供執行,總言之就是不斷的解釋、執行、解釋、執行.....所以解釋型程序是離不開解釋程序的。像早期的BASIC就是一門經典的解釋型語言,要執行BASIC。解釋型程序中由於程序總是以源代碼的形式出現,因此只要有相應的解釋器,移植幾乎不成問題。編譯型程序雖然源代碼也可以移植,但前提是必須針對不同的系統分別進行編譯,對於復雜的工程來說,的確是意見不小時間的消耗,況且很可能一些細節的地方還要需要修改源代碼。而且,解釋型程序省卻了編譯的步驟,修改調試也非常方便,編輯完畢之后即可立即執行,不必像編譯程序一樣每次進行小小改動都要耐心等待漫長Compiling...Linking...這樣的編譯鏈接過程。不過凡事有利有弊,由於解釋型程序是將編譯的過程放到執行過程中,這就決定了解釋型程序注定要比編譯型慢上一大截,像幾百倍的速度差距也是不足為奇的。

編譯型和解釋型各有利弊。前者由於程序執行速度快,同等條件下對系統要求較低,因此像開發操作系統、大型應用程序、數據庫系統時都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可視編譯語言,而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不同系統平台間的兼容性有一定要求的程序則通常使用解釋型語言,如Java、JavaScript、VBScript、Perl、Python等等。

但既然編譯型和解釋型各有優缺點又互相對應,所以一批新興的語言都有把兩者折中起來的趨勢,例如Java語言雖然比較接近解釋型語言的特征,但執行之前已經預先進行一次預編譯,生成的代碼是介於機器碼和Java源代碼之間的中介代碼,運行的時候則由JVM(Java的虛擬機平台,可視為解釋器)解釋執行。它既保留源代碼的高抽象、可移植的特點,又已經完成了對源代碼的大部分預編譯工作,所以執行起來比“純解釋型”程序要快許多。而像VB6(或者以前版本)、C#這樣的語言,雖然表面上看生成的是.exe可執行程序文件,單VB6編譯之后實際生成的也是一種中介碼,只不過編譯器在前面安插了一段自動調用某個外部解釋器的代碼(該解釋程序獨立於用戶編寫的程序,存放於系統的某個DLL文件中,所有以VB6編譯生成的可執行程序都要用到它),以解釋執行實際的程序體。C#(以及其他.net的語言編譯器)則是生成.net目標代碼,實際執行時則由.net解釋系統(就像JVM一樣,也是一個虛擬平台)進行執行。當然.net目標代碼已經相當低級,比較接近機器語言了,所以仍將其視為編譯語言,,而且其移植程度也沒有Java號稱的這么強大,Java號稱是“一次編譯,到處執行”,而.net則是“一次編碼,到處編譯”。總而言之,隨着設計技術與硬件不斷發展,編譯型與解釋型兩種方式的界限正在不斷變得模糊。

動態語言和靜態語言

  通常我們說的動態語言和靜態語言是指動態類型語言和靜態類型語言。

(1)動態類型語言:冬天類型語言是指在運行期間才去做數據類型檢查的語言,也就是說,在用動態類型 語言編譯的時,永遠也不用給任何變量指定數據類型,該語言會在你第一次賦值給變量時,在內部將數據類型記錄下來。Python和Ruby就是一種典型的動態類型語言,其他的各種腳本語言如VBScript也多少屬於動態類型語言。

(2)靜態類型語言:靜態類型語言和動態類型語言正好相反,它的數據類型是在編譯期間檢查的,也就是說在寫程序時要聲明所有變量的數據類型,C/C++是靜態類型語言的典型代表,其他的靜態類型語言還有C#、Java等。

強類型定義語言和弱類型定義語言

(1)強類型定義語言:強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那么它就永遠是這個數據類型了。舉個例子,如果您定義了一個整型變量a,那么程序根本不能將a當做字符串類型處理。強類型定義語言是類型安全的語言。

(2)弱類型定義語言:數據類型可以被忽略的語言。它與強類型定義語言相反。一個變量可以賦不同數據類型的值。

強類型定義語言在速度上可能略遜色於弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。另外,“這門語言是不是動態語言”與“這門語言是否類型安全”之間是完全沒有聯系的!

例如:Python是動態語言,是強類型定義語言(類型安全的語言);VBScript是動態語言,是弱類型定義語言(類型不安全的語言);Java是靜態語言,是強類型定義語言(類型安全的語言)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM