10

在 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/编译器即服务

4

4 回答 4

4

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

于 2010-06-04T14:54:19.400 回答
4

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

在其他情况下,您可以动态生成代码,这些代码可以定制以在处理特定数据类型时提供最佳性能,您刚刚在运行时通过反映其元数据来了解其属性。我可以给你的一个例子是我的Modelshredder项目。它的基本作用是获取对象的所有字段和属性,并将它们的值打包到对象数组中。

我解决该问题的第一种方法是使用Reflection.Emit. 第二种方法更动态一些,它依赖于表达式树,它可以在运行时有效地构建和编译,以提供与我手动编码的 MSIL 注入相同的功能。您可以在 MoreLinq 主干中看到这一点(只需查看 Modelshredder 站点,有一个链接)。将编译器作为服务实际上可以让我提高抽象级别并发出 C# 代码,然后将其编译为 MSIL。

领域特定语言的案例已经提出,而且我认为像 C# 这样的命令式语言不太适合“命令行”场景,而不适合更大的脚本。有一个基于 F# DSL 的简洁的 make 系统,称为FAKE,它借鉴了 Compiler as a Service 的许多概念。VisualStudio 中的 F# 交互式窗口(是这样称呼的吗?)采用了类似的概念。

于 2010-07-12T22:15:06.447 回答
2

我认为还有一个例子是复制保护。您的机器上可能有一段独特的代码,它是在安装时生成的,用于将程序与 CPU ID 联系起来。

假设我在税收计算中使用您的序列号作为参数。该程序的副本很容易做到,而且完全没用。

于 2010-06-04T14:58:10.030 回答
0

此外,它还使编写与 Linqpad 具有相似功能的程序变得非常容易。

另一个用例是使用存储在数据库中的源代码块并根据配置调用特定数据,类似于现在可以调用 Workflow Foundation 的方式。这可能有助于 CRM、ERP 和其他数据仓库应用程序的工作流自动化(尽管如果被滥用,这将构成史诗般的反模式)。

于 2011-10-05T09:10:23.280 回答