午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

動態(tài)語言 靜態(tài)語言 編譯型語言 解釋型語言

 一本正經(jīng)地胡鬧 2021-09-08

。。。

造成這種差異和誤解的根本原因是JAVA是一門靜態(tài)語言,而Python是一門動態(tài)語言。而恰好,JAVA又是一門編譯型的語言,而Python是一個用解釋器執(zhí)行的解釋型語言。于是有人告訴我,編譯型語言就是靜態(tài)語言,而解釋型語言就是動態(tài)語言。
事實果真如此么?我們一起來梳理下面幾個概念!

編譯型語言

需通過編譯器(compiler)將源代碼編譯成機器碼,之后才能執(zhí)行的語言。一般需經(jīng)過編譯(compile)、鏈接(linker)這兩個步驟。編譯是把源代碼編譯成機器碼,鏈接是把各個模塊的機器碼和依賴庫串連起來生成可執(zhí)行文件。

  • 優(yōu)點:一次編譯,重復(fù)可用,不需要每次執(zhí)行時再編譯一遍,由于編譯后生成的是能直接被機器執(zhí)行的機器碼,所以通常情況下執(zhí)行效率會更高。
  • 缺點:編譯之后如果需要修改就需要整個模塊重新編譯。編譯的時候根據(jù)對應(yīng)的運行環(huán)境生成機器碼,不同的操作系統(tǒng)之間移植就會有問題,需要根據(jù)運行的操作系統(tǒng)環(huán)境編譯不同的可執(zhí)行文件(比如Windows上的.exe文件,CentOS上的.rpm文件)。
  • 代表語言:C、C++、Pascal、Object-C以及最近很火的蘋果新語言swift

解釋型語言

解釋性語言的程序不需要編譯,相比編譯型語言省了道工序,解釋性語言在運行程序的時候才逐行翻譯為機器碼來給機器執(zhí)行。

  • 優(yōu)點:可以在任何安裝了解釋器(虛擬機)的機器上運行,不用關(guān)心用了什么操作系統(tǒng)。靈活,修改代碼的時候直接修改就可以,可以快速部署,不用停機維護。
  • 缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。
  • 代表語言:JavaScript、Python、Erlang、PHP、Perl、Ruby

混合型語言

既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來,取其精華去其糟粕。就出現(xiàn)了半編譯型語言。比如C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平臺提供了中間語言運行庫運行中間碼,中間語言運行庫類似于Java虛擬機。.net在編譯成IL代碼后,保存在dll中,首次運行時由JIT在編譯成機器碼緩存在內(nèi)存中,下次直接執(zhí)行。Java先生成字節(jié)碼再在Java虛擬機中解釋執(zhí)行。嚴(yán)格來說混合型語言屬于解釋型語言。C#更接近編譯型語言。

動態(tài)語言和靜態(tài)語言

動態(tài)語言

是一類在運行時可以改變其結(jié)構(gòu)的語言:例如新的函數(shù)、對象、甚至代碼可以被引進,已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化。通俗點說就是在運行時代碼可以根據(jù)某些條件改變自身結(jié)構(gòu)。
主要動態(tài)語言:Object-C、C#、JavaScript、PHP、Python、Erlang。

靜態(tài)語言

與動態(tài)語言相對應(yīng)的,運行時結(jié)構(gòu)不可變的語言就是靜態(tài)語言。如Java、C、C++。

走出誤區(qū)

很多人認(rèn)為解釋型語言都是動態(tài)語言,這個觀點是錯的!Java是解釋型語言但是不是動態(tài)語言,Java不能在運行的時候改變自己結(jié)構(gòu)。反之成立嗎?動態(tài)語言都是解釋型語言。也是錯的!Object-C是編譯型語言,但是他是動態(tài)語言。得益于特有的run time機制(準(zhǔn)確說run time不是語法特性是運行時環(huán)境,這里不展開)OC代碼是可以在運行的時候插入、替換方法的。

