Can you summarize the following document?
        
  選擇呼叫方法的具體版本的決定可以基於單個物件或者物件的組合。前者被稱為單一排程,並直接由常見的面嚮物件語言如C++,Java,Smalltalk、Objective-C、Swift、JavaScript和Python所支援。在這些和與其相類似的語言中,我們可以呼叫類似於語法的劃分的方法。其引數是可選的。這被認為是傳送一個名為divide,帶有除數引數的資訊來做除法。  相比之下,一些語言(例如Common Lisp、Dylan、Julia)採用基於運算元的組合的排程方法或函式;在除法情況下,被除數和除數的型別一起確定將執行哪個除法運算。這就叫做多重排程。

  語言可以用不同的動態排程機制來實現。 由語言提供的動態排程機制的選擇在很大程度上改變了在給定語言內可用或最自然使用的程式設計範例。  通常,在型別語言中,會基於引數的型別(最常見地基於訊息的接收者的型別)來執行排程機制。 這可能被稱為“單型別動態排程”。具有較弱或無打字系統的語言通常攜帶排程表作為每個物件的物件資料的一部分。這允許例項行為因為每個例項可以將給定訊息對映到單獨的方法。而有些語言提供混合方法。  動態排程總會產生開銷,因此一些語言為特定方法提供靜態排程。

  C ++使用早期繫結,並提供動態和靜態排程。 排程的預設形式是靜態的。 為了獲得動態分派,程式設計師必須將一個方法宣告為virtual。  C ++編譯器通常使用稱為虛擬表(vtable)的資料結構來實現動態排程,該表定義給定類(C ++本身沒有vtable的概念)的訊息到方法對映。 然後,該型別的例項將儲存指向此表的指標作為其例項資料的一部分。 當使用多重繼承時,這是複雜的因為C ++不支援後期繫結,C ++物件中的虛擬表不能在執行時修改,這將排程目標的潛在集限制為在編譯時選擇的有限集。  型別過載不會在C ++中產生動態分派,因為語言將訊息引數的型別視為正式訊息名稱的一部分。 這意味著程式設計師看到的訊息名不是用於繫結的正式名稱。

  在Go和Rust中使用了一種更多樣化的早期繫結。 Vtable指標會攜帶物件引用作為一種'fat指標'(go中的介面,或Rust中的'trait物件')。  這使得支援的介面與底層資料結構分離。 為了正確使用型別,每個編譯庫不需要知道所有的介面範圍,只需要知道他們所需要的具體vtable佈局即可。 程式碼可以將不同介面的同一塊資料傳遞給不同的函式。 這種多功能性以每個物件引用的額外資料為代價,如果許多這樣的引用被持久儲存會出問題。

  Smalltalk使用基於型別的訊息分派器。每個例項都有一個型別,其定義包含方法。當例項接收到訊息時,排程器在訊息到方法對映中查詢該型別的相應方法,然後呼叫該方法。  因為一個型別可以有一個基本型別鏈,這個查詢可能是非常昂貴的。 一個不成熟的Smalltalk機制的實現似乎比C ++有更高的開銷,並且這種開銷將會發生在物件接收的每個訊息裡。  真正的Smalltalk實現通常使用一種稱為內聯快取的技術,這種技術使得方法排程非常迅速。內聯快取基本上儲存呼叫站點的前一個目標方法地址和物件類(或者多對快取的多個對)。快取方法使用最常見的基於方法選擇器的目標方法(或僅快取缺失處理程式)來進行初始化。當在執行期間到達方法呼叫站點時,它只呼叫快取中的地址。(在動態程式碼生成器中,此呼叫是直接呼叫,因為直接地址由快取缺失邏輯負責回填)。被呼叫方法中的前序程式碼將快取的類與實際物件類進行比較,如果它們不匹配,程式到快取缺失處理程式分支中尋找正確的方法。一個快速實現可以具有多個快取記憶體條目,並且它通常僅需要幾個指令就可以在初始快取記憶體未命中時執行正確的方法。常見的情況是一個快取的類匹配,並且執行只會在該方法中繼續。  外部快取也可以通過使用物件類和方法選擇器來實現在方法呼叫邏輯中的使用。在一個設計中,類和方法選擇器被雜湊並且用作到方法分派快取記憶體表中的索引。  由於Smalltalk是一種反射語言,許多實現允許使用動態生成方法查詢表的方法將單個物件變成物件。這允許在每個物件的基礎上更改物件行為。一個被稱為基於原型語言的語言類別已經從這裡生根發芽,其中最著名的是Self和JavaScript。方法排程快取的細心的設計甚至允許基於原型的語言具有高效能排程方法。  許多其他動態型別的語言,包括Python、Ruby、Objective-C和Groovy都使用類似的方法。

  2.Driesen, Karel; Hölzle, Urs; Vitek, Jan (1995). "Message Dispatch on Pipelined Processors". ECOOP.  3.Müller, Martin (1995). "Message Dispatch in Dynamically-Typed Object-Oriented Languages" (Master thesis). University of New Mexico. pp. 16–17.
在電腦科學中,動態排程(Dynamic dispatch)是指執行時選擇哪一個多型操作的實現(方法或函式)來呼叫的過程。動態排程通常被應用於物件導向程式設計(OOP)的語言和系統,並被認為是一個主要特點。