Name binding 是一個將資料或是程式碼綁定(binding)到識別符(identifiers)的一個過程。一個識別符綁定到一個物件代表這個識別符會參考(reference)某個物件。

Name binding 在程式語言中式相當重要而複雜的一個議題,而它牽涉到作用域(scope)的問題,物件存在於程式碼的位置(語意)及物件的生命周期(時間)。

一般而言,當物件被去除綁定,那物件將會被垃圾回收(garbage collection)機制給處理掉。

Name binding 依據時間分為:

  • Static binding (or early binding):在編譯時期(compile time)進行綁定
  • Dynamic binding (or late binding):在執行時期(runtime)進行綁定

Static binding 的一個經典例子是 C 的函式呼叫,它在編譯時期就將函式內容綁定到識別符上,而無法在執行時期變更。

Dynamic binding 的一個相對應的例子則是 C++ 的虛擬方法呼叫,由於多型的機制,物件的型別無法在編譯時期得知,所以綁定會在執行時期處理。

在執行時期,如果識別符變更參考到其他的物件,我們稱為重新綁定(rebinding)。如果是變更識別符指向的物件本身,那麼我們稱為突變(mutation)。

在這邊提到多型的機制,就不得不去提 dispatch 的機制。一般在物件導向語言中以 dynamic dispatch 為主,表示在多型機制下,方法的選定是由第一個參數的型別來決定。

Dispatch 是個選擇的問題,而 binding 是個綁定的問題。選擇一定要發生在綁定後。

Dynamic dispatch 可以是 static binding 也可以是 dynamic binding,但是 dynamic binding 就只能在執行時間做 dispatch 了。

Dynamic dispatch 一般指 single dispatch,也就是由第一個參數的型別來決定要呼叫哪一個方法。相對也有 multiple dispatch,就會利用所有的參數型的排列組合來決定要呼叫哪一個方法。