動態語言執行平臺 (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 + b或a.b()等操作的位置。 DLR 會快取a和b的特性(通常是這些物件的類型),以及作業的相關信息。 如果先前已執行這類作業,DLR 會從快取擷取所有必要的資訊以進行快速分派。動態物件互作性。 DLR 提供一組類別和介面,這些類別和介面代表動態對象和作業,而且可由動態連結庫的語言實作者和作者使用。 這些類別和介面包括 IDynamicMetaObjectProvider、 DynamicMetaObject、 DynamicObject和 ExpandoObject。
DLR 在通話站點使用綁定器,不僅與 .NET 通訊,也與其他基礎設施及服務(如 COM)通訊。 系結器會封裝語言的語意,並指定如何使用表達式樹狀結構在呼叫網站中執行作業。 這可讓動態和靜態類型語言使用 DLR 來共用程式庫,並存取 DLR 支援的所有技術。
DLR 文件資料
若想了解如何利用 開放原始碼 版本的 DLR 為語言添加動態行為,或如何啟用動態語言與 .NET 的使用,請參閱 GitHub IronLanguages/dlr 倉庫的文件。