1.動態(tài)語言和靜態(tài)語言
先說下什么是動態(tài)語言
動態(tài)語言胰蝠,是指程序在運(yùn)行時可以改變其結(jié)構(gòu):新的函數(shù)可以被引進(jìn),已有的函數(shù)可以被刪除等在結(jié)構(gòu)上的變化亩码。
ECMAScript(JavaScript)便是一個動態(tài)語言季率。除此之外如Ruby、Python等也都屬于動態(tài)語言描沟,而C飒泻、C++等語言則不屬于動態(tài)語言。
動態(tài)類型語言吏廉,意思就是類型的檢查是在運(yùn)行時做的泞遗,比如如下代碼是不是合法的要到運(yùn)行時才判斷(注意是運(yùn)行時的類型判斷)
而靜態(tài)類型語言的類型判斷是在運(yùn)行前判斷(如編譯階段),比如C#席覆、java就是靜態(tài)類型語言
2.Objective-C的動態(tài)運(yùn)行性
Objective-C語言是C語言的一個子類史辙,所以O(shè)bjective-C是一個靜態(tài)語言,但是Objective-C的三大特性之一的多態(tài)性讓其擁有了動態(tài)性。
oc的動態(tài)性讓程序可以在運(yùn)行時判斷其該有的行為聊倔,而不是像c等靜態(tài)語言一樣在編譯構(gòu)建時就確定下來晦毙。它的動態(tài)性主要體現(xiàn)在一下三個方面:
2.1。動態(tài)類型耙蔑。 如id類型见妒。實際上靜態(tài)類型因為其固定性和可預(yù)知性而使用得更加廣泛。靜態(tài)類型是強(qiáng)類型甸陌,而動態(tài)類型屬于弱類型须揣。運(yùn)行時決定接收者。
這里補(bǔ)充講一下強(qiáng)钱豁、弱類型:語言有無類型返敬、強(qiáng)類型和弱類型三種。無類型的不做任何檢查寥院,甚至不區(qū)分指令和數(shù)據(jù)劲赠;弱類型的檢查很弱,僅能區(qū)分指令和數(shù)據(jù)秸谢;強(qiáng)類型的嚴(yán)格在編譯期進(jìn)行檢查凛澎。強(qiáng)類型語言在沒有強(qiáng)制類型轉(zhuǎn)化前,不允許兩種不同類型的變量相互操作
2.2估蹄。 動態(tài)綁定塑煎。讓代碼在運(yùn)行時判斷需要調(diào)用什么方法,而不是在編譯時臭蚁。與其他面向?qū)ο笳Z言一樣最铁,方法調(diào)用和代碼并沒有在編譯時連接在一起,而是在消息發(fā)送時才進(jìn)行連接垮兑。運(yùn)行時決定調(diào)用哪個方法冷尉。
2.3。 動態(tài)載入系枪。讓程序在運(yùn)行時添加代碼模塊以及其他資源雀哨。用戶可以根據(jù)需要加載一些可執(zhí)行代碼和資源,而不是在啟動時就加載所有組件私爷∥砉祝可執(zhí)行代碼中可以含有和程序運(yùn)行時整合的新類。
3.運(yùn)行時機(jī)制
主要是將數(shù)據(jù)類型的確定由編譯時衬浑,推遲到了運(yùn)行時捌浩。 這個問題其實淺涉及到兩個概念,運(yùn)行時和多態(tài)工秩。?簡單來說尸饺,運(yùn)行時機(jī)制使我們直到運(yùn)行時才去決定一個對象的類別宏榕,以及調(diào)用該類別對象指定方法。
多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)侵佃。
意思就是假設(shè)生物類(life)都用有一個相同的方法-eat;?那人類屬于生物麻昼,豬也屬于生物,都繼承了life后馋辈,實現(xiàn)各自的eat抚芦,但是調(diào)用是我們只需調(diào)用各自的eat方法。?也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個選擇器)迈螟。 因此也可以說叉抡,運(yùn)行時機(jī)制是多態(tài)的基礎(chǔ)。
因此也可以說答毫,運(yùn)行時機(jī)制是多態(tài)的基礎(chǔ)
4.OC 和 Swift 的動靜
因為 OC 是動態(tài)的語言褥民,方法的調(diào)用并不是在編譯階段完全定死的,而是在運(yùn)行的時候以發(fā)送消息的形式進(jìn)行調(diào)用洗搂,所以這里就引出了一個比較受爭議的做法消返,就是通過運(yùn)行時的 api 對方法的調(diào)用進(jìn)行交換
Swift通過var和let聲明變量和常量,不需要指定數(shù)據(jù)類型耘拇,非常像JavaScript等動態(tài)語言撵颊。但是仔細(xì)學(xué)習(xí)可以發(fā)現(xiàn),其實Swift是靜態(tài)語言惫叛,而且是類型安全的靜態(tài)語言倡勇,即使是Int和Double也需要顯示轉(zhuǎn)換。那么不需要數(shù)據(jù)類型的聲明其實就是語法糖了嘉涌,是編譯器做的類型推斷妻熊,一旦類型確定就無法再改變了。所以Swift應(yīng)該還是靜態(tài)語言
5.補(bǔ)充:
做程序需三個階段仑最。
第一階段:編輯扔役,就是用寫字板、word之類或?qū)S玫能浖斎胲浖Z句词身。
第二階段:編譯厅目,把軟件語句翻譯準(zhǔn)機(jī)器代碼番枚,并進(jìn)行適當(dāng)?shù)膬?yōu)化法严,一般產(chǎn)生.obj文件。
第三階段:連接葫笼,把.obj根據(jù)里面的調(diào)用進(jìn)行優(yōu)化并產(chǎn)生可執(zhí)行文件深啤,即.exe或dll文件。