昨天在InfoWorld上关于新Microsoft Roslyn的一篇press release
这种“解构”编译器最明显的优点是,它允许从.Net应用程序内部调用整个编译-执行过程。Hejlsberg演示了一个C#程序,该程序将一些代码片段作为字符串传递给C#编译器;编译器将得到的IL汇编代码作为对象返回,然后将其传递给公共语言运行库执行。瞧!有了Roslyn,C#获得了动态语言在运行时生成和调用代码的能力。
自从带有CSharpCodeProvider.CompileAssemblyFromSource
的.NET 4发布以来,我已经能够做到这一点,实际上我在不久前编写的一个ASP.Net项目中使用了它-允许用户在文本框中键入代码,选择要引用的程序集/命名空间,然后在Windows Azure上实时执行和显示该代码的输出,以进行实时环境代码测试。
CodeDom
是/a预递归到罗斯林的一部分吗?与CodeDom
相比,罗斯林有什么特别的好处
发布于 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:
<代码>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语言工具。
发布于 2011-10-22 01:21:52
CodeDom允许您进行编译-但它不能让您真正获得有关代码本身的信息(除了编译器错误)。基本上,这是一个黑盒,你说“编译这个”,它说“我成功了”或“我失败了,这是一些错误”。
Roslyn允许您动态地完全检查和构建代码。这包括能够查看/检查一段源代码中的注释,关于完整结构的详细信息等。您可以浏览并获取传入Roslyn的源代码的整个语法树,并对其进行详细分析或转换。
有了完整的、丰富的语法信息,您就拥有了大量的额外控制和灵活性。例如,这就是复制C#代码块并将其粘贴为VB.NET代码的示例的工作方式。使用Roslyn,您可以做的不仅仅是编译--您还可以干净利落地操作代码本身。这应该会使许多工具的生成变得更加简单,因为像重构这样的事情可以非常简单地完成,因为工具理解完整的语法,包括元信息(如注释),并且可以直接使用它。
发布于 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)。
https://stackoverflow.com/questions/7852926
复制相似问题