.net – Microsoft Roslyn vs. CodeDom

从昨天press release的信息世界关于新的Microsoft Roslyn

The most obvious advantage of this kind of “deconstructed” compiler is
that it allows the entire compile-execute process to be invoked from
within .Net applications. Hejlsberg demonstrated a C# program that
passed a few code snippets to the C# compiler as strings; the compiler
returned the resulting IL assembly code as an object, which was then
passed to the Common Language Runtime (CLR) for execution. Voilà! With
Roslyn, C# gains a dynamic language’s ability to generate and invoke
code at runtime.

我已经能够做到这一点,因为.NET 4与CSharpCodeProvider.CompileAssemblyFromSource的发布,我实际上使用在一个ASP.Net项目之前编写的,正是这样 – 允许用户在文本框中键入代码,选择组件/命名空间进行引用,然后在Windows Azure上实时运行和显示来自该代码的输出以进行实时环境代码测试。

CodeDom是Roslyn的前身吗? Roslyn对CodeDom的特别好处是什么?

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

CodeDom是Roslyn的前身,但是只有微小的相关性。基本上,CodeDom是一种简单的(有点)不熟悉的方式来生成在.NET 1.0中添加的代码以支持设计者(一个WinForms)。因为CodeDom试图提供一个统一的模型,可以生成代码在C#,VB和其他语言,它缺乏高保真的任何语言,它支持(这就是为什么你不能创建一个switch语句与CodeDom)。 CSharpCodeProvider.CompileAssemblyFromSource只是一个包装执行csc.exe。

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

在构建编译器管道的每个组件时,我们在顶部公开了公共API:

> Parser – >语法树API
>符号表/元数据导入 – >符号API
> Binder – >绑定和流分析API
> IL发射器 – > Emit API

Roslyn可以用作一个复杂的C#和VB源代码生成器,但这是与CodeDom的相似性结束。 Roslyn编译器API可用于解析代码,执行语义分析,动态编译和评估代码等。

除了编译器,Roslyn团队还在公共编译器API之上重建Visual Studio C#和VB IDE功能。因此,编译器API足以构建Visual Studio设计时工具,如IntelliSense和提取方法重构。此外,在编译器以上的层,Roslyn提供更高级别的分析或数据转换服务。例如,有一些服务用于使用C#和VB格式化规则来格式化代码,或者找到对解决方案中的特定符号的所有引用。

真的,罗斯林对CodeDom不仅有一个特殊的好处。在CodeDom填充了一个非常具体的代码生成需求的地方,Roslyn通过提供一个框架来处理整个语言工具空间,允许你构建任何类型的C#或VB语言工具。

http://stackoverflow.com/questions/7852926/microsoft-roslyn-vs-codedom

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:.net – Microsoft Roslyn vs. CodeDom