在Anders Hejlsberg的.NET 4.0演示文稿中,他在Net 5.0(“或某些未来版本”)中讨论了他们正在使用“编译器作为服务”模型。

Anders Hejlsberg的状态:[来源] [1]“我们想打开编译器,因此您可以称呼您可以打电话来编译一块代码并恢复表达式树和/或IL。这可以使一系列场景,例如应用程序可编程性,交互式提示,用户编写的重构以及特定于域的特定语言,这些语言几乎没有C#impedd。”

我正在努力寻找一个现实的示例,其中实际上可能很有用。我在这里错过了主要概念吗?还是这真的会受益?

[1]: http://www.simple-talk.com/opinion/geek-op-the-week/anders-hejlsberg-geek-geek-of-theek// 编译器作为服务

有帮助吗?

解决方案

对于某些问题,编写可以生成可以解决实际问题的程序的程序更容易。这特别有用的一个区域是为编译器构建解析器。

在其他情况下,您可以随时生成代码,可以在使用特定数据类型时量身定制以提供最佳性能,以及通过反思其元数据在运行时刚刚学到的属性。我可以给你的一个例子是我的 模型击手 项目。它基本上要做的是将对象的所有字段和属性填充,并将其值包装到对象数组中。

我解决该问题的第一种方法是使用手工编码的MSIL注射 Reflection.Emit. 。第二种方法是动态的,并依赖于表达树,可以在运行时有效地构造和编译,以提供与我的手工编码的MSIL注射相同的功能。您可以看到在Morelinq中继中实现的那样(只需查看ModelShredder网站,就可以使用一个链接)。将编译器作为服务实际上可以使我提高抽象水平并发出C#代码,然后将其编译到MSIL。

已经提出了特定域语言的情况,我也认为,像C#这样的命令性语言不适合“命令行”场景,而是对较大的脚本。有一个基于f#dsl的整洁制造系统 伪造的, ,这借用了许多编译器作为服务的概念。 VisualStudio内部的F#Interactive窗口(是否称为?)采用了类似的概念。

其他提示

一个真实的示例,说明这是对游戏的用户扩展性。大多数现代游戏都可以通过脚本语言或需要开发平台(以及使用它的知识)来通过脚本语言进行某种类型的用户扩展性。这将允许用户使用C#编写游戏扩展,该c#将在运行时由游戏编译,而无需用户自行编译。它还可以通过在游戏内控制台窗口中输入C#代码来测试新想法,而无需为每个小更改重新启动游戏。目前,这种类型的东西只有在嵌入式解释的脚本语言中才真正有可能。

我认为另一个例子是复制保护。您可以在计算机上拥有独特的代码,并在安装上生成以将程序与CPU ID联系起来。

假设我将您的序列号用作税收计算中的参数。该程序的副本易于执行,并且完全没有用。

它还使其具有与LINQPAD相似功能的编写程序真的很容易。

可以为使用存储在数据库中的源代码块并根据配置调用特定数据的另一个用例,类似于现在如何调用工作流基础。这可能有助于CRM,ERP和其他数据仓库应用程序的工作流程自动化(尽管如果滥用,这将构成Epic Antipatern)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top