首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >微软罗斯林vs.

微软罗斯林vs.
EN

Stack Overflow用户
提问于 2011-10-22 01:17:31
回答 5查看 33.4K关注 0票数 115

昨天在InfoWorld上关于新Microsoft Roslyn的一篇press release

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

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

CodeDom是/a预递归到罗斯林的一部分吗?与CodeDom相比,罗斯林有什么特别的好处

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-22 04:06:08

免责声明:我在微软的罗斯林团队工作。

CodeDom是罗斯林的前身,但只是一个微不足道的亲戚。从本质上讲,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
  • 符号表/元数据导入-> Symbol API
  • 绑定器->绑定和流分析API
  • IL发射器-> Emit API

<代码>F211

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

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

真的,与CodeDom相比,Roslyn不仅仅有一个特别的好处。在CodeDom满足了非常特定的代码生成需求的地方,Roslyn正在通过提供一个框架来解决整个语言工具空间,允许您构建几乎任何您能想到的C#或VB语言工具。

票数 249
EN

Stack Overflow用户

发布于 2011-10-22 01:21:52

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

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

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

票数 44
EN

Stack Overflow用户

发布于 2011-10-22 01:44:11

我看到一个很大的区别:在CodeDom中,每次编译一些C#或VB.NET时,它都发生在进程外。CSC.exe或VBC.exe才是幕后真正的工作者。

如果你想构建一个服务,在架构,可伸缩性,隔离性等方面(你提到Azure),这不是很好。

与Roslyn的合作正在进行中。

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

此外,CodeDom是一个相对较差的应用编程接口,缺少许多功能,并且不是真正最新的,因为它主要是为了支持Visual Studio UI设计器自动代码生成而设计的。我认为Roslyn会做得更好,因为它是由编写编译器的人编写的。我希望这会使情况有所不同。

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7852926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档