動態語言執行階段概觀

「動態語言執行階段」(DLR) 是在 Common Language Runtime (CLR) 中新增一組動態語言服務的執行階段環境。 DLR 可讓您更輕鬆地開發動態語言,以在 .NET 上執行,並將動態功能新增至靜態類型語言。

動態語言可以在運行時間識別物件的類型,而在使用 C# 和 Visual Basic 等靜態類型語言中, Option Explicit On您必須在設計時間指定物件類型。 動態語言的範例包括 Lisp、Smalltalk、JavaScript、PHP、Ruby、Python、ColdFusion、Lua、Cobra 和 Groovy。

大部分動態語言為開發人員提供下列優點:

  • 能夠使用快速意見反應迴圈 (REPL,或讀取-評估-列印迴圈)。 這可讓您輸入多個陳述式,並立即執行它們來查看結果。
  • 支援由上而下開發和更傳統的由下而上開發。 例如,當您使用由上而下的方法時,您可以呼叫尚未實作的函式,然後在您需要這些函式時新增基礎實作。
  • 更容易重構和程式代碼修改,因為您不需要變更整個程式代碼中的靜態類型宣告。

動態語言促成了絕佳的指令碼語言。 客戶可以使用具有新命令和功能的動態語言,輕鬆地擴充已建立的應用程式。 動態語言也經常用來建立網站和測試控管、維護伺服器陣列、開發各種公用程式,以及執行數據轉換。

DLR 的目的是要讓動態語言系統在 .NET 上執行,並提供 .NET 互操作性。 DLR 將動態物件新增至 C# 和 Visual Basic,以支援這些語言中的動態行為,並啟用其與動態語言的互通。

DLR 也可協助您建立支援動態作業的程式庫。 比方說,如果您有使用 XML 或 JavaScript 物件標記法 (JSON) 物件的程式庫,您的物件對於使用 DLR 的語言而言,可以作為動態物件。 這可讓程式庫使用者撰寫語法更簡單且更自然的程式碼,來使用物件以及存取物件成員。

比方說,您可能使用下列程式碼,以 C# 遞增 XML 中的計數器。

Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);

藉由使用 DLR,您可以改為使用下列程式碼進行相同的作業。

scriptobj.Count += 1;

如同 CLR,DLR 是 .NET 的一部分。 其可在 GitHub 上的 IronLanguages/dlr 存放庫上下載。

IronPython 是使用 DLR 所開發語言的範例。

主要 DLR 優點

DLR 提供下列優點。

簡化將動態語言移植到 .NET

DLR 可讓語言實作人員避免建立語彙分析器、剖析器、語意分析器、程式碼產生器以及他們以往都會需要自己建立的其他工具。 若要使用 DLR,語言需要產生運算式樹狀架構,它代表樹狀結構中的語言層級程式碼、執行階段 helper 常式,和實作 IDynamicMetaObjectProvider 介面的選擇性動態物件。 DLR 和 .NET 會將許多程式代碼分析和程式代碼產生工作自動化。 這讓語言實作人員能專注於獨特的語言功能。

啟用靜態類型語言的動態功能

C# 和 Visual Basic 等現有 .NET 語言可以建立動態物件,並將它們與靜態類型物件搭配使用。 例如,C# 和 Visual Basic 可以使用 HTML、檔物件模型 (DOM) 和反映的動態物件。

提供 DLR 和 .NET 的未來優點

使用 DLR 實作的語言可以受益於未來的 DLR 和 .NET 改善。 例如,如果 .NET 發行的新版本具有改善的垃圾收集行程或更快的元件載入時間,則使用 DLR 實作的語言會立即獲得相同的優點。 如果 DLR 新增例如更佳編譯的最佳化作業,使用 DLR 實作的所有語言效能也會改善。

啟用連結庫和對象的共用

實作在一種語言中的物件和程式庫可以由其他語言使用。 DLR 也可啟用靜態類型和動態語言之間的交互操作。 例如,C# 可以宣告使用以動態語言所撰寫之程式庫的動態物件。 在此同時,動態語言都可以使用 .NET Framework 的程式庫。

提供快速動態分派和調用

DLR 藉由支援進階的多型快取而提供動態作業的快速執行。 DLR 會建立規則,以便將使用物件的作業繫結到必要的執行階段實作,然後再快取這些規則,以避免在對相同物件類型連續執行相同程式碼期間發生耗盡資源的繫結計算。

DLR 架構

DLR 新增一組服務給 CLR,以便更妥善支援動態語言。 這些服務包括下列各項:

  • 運算式樹狀架構。 DLR 使用運算式樹狀架構來代表語言語意。 基於此目的,DLR 有擴充的 LINQ 運算式樹狀架構,包含控制流程、指派及其他語言模型節點。 如需詳細資訊,請參閱 Expression Trees (C#) (運算式樹狀架構 (C#)) 或 Expression Trees (Visual Basic) (運算式樹狀架構 (Visual Basic))。

  • 呼叫站台快取。 「動態呼叫站台」是程式碼中您用來對動態物件執行像是 a + ba.b() 等作業的地方。 DLR 會快取 ab 的特性 (通常是這些物件的類型) 和作業的相關資訊。 如果先前已執行此類作業,DLR 會從快取擷取所有必要資訊以便快速分派。

  • 動態物件互通性。 DLR 提供一組類別和介面,代表動態物件和作業,而且可以由語言實作者和動態程式庫的作者所使用。 這些類別和介面包括 IDynamicMetaObjectProviderDynamicMetaObjectDynamicObjectExpandoObject

DLR 會使用呼叫站台中的系結器,不僅要與 .NET 通訊,還能與其他基礎結構和服務通訊,例如 COM。 繫結器會封裝語言的語意,並指定如何使用運算式樹狀架構在呼叫站台執行作業。 這樣可讓動態語言和使用 DLR 的靜態類型語言共用程式庫,以及存取 DLR 所支援的所有技術。

DLR 檔

如需如何使用 DLR 開放原始碼 版本將動態行為新增至語言的詳細資訊,或瞭解如何搭配 .NET 使用動態語言,請參閱 GitHub 上的 IronLanguages/dlr 存放庫檔

另請參閱