2010-11-15 166 views

回答

15

公共語言運行庫(CLR)的核心是一套由.NET提供的服務 - 一個類型系統,JIT,垃圾收集,&℃。這些都可用於所有.NET語言,因此是「通用」部分。

Dynamic Language Runtime (DLR)建立在此之上,並提供動態語言服務:動態類型,動態方法調度,代碼生成,& c。我們的想法是將這些事情統一起來,並在動態語言之間共享它們,以便它們可預測和類似地工作,就像CLR上的事物也跨越所有語言一樣。

通過某種方式,那些.NET上的「正常」語言使用CLR,動態語言應該使用DLR,但也會使用CLR。它們是設計師認爲在跨語言通用時很好的基本功能集。 IronPython和IronRuby在DLR上實現,C#4的dynamic功能也是如此。

13

我只添加一個簡單的圖來證明這一點:

"*** Runtime & Libraries ***" │ "*** Languages ***" 
┌────────────────────────────────────┤ 
│ .NET Libraries      │ 
│ ┌────────────────────────────────┼──────────────────┐ 
│ │ Dynamic Language Runtime (DLR) │ C# 4.0 'dynamic' ├────┐ 
├───┴────────────────────────────────┼──────────────────┘ │ 
│ Common Language Runtime (CLR)  │ C# 1.0, 2.0, 3.0 │ 
└────────────────────────────────────┴───────────────────────┘ 
+6

獲取圖右側是比我想:-) – 2010-11-15 12:43:58

+0

@Joey,斷鏈更難 – James 2017-07-20 23:45:26

3

只是平添幾分清晰度到已經給優秀的答案。

首先CLR,這是一個位於用戶代碼和物理硬件之間的抽象層。有幾個優點:

  1. 硬件獨立性2.通用類型系統3.語言的互操作性

CLR

在.NET DLR是由Jim Hugunin創建,是

的動態語言運行時(DLR)是一個運行時環境,它爲動態語言添加一組服務到公共語言運行庫(CLR)。 DLR使開發在.NET Framework上運行的動態語言更容易,併爲靜態類型語言添加動態功能。
動態語言可以在運行時識別對象的類型,而在C#和Visual Basic等靜態類型語言中(使用Option Explicit On時),必須在設計時指定對象類型。動態語言的例子是Lisp,Smalltalk,JavaScript,PHP,Ruby,Python,ColdFusion,Lua,Cobra和Groovy。

DLR架構
DLR

的DLR增加了一套服務於CLR爲更好地支持動態語言。這些服務包括以下內容: 表達式樹。 DLR使用表達式樹來表示語言語義。爲此,DLR擴展了LINQ表達式樹來包含控制流,賦值和其他語言建模節點。有關更多信息,請參閱表達式樹(C#和Visual Basic)。 呼叫站點緩存。動態調用站點是代碼中的一個地方,您可以在動態對象上執行類似於+ b或a.b()的操作。 DLR緩存a和b的特徵(通常是這些對象的類型)以及有關操作的信息。如果之前已經執行了這樣的操作,則DLR從緩存中檢索所有必要的信息以用於快速分派。 動態對象互操作性。 DLR提供了一組代表動態對象和操作的類和接口,並可供動態庫的語言實現者和作者使用。這些類和接口包括IDynamicMetaObjectProvider,DynamicMetaObject,DynamicObject和ExpandoObject。 DLR在呼叫站點中使用綁定器不僅與.NET Framework進行通信,還與其他基礎架構和服務(包括Silverlight和COM)進行通信。綁定器封裝語言的語義,並指定如何使用表達式樹在調用站點中執行操作。這使得動態和靜態類型的語言能夠使用DLR共享庫並獲得對DLR支持的所有技術的訪問。

實例

dynamic d = "test"; 
Console.WriteLine(d.GetType()); 
// Prints "System.String". 

d = 100; 
Console.WriteLine(d.GetType()); 
// Prints "System.Int32".  

dynamic d = "test"; 

// The following line throws an exception at run time. 
d++;