我試圖理解早期和晚期綁定之間的區別,並且在過程中意識到綁定的概念對我來說是模糊的。 I think我知道它涉及到將數據作爲一個字的內存鏈接到類型作爲一組語言功能,但我不確定那些是正確的概念。另外,理解如何深深地幫助人們成爲更好的程序員?初學者問題:什麼是綁定?
請注意:這個問題不是「什麼是遲到早期綁定」或「什麼是2之間的折衷」。這些已經存在。
謝謝,
JDelage
我試圖理解早期和晚期綁定之間的區別,並且在過程中意識到綁定的概念對我來說是模糊的。 I think我知道它涉及到將數據作爲一個字的內存鏈接到類型作爲一組語言功能,但我不確定那些是正確的概念。另外,理解如何深深地幫助人們成爲更好的程序員?初學者問題:什麼是綁定?
請注意:這個問題不是「什麼是遲到早期綁定」或「什麼是2之間的折衷」。這些已經存在。
謝謝,
JDelage
綁定通常會將名稱與某個值相關聯。該值不一定是數據,但可以是任何具有名稱的數據,例如一個函數或一個類。
至於權衡:
早期綁定使早期提供的價值。因此,例如編譯器可以基於已知值應用優化,如評估常量表達式。這可能會導致更好的性能,並且不需要運行時支持來檢索值。
後期綁定需要稍後的值,因此它提供了更大的靈活性。更改部分代碼或重新配置系統變得更容易。
總的趨勢是朝後期綁定,因爲更快的處理器和更好的技術(例如JIT編譯)可以更頻繁地實現。
在其最簡單的,結合是一個符號的一個程序中,在存儲器中的地址的關聯。
例如:用C調用一個函數。當您的聲明瞭一個函數時,編譯器會記錄該函數的名稱及其代碼在目標文件中的位置。當您從一個單獨編譯的文件中調用函數時,編譯器會在發生調用的位置記錄對該名稱的引用。鏈接器負責綁定這兩個引用,以便該調用將引用正確的內存位置。
「綁定」基本上是說「這個函數/屬性名稱對應於這一位代碼」。
如果你談論更多數據綁定,那麼我會說,在他們的作品Data Binding Overview使用微軟很好的定義:
「數據綁定是 建立 應用之間的連接過程UI和業務邏輯。如果 結合具有正確的設置 和數據提供適當的 通知,然後,當數據 改變其值,即 綁定到數據元素反映改變 自動盟友。數據綁定也可以是 的意思是如果一個元素的外部表示 的數據發生變化,則 那麼底層數據可以自動更新爲 以反映 的變化。例如,如果用戶編輯 在TextBox元件的值,則 基礎數據值是自動 更新以反映該變化。」
換句話說,它是從一個數據 - 獲取數據的一種方式源(例如數據庫或XML文件)並將該數據應用於接口或顯示元素,例如,表單可能具有存儲在數據庫中的表中的值的下拉列表。過程將數據庫中的值「綁定」到列表中。單向數據綁定通常是「只讀」的,但雙向數據綁定允許用戶將值更新回基礎數據源。
在編譯器的上下文中,綁定是將地址引用更改爲實際絕對地址的階段。
當程序編譯,每個符號的地址(變量,函數)與符號名稱存儲在符號表中例如作爲相對從對象模塊的開始偏移,在一起。符號名稱是必需的,因爲可以從另一個目標模塊調用符號。
當程序是鏈接,目標模塊被組合成一個程序文件,不再需要符號名稱。 如果程序鏈接到已知的絕對地址中,則所有的地址引用都可以在處綁定到已經在此階段的絕對地址。
但是,在諸如PC:s的工作站中,程序可以加載到任何地址,因此在鏈接時地址是未知的。 因此,附加的重定位信息存儲在程序文件中,以便加載程序可以在加載時綁定地址。
綁定在加載時使用重定位信息完成。當程序將要運行的地址已知時,加載程序會使用重定位信息替換絕對地址的相對地址,該信息告訴代碼中需要完成更改的位置。
對於動態對象/變量,綁定可以在運行時完成。 (我認爲這通常稱爲後期綁定。)
通常,您不需要太在意綁定,至少在使用早期綁定時不需要太多關注。 (但是,運行時綁定可能會對性能和安全性產生負面影響。)
它也有意義,注意什麼是綁定與什麼是鏈接。例如。 Ada對這些使用單獨的步驟,而C則將它們合併/混淆。 – ndim 2010-04-23 13:44:48