先來看幾個定義:
編譯型語言:
需要編輯器將源代碼編譯成機(jī)器碼之后才能執(zhí)行的語言拓萌。一般分兩個步驟 編譯(compile)、鏈接(linker)編譯是把各個文件源代碼編譯成機(jī)器碼站粟,鏈接是把各個文件的機(jī)器碼和依賴庫串連起來生成可執(zhí)行文件
源代碼->匯編代碼->機(jī)器碼->CPU執(zhí)行
優(yōu)點:編譯器一般會有預(yù)編譯的過程對代碼進(jìn)行優(yōu)化浦妄。因為編譯只做一次呢灶,運(yùn)行時不需要編譯吴超,所以編譯型語言的程序執(zhí)行效率高⊙炷耍可以脫離語言環(huán)境獨立運(yùn)行(執(zhí)行效率高)
缺點:編譯之后如果需要修改就需要整個模塊重新編譯癌淮。編譯的時候根據(jù)對應(yīng)的運(yùn)行環(huán)境生成機(jī)器碼株扛,不同的操作系統(tǒng)之間移植就會有問題斜纪,需要根據(jù)運(yùn)行的操作系統(tǒng)環(huán)境編譯不同的可執(zhí)行文件(跨平臺性能差)
代表語言:C徘铝、C++、Pascal宏蛉、Object-C遣臼、swift
解釋型語言:
不需要編譯,比編譯型語言省了道工序拾并,運(yùn)行的時候逐行進(jìn)行解釋揍堰,生成機(jī)器代碼
源代碼->字節(jié)碼->解釋器->機(jī)器碼->CPU執(zhí)行
優(yōu)點:有良好的平臺兼容性鹏浅,在任何環(huán)境中都可以運(yùn)行,前提是安裝了解釋器(虛擬機(jī))屏歹。靈活隐砸,修改代碼的時候直接修改就可以,可以快速部署蝙眶,不用停機(jī)維護(hù)季希。(跨平臺性強(qiáng))
缺點:程序不需要編譯,程序在運(yùn)行時才翻譯成機(jī)器碼幽纷,每執(zhí)行一次就要翻譯一次式塌,不可脫離語言環(huán)境獨立運(yùn)行(需要虛擬機(jī))(執(zhí)行效率差)
代表語言:JavaScript、Python友浸、Erlang峰尝、PHP、Perl收恢、Ruby
混合型語言:
既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來武学,取其精華去其糟粕。就出現(xiàn)了半編譯型語言伦意。比如C#,C#在編譯的時候不是直接編譯成機(jī)器碼而是中間碼火窒,.NET平臺提供了中間語言運(yùn)行庫運(yùn)行中間碼,中間語言運(yùn)行庫類似于Java虛擬機(jī)驮肉。.net在編譯成IL代碼后熏矿,保存在dll中,首次運(yùn)行時由JIT在編譯成機(jī)器碼緩存在內(nèi)存中离钝,下次直接執(zhí)行
動態(tài)語言:
是一類在運(yùn)行時可以改變其結(jié)構(gòu)的語言:例如新的函數(shù)曲掰、對象、甚至代碼可以被引進(jìn)奈辰,已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化。通俗點說就是在運(yùn)行時代碼可以根據(jù)某些條件改變自身結(jié)構(gòu)乱豆。
主要動態(tài)語言:Object-C奖恰、C#、JavaScript宛裕、PHP瑟啃、Python、Erlang揩尸。
靜態(tài)語言:
與動態(tài)語言相對應(yīng)的蛹屿,運(yùn)行時結(jié)構(gòu)不可變的語言就是靜態(tài)語言。如Java岩榆、C错负、C++
動態(tài)類型語言:
動態(tài)類型語言是指在運(yùn)行期間才去做數(shù)據(jù)類型檢查的語言
這里需要跟動態(tài)語言區(qū)別開坟瓢,動態(tài)類型語言說的是數(shù)據(jù)類型,動態(tài)語言說的是運(yùn)行時改變結(jié)構(gòu)犹撒,說的是代碼結(jié)構(gòu)折联。
靜態(tài)類型語言:
靜態(tài)語言的數(shù)據(jù)類型是在編譯其間確定的或者說運(yùn)行之前確定的,編寫代碼的時候要明確確定變量的數(shù)據(jù)類型
強(qiáng)類型語言:
強(qiáng)類型語言也稱為強(qiáng)類型定義語言识颊。是一種總是強(qiáng)制類型定義的語言诚镰,要求變量的使用要嚴(yán)格符合定義,所有變量都必須先定義后使用祥款。
弱類型語言:
與上正好相反清笨,像vb、php刃跛、js(也就是說抠艾,一個變量,你可以直接給他賦值字符串奠伪,也可以直接給他賦值數(shù)值跌帐,你還可以直接讓字符串類型的變量和數(shù)值類型的變量相加,雖然得出的最終結(jié)果未必是你想象的那樣绊率,但一定不會報錯)
基于上面的例子谨敛,你可以說swift允許我們不聲明類型并且讓編譯器自己檢測類型
var a = 10
看上去像是弱類型語言,但是swift推出它是int類型的滤否,所以不能像其賦值其他類型的值
這說明了脸狸,Swift 是一門強(qiáng)類型的語言。Swift 的類型聲明藐俺,你可以看成是在定義變量的時候炊甲,隱式聲明的(由編譯器推斷出),當(dāng)然也可以顯式的聲明欲芹。如下:
var a :Int = 10
OC 是 動態(tài)類型語言&&強(qiáng)類型語言&&動態(tài)語言&&編譯型語言
swift 是 動態(tài)類型語言&&強(qiáng)類型語言&&靜態(tài)語言&&編譯型語言
Java是一種靜態(tài)類型語言卿啡,也是一種強(qiáng)類型語言。因為編譯器不能自動檢測類型菱父,所以它是靜態(tài)的颈娜,而且類型受到嚴(yán)格限制,所以它也是一種強(qiáng)類型語言浙宜。
javascript是一種動態(tài)類型語言和非強(qiáng)類型語言官辽。
因為編譯器能夠在運(yùn)行時檢測類型,并且類型也不受嚴(yán)格限制粟瞬。