Name binding 與 dispatch
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,就會利用所有的參數型的排列組合來決定要呼叫哪一個方法。