微软Roslyn与CodeDom

从InfoWorld昨天关于新的微软Roslyn的新闻稿 :

这种“解构”编译器最显着的优点是它允许从.Net应用程序中调用整个编译执行过程。 Hejlsberg演示了一个C#程序,它将几个代码片段作为string传递给C#编译器; 编译器将得到的IL汇编代码作为对象返回,然后传递给公共语言运行库(Common Language Runtime,CLR)执行。 瞧! 借助Roslyn,C#在运行时获得dynamic语言生成和调用代码的能力。

我已经能够做到这一点,因为.NET 4与CSharpCodeProvider.CompileAssemblyFromSource的发布,我实际上使用在一个ASP.Net项目前一段时间写的,正是这样做 – 允许用户键入代码到一个文本框,select程序集/名称空间来引用,然后在Windows Azure上执行并显示来自该代码的输出以进行实时环境代码testing。

CodeDom是Roslyn的CodeDom一部分吗? Roslyn比CodeDom什么特别的好处?

免责声明 :我在Roslyn团队为微软工作。

CodeDom是Roslyn的前身,但只是略有相关。 从本质上讲,CodeDom是一个简单的(有些)langage不可知的方式来生成在.NET 1.0中添加的代码来支持devise者(WinForms)。 因为CodeDom试图提供一个可以用C#,VB和其他语言生成代码的统一模型,所以它不支持任何支持的语言的高保真度(这就是为什么你不能用CodeDom创buildswitch语句的原因)。 CSharpCodeProvider.CompileAssemblyFromSource只是执行csc.exe的一个包装。

罗斯林是一个完全不同的动物。 它是从C#和VB编译器从头开始使用托pipe代码重写 – C#中的C#和VB中的VB(今天发布的csc.exe和vbc.exe的版本是用本地代码编写的)。 在托pipe代码中构build它们的好处是用户可以将实际编译器从.NET应用程序引用为库(不需要包装器)。

在构build编译器pipe道的每个组件时,我们已经公开了公共API:

  • parsing器 – >语法树API
  • 符号表/元数据导入 – >符号API
  • 粘合剂 – >绑定和stream动分析API
  • IL发射器 – >发射API

Roslyn可以用作一个复杂的C#和VB源代码生成器,但这就是CodeDom与之相似的地方。 Roslyn编译器API可用于parsing代码,执行语义分析,dynamic编译和评估代码等。

除了编译器之外,Roslyn团队还在公共编译器API 之上重build了Visual Studio C#和VB IDE特性。 因此,编译器API足够丰富,可以构buildVisual Studiodevise时工具,如IntelliSense和Extract Method重构。 此外,在编译器之上的层,Roslyn提供更高级的分析或数据转换服务。 例如,可以使用C#和VB格式化规则对代码进行格式化,或者在解决scheme中查找对特定符号的所有引用。

真的,与CodeDom相比,Roslyn不仅仅有一个特殊的好处。 在CodeDom中填充了一个非常具体的代码生成需求,Roslyn正在通过提供一个框架来解决整个语言工具空间,使您可以构build任何您可以想到的C#或VB语言工具。

CodeDom允许你编译 – 但它不能让你真正获得代码本身的信息(除了编译错误)。 基本上,这是一个黑匣子,你说“编译这个”,它说“我成功”或“我失败了,这里有一些错误”。

Roslyn允许你完整地检查和编译代码。 这包括能够查看/检查源代码片段中的注释,关于完整结构的详细信息等等。您可以通过并获取您传入Roslyn的源代码的完整语法树,并进行详细的分析或对其进行转换。

给定完整丰富的语法信息,您将拥有巨大的额外控制权和灵活性。 例如,这是如何将样本复制到C#代码块并将其粘贴为VB.NET代码的方式。 有了Roslyn,你可以做的不仅仅是编译 – 你也可以干净地操纵代码本身。 这应该使得很多工具的生成变得简单得多,因为像工具理解完整的语法,包括元信息(如注释),可以非常简单地完成重构等工作,而且可以直接使用它。

我看到一个很大的区别:用CodeDom,每次编译一些C#或VB.NET时,都会发生处理过程。 CSC.exe或VBC.exe是幕后真正的工作者。

如果你想build立一个服务,在体系结构,可伸缩性,隔离等方面(你提到的Azure),这不是很好。

罗斯林正在进行中。

我想这是他们称之为“编译器即服务”的原因之一。

此外,CodeDom是一个相对较差的API,错过了很多function,并不是最新的,因为它主要是为了支持Visual Studio UIdevise者自动生成代码而devise的。 我认为Roslyn会写得更好,因为写这些编译器的人写的是。 我希望这会有所作为。

PS:从CSC.exe和VBC.exe的一个显着的区别:Roslyn似乎是纯粹的.NET(并使用CCI )。

Roslyn允许对整个过程进行更为精细的控制 – 例如,您可以分析string,甚至生成额外的代码(在编译过程中基于分析),等等。

CodeDom是“只使用编译器”,而Roslyn是“编译器作为一个服务,完全访问(子)的部分”…你是“编译器内”的Roslyn,并可以从编译器的angular度看到代码的样子让你以目前不可能的方式改变事物。

例如,你可以使用Roslyn来扩展C# – 这非常方便,比AOP实现的当前状态好得多。

有关当前Roslyn状态及其提供的访问和控制级别的概述,请参阅http://msdn.microsoft.com/zh-cn/hh500769

UPDATE

微软只是提供了一个新的CTP提供额外的function和大量的API更改/添加。 详情请看这里 。