反映發出應用程式案例
本節將進一步說明某些應用程式使用反映發出和動態方法的案例。
在 Web 瀏覽器中執行指令碼
在這個案例中,Web 瀏覽器載入含有指令碼程式的 HTML 網頁,並執行程式。 步驟如下:
Web 瀏覽器在 Web 瀏覽器的應用程式定義域中啟動指令碼引擎。
Web 瀏覽器從 HTML 網頁擷取指令碼,並將它傳遞至指令碼引擎。
指令碼引擎建立暫時性動態組件。
指令碼引擎使用反映發出 API,發出程式碼到動態組件中。
在 ASP.NET 網頁中執行指令碼
在這個案例中,瀏覽器開啟含有指令碼程式的 ASP.NET 網頁。 程式在伺服器上編譯並執行。 步驟如下:
ASP.NET 啟動它的應用程式定義域,並啟動指令碼引擎來編譯和執行程式。
指令碼引擎建立永久性動態組件和動態組件中的永久性動態模組。
指令碼引擎使用反映發出 API 來編譯程式,並發出程式碼到永久性動態模組中。
執行編譯的程式碼,接著遇到 eval 運算式。
指令碼引擎在動態組件中建立暫時性 (Transient) 動態模組來包含 eval 運算式的程式碼。
指令碼引擎會執行暫時性動態模組來評估 eval 運算式。
ASP.NET 要求指令碼引擎,將動態組件和永久性動態模組儲存在快取中,好讓再次造訪網頁時,不需重新編譯指令碼。
使用反映發出編譯規則運算式
在這個案例中,編譯器使用反映發出來編譯原始程式碼中的規則運算式。 使用者可以宣告哪些規則運算式應該被編譯。 步驟如下:
編譯器處理使用者原始程式碼中首次的規則運算式使用。
編譯器使用反映發出將規則運算式編譯成自訂掃描器類別,因為使用者已經要求運算式要被編譯。 規則運算式首先會轉譯為編譯器的規則運算式 opcode。 例如,其中一個指令可能會指出 "try to match zero or more a's" (試著比對零或更多的 a)。規則運算式 opcodes 即接著轉譯為 Microsoft Intermediate Language (MSIL)。 例如,編譯器可能產生迴圈 (Loop),重複它所找到的所有字母項目。
編譯器儲存編譯的掃描器類別以備以後之用。
編譯器執行個體化編譯的掃描器類別,並執行目前應用程式定義域中的程式碼。
編譯器處理使用者原始程式碼中相同規則運算式的後續使用。
編譯器擷取為規則運算式的編譯的掃描器類別、將它執行個體化,並在目前應用程式定義域中執行程式碼。
當使用規則運算式的第一個執行個體時,使用者會遭受效能損失,因為編譯器必須將運算式編譯成掃描器類別。 然而,相同規則運算式的後續使用將會有效率地執行。 對於經常使用的規則運算式,一時的編譯 (Compilation) 損失並不大,因為執行時間可以的大幅改善。