116

昨天在 InfoWorld 上发布的有关新Microsoft Roslyn新闻稿

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

自从 .NET 4 发布以来,我已经能够做到这一点CSharpCodeProvider.CompileAssemblyFromSource,实际上我在不久前编写的一个 ASP.Net 项目中使用了它——它允许用户在文本框中输入代码,选择程序集/命名空间引用,然后即时执行并显示该代码的输出,以便在 Windows Azure 上进行实时环境代码测试。

CodeDom罗斯林的一部分/前身吗?Roslyn over 有什么特别的好处CodeDom

4

5 回答 5

251

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

CodeDom 是 Roslyn 的前身,但关系不大。从本质上讲,CodeDom 是一种简单且(在某种程度上)与语言无关的方式来生成在 .NET 1.0 中添加的代码以支持设计人员(类似于 WinForms)。因为 CodeDom 试图提供一个可以用 C#、VB 和其他语言生成代码的统一模型,所以它对它支持的任何语言都缺乏高保真度(这就是你不能用 CodeDom 创建 switch 语句的原因)。CSharpCodeProvider.CompileAssemblyFromSource 只是执行 csc.exe 的包装器。

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

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

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

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

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

确实,Roslyn 对 CodeDom 的好处不止一个。CodeDom 满足了非常具体的代码生成需求,而 Roslyn 正在通过提供一个框架来解决整个语言工具空间,使您可以构建几乎任何类型的 C# 或 VB 语言工具。

于 2011-10-21T20:06:08.270 回答
44

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

Roslyn 允许您动态地检查和构建代码。这包括能够查看/检查一段源代码中的注释、有关完整结构的详细信息等。您可以浏览并获取您传递给 Roslyn 的源代码的整个语法树,并进行详细分析或对其进行改造。

鉴于完整、丰富的语法信息,您将拥有大量额外的控制力和灵活性。例如,这就是复制一段 C# 代码并将其粘贴为 VB.NET 代码的示例的工作方式。使用 Roslyn,您可以做的不仅仅是编译 - 您还可以干净地操作代码本身。这应该使许多工具的生成变得更加简单,因为重构之类的事情可以非常简单地完成,因为工具了解完整的语法,包括元信息(如注释),并且可以直接使用它。

于 2011-10-21T17:21:51.743 回答
12

我看到了一个很大的不同:使用 CodeDom,每次编译一些 C# 或 VB.NET 时,它都会发生在进程之外。CSC.exe 或 VBC.exe 是幕后真正的工作人员。

如果你想构建一个服务,从架构、可扩展性、隔离等方面来说(你提到 Azure),这不是很好。

Roslyn 正在进行中。

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

此外,CodeDom 是一个相对较差的 API,缺少很多功能,而且不是最新的,因为它主要是为支持 Visual Studio UI 设计人员自动生成代码而设计的。我认为 Roslyn 会做得更好,因为它是由编写编译器的人编写的。我希望这会有所作为。

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

于 2011-10-21T17:44:11.383 回答
8

Roslyn 允许对整个过程进行更精细的控制 - 例如,您可以分析字符串,甚至生成附加代码(基于分析在编译过程中即时生成)等。

CodeDom 是“仅使用编译器”,而 Roslyn 是“编译器即服务,可以完全访问(子)部分”......使用 Roslyn,您“在编译器内部”,可以从编译器的角度查看代码的样子允许您以目前不可能的方式改变事物。

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

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

更新

Microsoft 刚刚提供了一个新的 CTP,它具有附加功能和大量 API 更改/添加。有关详细信息,请参见此处

于 2011-10-21T17:23:35.377 回答
1

截至 2022 年 1 月 10 日,Roslyn 的使用存在相当严重的内存泄漏,导致此处报告几乎无法使用https://github.com/dotnet/roslyn/issues/41722以及一个单独但可能相关的留下文件句柄的问题打开此处报告https://github.com/dotnet/roslyn/issues/42134。这两个问题都公开了将近两年。

因此,目前 CodeDom 与 Roslyn 之间的一个非常大的区别是,Roslyn 存在这些问题,使其无法在多次调用编译代码的生产环境中使用。CodeDom 不会遇到这些问题。

我只是觉得对于登陆此页面并正在考虑重写现有代码的任何人来说,这是需要了解的重要信息。

于 2022-01-10T13:52:56.607 回答