參考網上的一些資料外加自己的理解整理出的有關幾種概念的區分。
首先看張圖:
一、編譯型語言,解釋型語言,混合型語言
1、編譯型語言
程序源碼通過編譯器生成機器碼,接着通過鏈接將機器碼與依賴庫鏈接起來生成可執行程序。
優點 :
源碼只需要通過一次編譯生成可執行程序,後續的運行只需要通過可執行程序即可,程序運行效率較高。
缺點
由於源碼在進行編譯的過程中,生成機器碼根據操作系統的不同會不一樣,所以編譯型語言依賴於編譯時的操作系統,更換不同型號的操作系統或者更改源代碼時,需要重新編譯。程序的可移植性較差。
實例
C、C++、Pascal、Object-C
2、解釋型語言
程序源碼不需要經過編譯,只需要解釋器進行翻譯即可執行。
優點
源碼運行過程中不依賴於平臺,程序的可移植性較好,且每次解釋器進行解釋時都會對代碼進行優化。
缺點
源碼每次運行時都需要進行一次解釋,程序的運行效率差。
實例
JavaScript、Python、Erlang、PHP、Perl、Ruby
3、混合型語言‘
編譯型語言與解釋型語言有利有弊,那這個時候就出現了一種混合型語言,結合了編譯型語言的一次編譯的優點與解釋型語言的可移植性的優點。源代碼通過編譯生成中間碼(與機器碼不同),然後通過解釋器將中間碼生成可執行程序
實例
Java,C#
二、動態語言、靜態語言
1、動態語言
在程序的運行過程中可以進行換源代碼結構的修改,例如插入新的對象,類等,或者進行原有代碼的刪除
實例
Object-C、C#、JavaScript、PHP、Python、Erlang。
2、靜態語言
與動態類型相反
實例
Java、C、C++
三、動態類型語言、靜態類型語言
1、動態類型語言
程序在運行的過程中進行數據類型檢查
實例
Python、Ruby、Erlang、JavaScript、swift、PHP、Perl
2、靜態類型語言
程序在編譯的過程中進行數據類型的檢查
實例
C、C++、C#、Java、Object-C
四、強類型語言、弱類型語言
這個從不同的角度來看是不同的定義,現在網上(我沒時間查文獻資料)一般分成兩種,一種是從數據類型的定義角度來看的,另一種是從程序編譯運行時程序的運行錯誤區分的,主要的爭議出現在C/C++,根據不同的角度,是不同類型的語言。下面是兩種不同的角度:
從數據類型的角度來看
1、強類型語言
變量的類型在定義階段即被限定,如果不經過強制數據類型轉換,則數據類型不可被更改
實例
Java、C#、Python、Object-C、Ruby
2、弱數據類型
變量的數據類型,而是在變量賦值的過程中進行定義,比如賦予a一個字符類型的值,那麼a的數據類型就是字符類型。賦予不同的類型,變量的類型也就因此改變
實例
JavaScript、PHP、C、C++
從編譯運行時的出現的錯誤來區分
在此之前首先區分幾個定義
error
1、trapped error:導致程序停止運行的錯誤
2、untrapped error:出錯後程序繼續執行,但是會出現奇奇怪怪的結果的錯誤,例如C語言的溢出,或者尋址錯誤
3、forbidden behaviors:程序語言進行設計時必須設計一組forbidden error,其中包含所有的untrapped error,也可能包含trapped error。
4、well behaved:程序中不能出現forbidden behaviors
5、ill behaved:程序中可能出現forbidden benhaviors
看圖:
1、強類型語言
如果一個編程語言所有的程序均爲well behaviors,則即爲強類型語言
實例
Java、C#、Python、Object-C、Ruby、C/C++
2、弱類型語言
如果一個編程語言會出現ill behaviors,則爲弱類型語言
實例
JavaScript、PHP、C、C++