編譯型語(yǔ)言和解釋型語(yǔ)言
1缘滥、編譯型語(yǔ)言
需通過(guò)編譯器(compiler)將源代碼編譯成機(jī)器碼轰胁,之后才能執(zhí)行的語(yǔ)言朝扼。一般需經(jīng)過(guò)編譯(compile)、鏈接(linker)這兩個(gè)步驟擎颖。編譯是把源代碼編譯成機(jī)器碼,鏈接是把各個(gè)模塊的機(jī)器碼和依賴(lài)庫(kù)串連起來(lái)生成可執(zhí)行文件肖抱。
優(yōu)點(diǎn):編譯器一般會(huì)有預(yù)編譯的過(guò)程對(duì)代碼進(jìn)行優(yōu)化。因?yàn)榫幾g只做一次意述,運(yùn)行時(shí)不需要編譯吮蛹,所以編譯型語(yǔ)言的程序執(zhí)行效率高荤崇〕闭耄可以脫離語(yǔ)言環(huán)境獨(dú)立運(yùn)行。
缺點(diǎn):編譯之后如果需要修改就需要整個(gè)模塊重新編譯每篷。編譯的時(shí)候根據(jù)對(duì)應(yīng)的運(yùn)行環(huán)境生成機(jī)器碼端圈,不同的操作系統(tǒng)之間移植就會(huì)有問(wèn)題子库,需要根據(jù)運(yùn)行的操作系統(tǒng)環(huán)境編譯不同的可執(zhí)行文件。
代表語(yǔ)言:C仑嗅、C++宴倍、Pascal仓技、Object-C以及最近很火的蘋(píng)果新語(yǔ)言swift
2、解釋型語(yǔ)言
解釋性語(yǔ)言的程序不需要編譯恭理,相比編譯型語(yǔ)言省了道工序郭变,解釋性語(yǔ)言在運(yùn)行程序的時(shí)候才逐行翻譯涯保。
優(yōu)點(diǎn):有良好的平臺(tái)兼容性,在任何環(huán)境中都可以運(yùn)行夕春,前提是安裝了解釋器(虛擬機(jī))。靈活及志,修改代碼的時(shí)候直接修改就可以,可以快速部署率寡,不用停機(jī)維護(hù)倚搬。
缺點(diǎn):每次運(yùn)行的時(shí)候都要解釋一遍,性能上不如編譯型語(yǔ)言每界。
代表語(yǔ)言:JavaScript、Python庙楚、Erlang趴樱、PHP酪捡、Perl、Ruby
3沛善、混合型語(yǔ)言
既然編譯型和解釋型各有缺點(diǎn)就會(huì)有人想到把兩種類(lèi)型整合起來(lái)塞祈,取其精華去其糟粕。就出現(xiàn)了半編譯型語(yǔ)言议薪。比如C#,C#在編譯的時(shí)候不是直接編譯成機(jī)器碼而是中間碼,.NET平臺(tái)提供了中間語(yǔ)言運(yùn)行庫(kù)運(yùn)行中間碼产捞,中間語(yǔ)言運(yùn)行庫(kù)類(lèi)似于Java虛擬機(jī)哼御。.net在編譯成IL代碼后,保存在dll中恋昼,首次運(yùn)行時(shí)由JIT在編譯成機(jī)器碼緩存在內(nèi)存中,下次直接執(zhí)行(博友回復(fù)指出)挟炬。我個(gè)人認(rèn)為拋開(kāi)一切的偏見(jiàn)C#是這個(gè)星球上最好的編程語(yǔ)言嗦哆。可惜微軟的政策限制了C#的推廣老速。
Java先生成字節(jié)碼再在Java虛擬機(jī)中解釋執(zhí)行。
嚴(yán)格來(lái)說(shuō)混合型語(yǔ)言屬于解釋型語(yǔ)言容客。C#更接近編譯型語(yǔ)言约郁。
動(dòng)態(tài)語(yǔ)言和靜態(tài)語(yǔ)言
1、動(dòng)態(tài)語(yǔ)言
是一類(lèi)在運(yùn)行時(shí)可以改變其結(jié)構(gòu)的語(yǔ)言:例如新的函數(shù)鬓梅、對(duì)象、甚至代碼可以被引進(jìn)芥丧,已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化。通俗點(diǎn)說(shuō)就是在運(yùn)行時(shí)代碼可以根據(jù)某些條件改變自身結(jié)構(gòu)续担。
主要?jiǎng)討B(tài)語(yǔ)言:Object-C、C#物遇、JavaScript、PHP乃沙、Python诗舰、Erlang。
2眶根、靜態(tài)語(yǔ)言
與動(dòng)態(tài)語(yǔ)言相對(duì)應(yīng)的,運(yùn)行時(shí)結(jié)構(gòu)不可變的語(yǔ)言就是靜態(tài)語(yǔ)言记劝。如Java诸老、C钳恕、C++。
3忧额、注意:
很多人認(rèn)為解釋型語(yǔ)言都是動(dòng)態(tài)語(yǔ)言,這個(gè)觀(guān)點(diǎn)是錯(cuò)的类茂!Java是解釋型語(yǔ)言但是不是動(dòng)態(tài)語(yǔ)言托嚣,Java不能在運(yùn)行的時(shí)候改變自己結(jié)構(gòu)。反之成立嗎示启?
動(dòng)態(tài)語(yǔ)言都是解釋型語(yǔ)言。也是錯(cuò)的迟螺!Object-C是編譯型語(yǔ)言,但是他是動(dòng)態(tài)語(yǔ)言矩父。得益于特有的run time機(jī)制(準(zhǔn)確說(shuō)runtime不是語(yǔ)法特性是運(yùn)行時(shí)環(huán)境,這里不展開(kāi))OC代碼是可以在運(yùn)行的時(shí)候插入民轴、替換方法的夹姥。
C#也是動(dòng)態(tài)語(yǔ)言杉武,通過(guò)C#的反射機(jī)制可以動(dòng)態(tài)的插入一段代碼執(zhí)行辙售。所以我說(shuō)C#是這個(gè)星球最好的編程語(yǔ)言。
動(dòng)態(tài)類(lèi)型語(yǔ)言和靜態(tài)類(lèi)型語(yǔ)言
1祈搜、動(dòng)態(tài)類(lèi)型語(yǔ)言
很多網(wǎng)上資料把動(dòng)態(tài)類(lèi)型語(yǔ)言和動(dòng)態(tài)語(yǔ)言混為一談士八,簡(jiǎn)直是誤人子弟。動(dòng)態(tài)類(lèi)型語(yǔ)言和動(dòng)態(tài)語(yǔ)言是完全不同的兩個(gè)概念蘸秘。動(dòng)態(tài)類(lèi)型語(yǔ)言是指在運(yùn)行期間才去做數(shù)據(jù)類(lèi)型檢查的語(yǔ)言蝗茁,說(shuō)的是數(shù)據(jù)類(lèi)型,動(dòng)態(tài)語(yǔ)言說(shuō)的是運(yùn)行是改變結(jié)構(gòu)哮翘,說(shuō)的是代碼結(jié)構(gòu)。
動(dòng)態(tài)類(lèi)型語(yǔ)言的數(shù)據(jù)類(lèi)型不是在編譯階段決定的阻课,而是把類(lèi)型綁定延后到了運(yùn)行階段艰匙。
主要語(yǔ)言:Python、Ruby员凝、Erlang、JavaScript、swift硕舆、PHP、Perl扬跋。
2、靜態(tài)類(lèi)型語(yǔ)言
靜態(tài)語(yǔ)言的數(shù)據(jù)類(lèi)型是在編譯其間確定的或者說(shuō)運(yùn)行之前確定的钦听,編寫(xiě)代碼的時(shí)候要明確確定變量的數(shù)據(jù)類(lèi)型倍奢。
主要語(yǔ)言:C、C++卒煞、C#、Java衣撬、Object-C扮饶。
3、注意:
相當(dāng)一部分程序員甜无,也包括曾經(jīng)的我,認(rèn)為解釋型語(yǔ)言都是動(dòng)態(tài)類(lèi)型語(yǔ)言陵究,編譯型語(yǔ)言都是靜態(tài)類(lèi)型語(yǔ)言元潘。這個(gè)也是錯(cuò)的君仆。swift是編譯型語(yǔ)言但是它也是動(dòng)態(tài)類(lèi)型語(yǔ)言。C#和Java是解釋型語(yǔ)言也是靜態(tài)類(lèi)型語(yǔ)言返咱。
強(qiáng)類(lèi)型語(yǔ)言和弱類(lèi)型語(yǔ)言
1、強(qiáng)類(lèi)型語(yǔ)言:
強(qiáng)類(lèi)型語(yǔ)言评姨,一旦一個(gè)變量被指定了某個(gè)數(shù)據(jù)類(lèi)型,如果不經(jīng)過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換吐句,那么它就永遠(yuǎn)是這個(gè)數(shù)據(jù)類(lèi)型。你不能把一個(gè)整形變量當(dāng)成一個(gè)字符串來(lái)處理攀芯。
主要語(yǔ)言:Java文虏、C#、Python氧秘、Object-C、Ruby
2搔确、弱類(lèi)型語(yǔ)言:
數(shù)據(jù)類(lèi)型可以被忽略已添,一個(gè)變量可以賦不同數(shù)據(jù)類(lèi)型的值。一旦給一個(gè)整型變量a賦一個(gè)字符串值更舞,那么a就變成字符類(lèi)型。
主要語(yǔ)言:JavaScript宇葱、PHP刊头、C、C++(C和C++有爭(zhēng)議原杂,但是確實(shí)可以給一個(gè)字符變量賦整形值,可能初衷是強(qiáng)類(lèi)型年局,形態(tài)上接近弱類(lèi)型)
3咸产、注意:
一個(gè)語(yǔ)言是不是強(qiáng)類(lèi)型語(yǔ)言和是不是動(dòng)態(tài)類(lèi)型語(yǔ)言也沒(méi)有必然聯(lián)系。Python是動(dòng)態(tài)類(lèi)型語(yǔ)言僵朗,是強(qiáng)類(lèi)型語(yǔ)言。JavaScript是動(dòng)態(tài)類(lèi)型語(yǔ)言验庙,是弱類(lèi)型語(yǔ)言。Java是靜態(tài)類(lèi)型語(yǔ)言云矫,是強(qiáng)類(lèi)型語(yǔ)言汗菜。