動態語言執行平臺概觀

動態語言執行平臺 (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,語言必須產生 表達式樹狀結構,其代表樹狀結構中的語言層級程式代碼、運行時間協助程式例程,以及實作 介面的 IDynamicMetaObjectProvider 選擇性動態物件。 DLR 和 .NET 自動化了許多程式碼分析和程式碼產生任務。 這可讓語言實作者專注於獨特的語言功能。

支援靜態類型語言中的動態功能

現有的 .NET 語言如 C# 和 Visual Basic 可以建立動態物件,並與靜態型別物件一起使用。 例如,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 運算式樹狀結構,以包含控制流程、指派和其他語言模型化節點。 更多資訊請參閱 表達樹 (C#)表達式樹 (Visual Basic)

  • 呼叫網站快取。 動態呼叫位置 是您在程式代碼中對動態物件執行 a + ba.b() 等操作的位置。 DLR 會快取 ab 的特性(通常是這些物件的類型),以及作業的相關信息。 如果先前已執行這類作業,DLR 會從快取擷取所有必要的資訊以進行快速分派。

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

DLR 在通話站點使用綁定器,不僅與 .NET 通訊,也與其他基礎設施及服務(如 COM)通訊。 系結器會封裝語言的語意,並指定如何使用表達式樹狀結構在呼叫網站中執行作業。 這可讓動態和靜態類型語言使用 DLR 來共用程式庫,並存取 DLR 支援的所有技術。

DLR 文件資料

若想了解如何利用 開放原始碼 版本的 DLR 為語言添加動態行為,或如何啟用動態語言與 .NET 的使用,請參閱 GitHub IronLanguages/dlr 倉庫的文件。

另請參閱