Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 编译器即服务的好处是什么_.net_Compiler As A Service_Roslyn - Fatal编程技术网

.net 编译器即服务的好处是什么

.net 编译器即服务的好处是什么,.net,compiler-as-a-service,roslyn,.net,Compiler As A Service,Roslyn,在Anders Hejlsberg的.NET 4.0演示中,他在NET 5.0(“或未来的某个版本”)中讨论了他们正在开发“编译器即服务”模型 Anders Hejlsberg的州:[来源][1] “我们希望打开我们的编译器,使它成为一个API,您可以调用它来编译一段代码并返回表达式树和/或IL。这可以实现一系列场景,例如应用程序可编程性、交互式提示、用户编写的重构以及嵌入了C#小岛的领域特定语言。” 我正在努力寻找一个真实世界的例子,在这个例子中,这实际上是有用的。我是否错过了这里的主要概念?

在Anders Hejlsberg的.NET 4.0演示中,他在NET 5.0(“或未来的某个版本”)中讨论了他们正在开发“编译器即服务”模型

Anders Hejlsberg的州:[来源][1] “我们希望打开我们的编译器,使它成为一个API,您可以调用它来编译一段代码并返回表达式树和/或IL。这可以实现一系列场景,例如应用程序可编程性、交互式提示、用户编写的重构以及嵌入了C#小岛的领域特定语言。”

我正在努力寻找一个真实世界的例子,在这个例子中,这实际上是有用的。我是否错过了这里的主要概念?或者这真的会对语言有益吗


[1] :编译器即服务

一个真实世界的示例,说明了这一功能如何对游戏的用户扩展性有用。大多数现代游戏都允许通过脚本语言(速度相对较慢)或通过编译的DLL(需要开发平台(以及使用它的知识))实现某种类型的用户可扩展性。这将允许用户使用C#编写游戏的扩展,C#将由游戏在运行时编译,而无需用户自己编译。它还允许测试新想法,例如,在游戏控制台窗口中输入C#代码,而不必为每一个小变化重新启动游戏。目前,只有使用嵌入式解释脚本语言才能真正做到这一点。

我认为还有一个例子是拷贝保护。您的机器上可能有一段独特的代码,在安装时生成,用于将程序绑定到CPU ID


假设我使用您的序列号作为税务计算中的参数。程序的副本很容易完成,而且完全没有用处。

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

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

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

领域特定语言的情况已经出现,而且我认为像C#这样的命令式语言不适合“命令行”场景,而适合更大的脚本。
有一个基于F#DSL的整洁make系统,名为,它借用了许多编译器即服务的概念。VisualStudio内部的F#Interactive窗口(这样叫吗?)也采用了类似的概念。

它还使编写与Linqpad具有类似功能的程序变得非常容易


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

不仅仅是游戏。许多业务逻辑可以作为原始C#代码嵌入,如果你想,你应该能够在运行时更改它们。递归自修改遗传算法怎么样?我刚才是不是说了些流行语?大概或者我们离天网又近了一步。。。。