動態語言執行平臺 (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 會將許多程式代碼分析和程式代碼產生工作自動化。 這可讓語言實作者專注於獨特的語言功能。
支援靜態類型語言中的動態功能
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 運算式樹狀結構,以包含控制流程、指派和其他語言模型化節點。 如需詳細資訊,請參閱表達式樹狀架構 (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 存放庫檔。