在Anders Hejlsberg的.NET 4.0演示文稿中,他在.NET 5.0(“或未来版本”)中讨论过他们正在研究“编译器即服务”模型。
Anders Hejlsberg的州:[来源] [1] “我们希望打开我们的编译器,使它成为一个API,你可以调用它来编译一段代码并获取表达式树和/或IL。这可以实现一系列场景,例如应用程序可编程性,交互式提示,用户 - 写的重构,以及嵌入C#的小岛的领域特定语言。“
我正在努力寻找一个真正有用的实际例子。我错过了这里的主要概念吗?或者这真的会对语言有益吗?
[1]:http://www.simple-talk.com/opinion/geek-of-the-week/anders-hejlsberg-geek-of-the-week/编译器即服务
答案 0 :(得分:4)
一个真实世界的例子,说明这可能对游戏的用户可扩展性有用。大多数现代游戏通过脚本语言允许某种类型的用户可扩展性,这可能相对较慢,或者通过需要开发平台的编译DLL(以及使用它的知识)。这将允许用户使用C#编写游戏扩展,C#将在运行时由游戏编译,而无需用户自己编译。它还允许通过在游戏内控制台窗口中输入C#代码来测试新想法,而无需为每次小改动重新启动游戏。目前,只有使用嵌入式解释脚本语言才能实现这种类型的事情。
答案 1 :(得分:4)
对于某些问题,编写一个可以生成解决实际问题的程序的程序会更容易。这个特别有用的一个领域是为编译器构建解析器。
在其他情况下,您可以动态生成代码,可以在处理特定数据类型时提供最佳性能,通过反映其元数据来了解您刚刚在运行时学习的属性。我可以给你的一个例子是我的Modelshredder项目。它基本上做的是获取对象的所有字段和属性,并将它们的值打包到对象数组中。
我对该问题的第一种方法是使用Reflection.Emit
手动编码MSIL注射。第二种方法更加动态,依赖于表达式树,它可以在运行时有效地构建和编译,以提供与我的手动编码MSIL注入相同的功能。您可以看到在MoreLinq主干中实现的(只需查看Modelshredder站点,就会有一个链接)。将编译器作为服务实际上允许我提高抽象级别并发出C#代码,然后将其编译为MSIL。
领域特定语言的情况已经完成,我认为像C#这样的命令式语言并不适合“命令行”场景,而是适用于更大的脚本。 有一个基于名为FAKE的F#DSL的整洁系统,它借用了许多编译器即服务的概念。在VisualStudio中,F#Interactive Window采用了类似的概念(是这样的吗?)。
答案 2 :(得分:2)
我认为还有一个例子是复制保护。您可以在计算机上拥有一段独特的代码,在安装时生成以将程序绑定到CPU ID。
假设我使用序列号作为税收计算的参数。该程序的副本很容易做,而且完全没用。
答案 3 :(得分:0)
此外,它使编写与Linqpad具有类似功能的程序非常容易。
可以使用另一个用例来使用存储在数据库中的大量源代码,并根据配置调用特定数据,类似于现在可以调用Workflow Foundation的方法。这有助于CRM,ERP和其他数据仓库应用程序的工作流程自动化(尽管如果滥用这将构成一个史诗般的反模式)。