Lar*_*ipp 10 .net compiler-as-a-service roslyn
在Anders Hejlsberg的.NET 4.0演示文稿中,他在.NET 5.0("或未来版本")中讨论过,他们正在研究"编译器即服务"模型.
Anders Hejlsberg的状态:[source] [1]"我们想要打开我们的编译器,使它成为一个API,你可以调用它来编译一段代码并获取表达式树和/或IL.这可以实现一系列场景,例如应用程序可编程性,交互式提示,用户编写的重构,以及嵌入C#的小岛的特定领域语言."
我正在努力寻找一个真正有用的实际例子.我错过了这里的主要概念吗?或者这真的会对语言有益吗?
[1]:http://www.simple-talk.com/opinion/geek-of-the-week/anders-hejlsberg-geek-of-the-week/编译器即服务
一个现实世界的例子是游戏的用户可扩展性。大多数现代游戏允许通过脚本语言进行某种类型的用户扩展,脚本语言可能相对较慢,或者通过需要开发平台(以及使用它的知识)的编译 DLL。这将允许用户使用 C# 编写游戏扩展,这些扩展将由游戏在运行时编译,而不需要用户自己编译。它还允许通过在游戏控制台窗口中输入 C# 代码等方式来测试新想法,而无需为每个小更改重新启动游戏。目前,这种类型的事情只有使用嵌入式解释脚本语言才能真正实现。
对于某些问题,编写一个可以生成解决实际问题的程序的程序会更容易。这特别有用的一个领域是为编译器构建解析器。
在其他情况下,您可以动态生成代码,这些代码可以进行定制,以便在处理特定数据类型时提供最佳性能,您刚刚通过反映其元数据在运行时了解了其属性。我可以举的一个例子是我的Modelshredder项目。它的基本作用是获取对象的所有字段和属性,并将它们的值打包到对象数组中。
我解决该问题的第一个方法是使用Reflection.Emit. 第二种方法更加动态,并且依赖于表达式树,它可以在运行时有效地构建和编译,以提供与我手工编码的 MSIL 注入相同的功能。您可以在 MoreLinq 主干中看到这一点(只需查看 Modelshredder 站点,有一个链接)。拥有编译器即服务实际上可以让我提高抽象级别并发出 C# 代码,然后将其编译为 MSIL。
领域特定语言的案例已经提出,而且我认为像 C# 这样的命令式语言不太适合“命令行”场景,而不适合更大的脚本。有一个基于 F# DSL 的简洁 make 系统,称为FAKE,它借用了编译器即服务的许多概念。VisualStudio 中的 F# 交互窗口(是这样称呼的吗?)也采用了类似的概念。
| 归档时间: |
|
| 查看次数: |
1668 次 |
| 最近记录: |