为什么有人会花时间在微软“罗斯林”上?


37

我刚刚阅读了Microsoft“ Roslyn”的一些白皮书和示例,这个概念似乎非常有趣。据我所知,它打开了一个黑框,即编译器,并提供了一个接口,我们可以使用该接口来获取有关在Visual Studio中编写的代码的信息和指标。

Roslyn似乎也具有“编写”代码并即时编译/执行代码的能力(类似于CodeDom),但是根据我的经验,我在使用该功能时仅遇到了有限的使用。

虽然代码分析和指标元素是一个有趣的领域,但是它已经存在了很长时间,并且很多提供商已经在代码分析和重构工具(例如ReSharper,CodeRush)上投入了大量资金。 ,nCover等),他们做得很好!

为什么任何公司都会竭尽全力去实施一些可以通过购买现有工具之一的许可证而以很小的成本提供的东西?

也许我错过了Roslyn项目的一些关键功能,这些功能使它超出了所提及工具的范围...


4
Roslyn的重点是更多Microsoft实习生-制作一个易于扩展的托管C#编译器。这样,团队可以更轻松地实施和尝试新的语言功能。此外,实施新的优化算法将变得更加容易。
JustAnotherUserYouMayKnowOrNot 2013年

1
是的Penfold-我怀疑您可能错过了一些事情。您是否在Channel9上观看了达斯汀·坎贝尔的采访? channel9.msdn.com/Events/Ch9Live/…–
James Snell

3
这是开发成功/盈利的Microsoft产品附加组件的风险,他们可能会将其添加到下一个版本中。
JeffO 2013年

10
另外,您可以肯定ReSharper背后的人正在为他们可以插入的其他功能而烦恼。是的,他们已经编写了C#解析器/分析器,但是如果他们可以利用CSharp的分析功能,则每项功能的成本将大大降低。实际的MS C#引擎。
Binary Worrier 2013年

2
查看脚本,了解Roslyn的有趣用法。github.com/scriptcs/scriptcs
Ashley Davis

Answers:


53

Roslyn似乎也具有“编写”代码并即时编译/执行代码的能力(类似于CodeDom),但是根据我的经验,我在使用该功能时仅遇到了有限的使用。

动态编译和执行是Roslyn的主要优势。我认为您可能会低估此功能的优势,因为在您的经验中从未遇到过真正有用的用例。这是有道理的;动态编译的需求可能是一个利基功能,但是拥有它确实提供了一些功能强大的应用程序,如果没有它,将更加困难。

这是我脑中浮现的几个例子,其中动态编译将非常有用。还有其他方法可以完成所有这些任务,但是Roslyn使它们变得更容易。

  • 具有在运行时加载,编译并包含在“父”应用程序执行中的插件文件。
  • 创建一个DSL,然后在运行时将其转换为C#并使用Roslyn进行编译。
  • 创建一个采用C#,对其进行分析,对其进行翻译等的面向程序员的应用程序。
  • 比较两个代码块以了解编译后的差异,而不是仅比较“表面”差异(例如空格)。这称为语义差异

因此,总而言之,可能永远找不到Roslyn的用途,这取决于您花时间在编写什么软件上。但是,在很多用例中,Roslyn带来了很多好处。您提到的工具均未提供此功能。他们也不能基于其架构和目的。


+1为语义差异。有趣的是,这里有一个正在开发的商业产品的链接,该产品使用Roslyn进行语义差异。(完整披露-我与他们没有任何关系,我只是在Jon Skeet的博客上看到了他们提到的产品)
MarkJ 2013年

@RationalGeek-感谢这些示例,我还没有考虑过DSL => C#路由示例...我可以想象出一些在业务应用中非常强大的senario。我看到的许多其他示例(不仅仅是您的示例)与我之前提到的重构工具有很多重叠。我原来的问题的另一部分是,当有人预付了一些优秀的预卷,而成本却只是一小部分时,为什么有人会花钱开发这种分析工具?更好)的工具集!:)
理查德·胡珀

@Penfold总是有新开发人员工具的空间... :-)
RationalGeek

1
语义差异不仅仅用于编译目的。每个版本控制系统都需要一个差异,并且大多数使用愚蠢的差异。只是交换两个功能,看到乱做,当DIFF认为它可以搭配一些(和{
MSalters

这是一个很大的问题:编写ASP.NET应用程序时自动重新编译,而无需重建和重新部署Web应用程序。最终在ASP.NET vNext中宣布,它将从字面上使C#的工作方式与脚本语言相同……只是它既具有类型安全性又具有高性能。我认为这是这种通用方法的开始,最终将进入富客户端应用程序(移动,桌面)中,以便您可以在运行时更改代码。使用Web应用程序要容易得多,因为根据定义,每个请求都是无状态的-但随着时间的推移,它也会进入其他应用程序体系结构。
2014年

12

我确信提供工具的公司(例如JetBrains *)对罗斯林非常感兴趣。微软希望使制作工具变得容易,因为好的工具鼓励使用微软的生态系统。

*根据JetBrains博客(此条目),JetBrians已宣布将不再使用Roslyn。但是,我认为JetBrains的任何新竞争对手(没有可使用的现有代码库)都将使用Roslyn。它为他们提供了一个良好的开端。

罗斯林(Roslyn)的10个问题和10个答案中的第 6 个问题

6:罗斯林有哪些实际用途?作为开发人员对我有什么帮助?

想到的罗斯林最早的用途之一是商业规则引擎。在Roslyn之前,评估用户宏通常涉及实现Visual Basic for Applications(VBA),使用Ruby表达式调出DLR或使用动态生成的Visual Basic或C#代码脱壳到命令行编译器并获得运行结果该代码。这些方法都不理想。

正如Eric Vogel的文章“在C#中使用Roslyn脚本API”所演示的那样,Roslyn可以通过Evaluate()函数轻松地实现C#和(最终)Visual Basic代码的动态编译和执行。用与应用程序相同的语言编写的用户宏将使开发人员更容易支持代表业务规则的用户宏。

使用Roslyn,代码重构变得更加容易。在加入Roslyn之前,DevExpress CodeRush和Refactor Pro和JetBrains ReSharper等工具的开发人员必须重新创建许多编译器操作,作为其产品的基础。使用Roslyn,重构开发人员可以直接利用现有的编译器功能。我可以想像一旦罗斯林广泛可用,NuGet软件包的外观就可以安装单独的重构规则。


4
“用与应用程序相同的语言编写的用户宏将使开发人员更容易支持代表业务规则的用户宏。” -可能出什么问题了!
gbjbaanb

9

我热切期待所有编译器都定期提供“编译器即服务”(CaaS)的日子。我们需要停止考虑编译器仅发出预链接器代码,而开始考虑编译器所生成的树可以转换为多个目标。所有编译器都应具有发出树和可选的JSON / XML的功能。然后可以将输出转换成许多类型的目标,例如美化相同的语言,C,IL源,IL二进制,Java,Javascript,LLVM,PIC可执行文件,甚至预链接器代码。

我以编译器为生。我的客户在CaaS上出售,因为它为实现出色的灵活性,可移植性和分析打开了大门。

我对微软很久以前没有实施CaaS感到非常失望。例如,它可能被用作VB6到其他东西或.Net到C ++的迁移路径。


1

MSFT为什么投资Roslyn的简单答案是,他们现有的C#编译器代码库现在已有5个版本,而现在已有11年了。对于任何代码库来说,保持可管理时间都是很长的时间。另外,由于他们正在重写,因此他们决定投资进行此操作,以便将其所有内部内容公开为API。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.