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