動態語言執行平臺概觀
動態語言執行平臺 (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 存放庫檔。