一、動(dòng)態(tài)語(yǔ)言和靜態(tài)語(yǔ)言的概念
首先情竹,我們了解一個(gè)概念:動(dòng)態(tài)語(yǔ)言和靜態(tài)語(yǔ)言的概念;
靜態(tài):編譯期間
動(dòng)態(tài):運(yùn)行期間
動(dòng)態(tài)語(yǔ)言:是指程序運(yùn)行時(shí)藐不,可以改變程序結(jié)構(gòu),引入新的函數(shù)(方法)、已有的函數(shù)可以被刪除等在結(jié)構(gòu)上的變化佳吞;程序運(yùn)行期間才去做數(shù)據(jù)類(lèi)型檢查的語(yǔ)言拱雏,即在動(dòng)態(tài)類(lèi)型的語(yǔ)言編程時(shí),永遠(yuǎn)不要給任何變量指定數(shù)據(jù)類(lèi)型底扳,該語(yǔ)言在你第一次賦值給變量時(shí)铸抑,在內(nèi)部將數(shù)據(jù)類(lèi)型記錄下來(lái);
舉例:JavaScript衷模、Ruby鹊汛、Python … 都屬于動(dòng)態(tài)語(yǔ)言;
靜態(tài)語(yǔ)言:在編譯時(shí)阱冶,變量的數(shù)據(jù)類(lèi)型已經(jīng)確定刁憋,多數(shù)靜態(tài)類(lèi)型語(yǔ)言要求在使用變量之前必須聲明數(shù)據(jù)類(lèi)型;
舉例:C木蹬、C++ 至耻、Java、C# … 等語(yǔ)言靜態(tài)語(yǔ)言镊叁;
二尘颓、Objective-C 是不是動(dòng)態(tài)語(yǔ)言 ?
這需要從 Objective-C 的發(fā)展歷史說(shuō)起:
Tom Love 和 Brad Cox 這兩名開(kāi)發(fā)人員在 ITT 公司接觸到 Smalltalk 晦譬,Cox 想要在 C 語(yǔ)言中加入面相對(duì)象功能疤苹,只用 C 語(yǔ)言就可以進(jìn)行面相對(duì)象編程,將文件擴(kuò)展名命名為:COOPC敛腌,表示用 C 語(yǔ)言實(shí)現(xiàn)面向?qū)ο笪酝痢:髞?lái)兩人成了一家公司,新語(yǔ)言被命名為 Objective-C 像樊。若干年后尤莺,Steve Jobs 領(lǐng)導(dǎo)的一家名為 NeXT 的小型創(chuàng)業(yè)公司,獲準(zhǔn)使用并標(biāo)準(zhǔn)化 Objective - C 語(yǔ)言生棍,以作為 NeXT - step 操作系統(tǒng)的主要語(yǔ)言缝裁,NeXT 最終被蘋(píng)果收購(gòu),NeXTstep 操作系統(tǒng)最終發(fā)展為 Mac OS 系統(tǒng)足绅。
由此可見(jiàn),Objective-C 是對(duì) C 語(yǔ)言進(jìn)行擴(kuò)展韩脑,具備靜態(tài)語(yǔ)言的特性氢妈;
Smalltalk 是動(dòng)態(tài)語(yǔ)言的始祖,因此 Objective - C 是具備動(dòng)態(tài)語(yǔ)言的特性的段多,可以說(shuō) Objective-C 是動(dòng)態(tài)語(yǔ)言首量。
Objective - C 在純靜態(tài)語(yǔ)言和純動(dòng)態(tài)語(yǔ)言之間實(shí)現(xiàn)了平衡,是少有的幾種通常進(jìn)行編譯的語(yǔ)言,不僅能從類(lèi)似 C 和 C++ 在編譯時(shí)對(duì)語(yǔ)法進(jìn)行檢查加缘,還能從負(fù)責(zé)處理動(dòng)態(tài)對(duì)象類(lèi)型的動(dòng)態(tài)運(yùn)行時(shí)受益鸭叙;
因此,可以說(shuō) Objective - C 是動(dòng)態(tài)語(yǔ)言拣宏,但是是比較特殊的動(dòng)態(tài)語(yǔ)言沈贝;
Java 和 Objective-C 為何有很多的共同點(diǎn):
Objective-C 實(shí)際上影響了很多的其他編程技術(shù),比如 Java 語(yǔ)言和 Objective-C 具有很多共同點(diǎn)勋乾。原因是:在 Objective-C 的早期宋下,NeXT 和 Sun Microsystems 合作開(kāi)發(fā) OpenStep 平臺(tái),用來(lái)開(kāi)發(fā)這種技術(shù)的語(yǔ)言就是 Objective-C 辑莫。當(dāng) NeXT 計(jì)算機(jī)的表現(xiàn)沒(méi)有達(dá)到 Sun 公司的預(yù)期要求是学歧,NeXT 走向了失敗各吨;
Sun 公司決定自己開(kāi)發(fā)語(yǔ)言和跨平臺(tái)的開(kāi)發(fā)包 —— Java 枝笨,Java 工程師都是通曉 Objective-C 的,因?yàn)?Objective - C 是他們?cè)谑褂?Java 之前的首選語(yǔ)言揭蜒。后來(lái)一些較好的功能被引入 Java 中 横浑,因此,Java 和 Objective-C 具有很多的共同點(diǎn)忌锯。
舉例以更好的說(shuō)明 Objective-C 是具備動(dòng)態(tài)特性和靜態(tài)特性于一身的語(yǔ)言:
C 語(yǔ)言(靜態(tài)語(yǔ)言特性)伪嫁,函數(shù)的調(diào)用在編譯的時(shí)候,會(huì)決定調(diào)用那個(gè)函數(shù)偶垮;
Objective - C (靜態(tài)語(yǔ)言特性):在編譯時(shí)张咳,并不能決定真正調(diào)用哪個(gè)函數(shù),但是 Objective-C 會(huì)檢查調(diào)用函數(shù)似舵;
于是就出現(xiàn)了一種特殊情況:
在編譯階段脚猾,C 語(yǔ)言調(diào)用為實(shí)現(xiàn)的函數(shù),就會(huì)報(bào)錯(cuò)砚哗;
在編譯階段龙助,OC 時(shí)可以調(diào)用任何函數(shù)的,即使這個(gè)函數(shù)并未實(shí)現(xiàn)蛛芥,只要聲明過(guò)就不會(huì)報(bào)錯(cuò)提鸟;
OC 語(yǔ)言,具有動(dòng)態(tài)調(diào)用的過(guò)程仅淑,僅當(dāng)真正運(yùn)行時(shí)称勋,才能會(huì)根據(jù)函數(shù)名找到對(duì)應(yīng)的函數(shù)來(lái)調(diào)用。此時(shí)涯竟,函數(shù)如果仍然沒(méi)有實(shí)現(xiàn)赡鲜,就會(huì)報(bào)錯(cuò)了空厌;
C 語(yǔ)言程序的執(zhí)行過(guò)程:
源程序 - 預(yù)處理 - 編譯器 - 匯編器 - 鏈接器 - 可執(zhí)行目標(biāo)程序(二進(jìn)制)
關(guān)于執(zhí)行效率:靜態(tài)語(yǔ)言執(zhí)行效率要比動(dòng)態(tài)語(yǔ)言高;
解釋?zhuān)阂驗(yàn)橐徊糠?CPU 計(jì)算損耗在 RunTime 過(guò)程中银酬,而靜態(tài)語(yǔ)言生成的機(jī)器指令更簡(jiǎn)潔嘲更;正是因?yàn)檫@個(gè)原因,所以開(kāi)發(fā)語(yǔ)言的人付出了很大一部分努力保持 Runtime 小巧揩瞪;
Objective-C 語(yǔ)言是 C 語(yǔ)言的超集 + 一個(gè)小巧的 Runtime 環(huán)境