靜態(tài)類型語言和動態(tài)類型語言

為了不混淆動態(tài)語言和動態(tài)類型語言,下面還補充說明以下幾個概念

動態(tài)類型語言

很多網(wǎng)上資料把動態(tài)類型語言和動態(tài)語言混為一談,簡直是誤人子弟。動態(tài)類型語言和動態(tài)語言是完全不同的兩個概念。動態(tài)類型語言是指在運行期間才去做數(shù)據(jù)類型檢查的語言,說的是數(shù)據(jù)類型,動態(tài)語言說的是運行是改變結(jié)構(gòu),說的是代碼結(jié)構(gòu)。
動態(tài)類型語言的數(shù)據(jù)類型不是在編譯階段決定的,而是把類型綁定延后到了運行階段。
主要語言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

靜態(tài)類型語言

靜態(tài)語言的數(shù)據(jù)類型是在編譯其間確定的或者說運行之前確定的,編寫代碼的時候要明確確定變量的數(shù)據(jù)類型。
主要語言:C、C++、C#、Java、Object-C。

注意

解釋型語言并不都是動態(tài)類型語言,編譯型語言也不全是靜態(tài)類型語言。swift是編譯型語言但是它也是動態(tài)類型語言。C#和Java是解釋型語言也是靜態(tài)類型語言,雖然它們看作解釋型語言,但是它們也有編譯過程,會在編譯過程中做數(shù)據(jù)類型的檢查
所以,動態(tài)類型語言是數(shù)據(jù)類型檢查的動態(tài)(運行時檢查),而不是像動態(tài)語言一樣代碼邏輯結(jié)構(gòu)的在運行時可變更,靜態(tài)則相反。

強類型語言和弱類型語言

說到數(shù)據(jù)類型,就不得不提從數(shù)據(jù)類型是否嚴(yán)格定義的角度產(chǎn)生的另外兩個概念:強類型語言和弱類型語言

強類型語言:

強類型語言,一旦一個變量被指定了某個數(shù)據(jù)類型,如果不經(jīng)過強制類型轉(zhuǎn)換,那么它就永遠是這個數(shù)據(jù)類型。你不能把一個整形變量當(dāng)成一個字符串來處理。
主要語言:Java、C#、Python、Object-C、Ruby

弱類型語言:

數(shù)據(jù)類型可以被忽略,一個變量可以賦不同數(shù)據(jù)類型的值。一旦給一個整型變量a賦一個字符串值,那么a就變成字符類型。
主要語言:JavaScript、PHP

3、注意:

一個語言是不是強類型語言和是不是動態(tài)類型語言也沒有必然聯(lián)系。Python是動態(tài)類型語言,是強類型語言。JavaScript是動態(tài)類型語言,是弱類型語言。Java是靜態(tài)類型語言,是強類型語言。

附錄概念對照表

概念 劃分角度 特點
編譯型語言 執(zhí)行方式 將源代碼編譯為機器碼給機器執(zhí)行
解釋型語言 執(zhí)行方式 將源代碼交由解釋器解釋為機器碼執(zhí)行
混合型語言 執(zhí)行方式 將源代碼編譯為“中間碼”,再交由解釋器(虛擬機)解釋為機器碼執(zhí)行
動態(tài)語言 代碼邏輯結(jié)構(gòu)是否可以在運行時改變 可以改變
靜態(tài)語言 代碼邏輯結(jié)構(gòu)是否可以在運行時改變 不可改變
動態(tài)類型語言 代碼的數(shù)據(jù)類型何時檢查 運行時檢查
靜態(tài)類型語言 代碼的數(shù)據(jù)類型何時檢查 運行時不檢查
強類型語言 變量定義后是否可以隨意改變數(shù)據(jù)類型 不可以
弱類型語言 變量定義后是否可以隨意改變數(shù)據(jù)類型 可以

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多