1. 程式人生 > >由Python談及程式語言的分類

由Python談及程式語言的分類

程式設計師之中有個永恆的爭論話題,什麼才是最好的程式語言?我覺得答案不是重點,而每個程式設計師使用的什麼語言也沒那麼值得關注,重要的是每種語言的特點和精華,一種語言的面世和普及必然有它的道理,理解它存在的意義才是我們值得關注的。

我自己用python比較多,我覺得它算是我的老友了,所以想先談談這位老朋友值得展開的特點和存在意義。

python在程式語言中的分類

1.談及語言分類,我們先會想到:動態型別和靜態型別語言。
動態型別:在執行期進行型別檢查的語言,也就是在編寫程式碼的時候可以不指定變數的資料型別,python就是動態型別語言。執行期進行型別檢查還可以繼續展開,不指定

變數的資料型別還是很方便的。
靜態型別:型別檢查發生在編譯期,也就是說我們需要提前指定變數的資料型別。C/C++/Java就是

2.還有強型別語言和弱型別語言
強型別:不經過強制轉換,永遠是那個資料型別,如果你double a, 你又int b = a,這個無法編譯。Java/python都是強型別語言
弱型別:允許編譯器進行隱式的型別轉換,如C/C++
看到有博文說,判斷是不是強型別,只需要看不同型別的資料相加是否報錯,比如整形+字串報型別錯誤,就是強型別。
對比一下:
弱型別:a=0 b=a+‘s’ //vbs, 自動轉換
強型別:int a = 0; string b=a.tostring()+“s”; //c#

3.還有解釋型語言和編譯型語言
計算機是無法理解我們編寫好的高階語言的,我們需要編譯器將它翻譯成機器語言,翻譯只有兩種方式,解釋和編譯,所以我們把程式語言可以更具翻譯的方式來分類。

解釋型語言少了編譯的步驟,只有在執行的時候才會翻譯,每執行一次翻譯一次,所以效率會比較低。比如python。可移植性好。

編譯型語言是編譯的時候直接形成了系統的可執行檔案,比如C++和C可直接編譯成可執行檔案.exe,下次執行時就不需要重新編譯了,直接使用編譯的結果(.exe),這樣只翻譯了一次,效率高!

舉個例子,你只懂英文,但想看一本俄文書(俄文類比我們程式設計用的高階語言),於是你請了個翻譯(直譯器或者編譯器)想把這本俄文書翻譯成英文(類比於機器能讀懂的機器程式碼),有兩種翻譯方法如下:
編譯型語言:一種是翻譯幫你把整本書翻譯下來寫成一本英文譯本(二進位制程式碼),每當你想看這本書你就看英文譯本就好了,看的快。
解釋型語言:另一種是你想讀那塊地方時翻譯會翻哪兒解釋給你聽,但你每次想重讀的時候都需要重新翻譯一遍。這個速度就沒有看英文快了。

進一步地說
我們還一種說法是把python叫做指令碼語言,為什麼叫指令碼語言,這源於Unix系統,目的是讓其像按照劇本一樣做事,英文中指令碼就是劇本的意思。
而指令碼語言的優勢,在於它事先不用編譯,我們看編譯型語言如C語言,將程式碼編譯成二進位制碼,執行時讀取很快(我只要吃過一次苦,以後我都可以享受我那次編譯吃的苦形成的二進位制碼),但是編譯的過程,和硬碟的關係特別大,這就造成了編譯型語言可移植性比較差。
指令碼語言,事先不需要進行編譯,直接讀取文字檔案,如 .py,一邊解釋一遍執行。但是每次執行都需要消耗解釋的時間,所以執行速度會比編譯型語言慢些。

最後總結

1.動態語言:不需要給變數指定資料型別
2.強型別語言:變數被指定了資料型別後,若不經過強制轉換(類似.tostring()),你永遠都是那個資料型別啦,1+‘a’是不會妥協通過的
3.為什麼有翻譯的過程,因為計算機只讀得懂二進位制程式碼,而我們人類寫的是高階語言。解釋型語言少了編譯的環節,每次執行都吃編譯的苦。編譯型語言吃一次苦,以後每次執行可以直接拿翻譯好的二進位制程式碼來用