程式語言弱型別、強型別、動態型別、靜態型別語言的區別
阿新 • • 發佈:2018-11-16
將知識點分門別類可以更好的記憶,程式語言也是,同類型的語言之間也可以相互印證,更全面的理解。
下面轉自知乎。
基礎概念
- Program Errorstrapped errors。直譯器或編譯器不能處理的錯誤。導致程式終止執行,如除0,Java中陣列越界訪問untrapped errors。 出錯後繼續執行,但可能出現任意行為。如C裡的緩衝區溢位、Jump到錯誤地址
- Forbidden Behaviours 執行環境預先定義的錯誤。 語言設計時,可以定義一組forbidden behaviors. 它必須包括所有untrapped errors, 但可能包含trapped errors.
- Well behaved: 如果程式執行不可能出現forbidden behaviors,則為well behaved
- ill behavedwell behaved:可能出現forbidden behaviors則為ill behaved…
強、弱型別,靜態、動態型別
- 強型別strongly typed: 如果一種語言的所有程式都是well behaved——即不可能出現forbidden behaviors,則該語言為strongly typed。
- 弱型別weakly typed: 否則為weakly typed。比如C語言的緩衝區溢位,屬於trapped errors,即屬於forbidden behaviors…故C是弱型別。弱型別語言,型別檢查更不嚴格,如偏向於容忍隱式型別轉換。譬如說C語言的int可以變成double。 這樣的結果是:容易產生forbidden behaviours,所以是弱型別的動態、靜態型別
- 靜態型別 statically: 如果在編譯時拒絕ill behaved程式,則是statically typed;
a. 如果型別是語言語法的一部分,在是explicitly typed顯式型別;
b. 如果型別通過編譯時推導,是implicity typed隱式型別, 比如ML和Haskell - 動態型別dynamiclly: 如果在執行時拒絕ill behaviors, 則是dynamiclly typed。
Note
- 指令碼語言直接執行在直譯器,一般沒有編譯的過程,所以也稱為解釋語言。但為了工作效率,指令碼語言的編譯環境也可能被開發,像執行JavaScript的Node.js.
- 指令碼語言沒有編譯的過程, 通常會在執行環境下報錯,所以多為動態型別
- C#和Java, 為了程式設計效率及商業因素,都有自己的專用IDE,像VS和Eclipse。IDE為了程式碼的執行效率和健壯性會將程式設計師輸入的自然語言編譯為中間語言,例如.lib檔案和.jar檔案,編譯的過程在不同的IDE中是不同的。之後就是將各自格式的中間語言檔案部署到其執行環境, 也就是常說的 .Net Framework和 JRE()