綁定/約束 (binding)指兩個東西之間的關(guān)聯(lián)。如 名字 與它所代表的事物。又如屬性與實體之間的關(guān)聯(lián),又或者符號與操作之間的關(guān)聯(lián)。
早期的書翻譯成約束,后期的多數(shù)稱綁定。后續(xù)都稱綁定。
綁定發(fā)生的時間稱為 綁定時間 (binding time)。
綁定 和 綁定時間 是程序設(shè)計語言中了個非常重要的概念。
綁定可以發(fā)生在語言設(shè)計時、語言實現(xiàn)時、編譯時、連接時、載入時和運行時。
一、語言設(shè)計時
多數(shù)語言中運算符、流程控制結(jié)構(gòu)、內(nèi)部類型、對象的構(gòu)造形式等都是在語言設(shè)計時決定的。
如星號(*)在語言設(shè)計時與乘法操作綁定。
二、語言實現(xiàn)時
多數(shù)語言手冊都留下了許多問題,要求語言的實現(xiàn)者去仔細(xì)考慮和決定如何實現(xiàn)?
如基本類型的精度(取值范圍),c中的int在實現(xiàn)時與取值范圍綁定。
又如 棧和堆得阻止方式和最大規(guī)模。
三、編譯時
編譯器選擇了如何將高級的結(jié)構(gòu)映射到機(jī)器代碼,包括靜態(tài)定義的數(shù)據(jù)在內(nèi)存里的布局方式。
如java中的 變量 是在編譯時綁定于某特定的數(shù)據(jù)類型。
四、連接時
大部分編譯器支持“分別編譯”,連接器根據(jù)各模塊的情況選擇整體布局,并解決跨模塊的相互引用關(guān)系。需要由連接器把不同的模塊集合一起。
五、載入時
指操作系統(tǒng)將程序載入內(nèi)存,使之能夠執(zhí)行的那個時刻。
如java程序載入后變量與一個存儲單元綁定。
六、運行時
這是個廣義的概念,它覆蓋了從程序執(zhí)行開始到結(jié)束的這個時間跨度。
如變量與值的綁定發(fā)生運行時。但許多其它決策事項的情況則根據(jù)語言的不同而不同。
綁定又分為 靜態(tài)綁定 與 動態(tài)綁定。
靜態(tài)綁定/早綁定 指在運行之前建立的綁定,且在整個程序執(zhí)行過程期間保持不變。
動態(tài)綁定/晚綁定 指在運行期間建立的綁定,且在執(zhí)行過程中可被改變。
當(dāng)然,靜態(tài)與動態(tài)都是很粗略的說法。因為運行時的概念本身就很廣泛,并不嚴(yán)格。
純編譯型語言 (靜態(tài)語言),自然是早綁定的。它們效率更高,因為它們更早的做出了決策。
編譯器只對全局變量的語法語義做一次分析,即程序未運行之前完成。在那時就已確定這些變量的在內(nèi)存中的布局,并生成出發(fā)問它們的高效代碼。
純解釋型語言 (動態(tài)語言),自然是晚綁定的。它們更靈活,因為它們把許多決策推遲到運行時才做。相應(yīng)的其效率較低。
它可能在每次運行時分析一些聲明,甚至子程序每次調(diào)用時解釋器都要去分析局部變量。