.NET CoreCLR、CoreRT、Roslyn和LLILC有什么区别?

39

最近我开始阅读有关.NET重组细节的内容(主要通过.NET Core Github页面)。 看起来他们创建了姊妹项目来支持更多平台。在阅读过程中,我有这样的印象:CoreCLRCoreRT是专有Roslyn编译器的新开源版本。CoreRT提供本地(AOT)编译。而LLILC则是针对LLVM框架的另一种实现。

是否有人可以确定并描述这些项目与用户角度上的差异和目标?将来为什么有人会使用Roslyn而不是CoreCLR呢?


6
据我所知,Roslyn 是完全开源的,没有任何专有内容。 - Jeroen Vannevel
6
CoreRT 是一个运行时。Roslyn 是 C# 和 VB 编译器,将源代码编译成 IL。它们是完全不同的东西。 - Jon Skeet
3
@JonSkeet - 你应该将你的评论发表为回答。 - Robert Zaremba
1
我不这么认为。这将是一个非常简短的答案,没有太多细节......老实说,一个简单的搜索就会发现更多。 - Jon Skeet
我的评论在这里:https://dev59.com/e2Ah5IYBdhLWcg3wDfuy#22868113 - nawfal
@ Jeroen Vannevel 开源和专有产品之间没有关系。Roslyn既是开源的,也是专有的。这是开源软件最大的谬论之一。 - Gavin Williams
1个回答

65
Roslyn是一个编译器平台,可让您构建静态和动态分析工具以及C#和VB编程语言的自定义语言扩展和转换。它还使您能够将这些语言嵌入其他语言或应用程序中。Roslyn包括C#和VB编译器和其他工具。这些编译器发出公共中间语言(CIL)代码。
要运行此代码,必须将CIL编译为目标计算机体系结构可以执行的二进制代码。.NET目前提供三种方法来实现这一点:
  1. 在应用程序运行时使用JIT编译器将CIL代码编译成二进制代码。这种模型是由CoreCLR实现的。CoreCLR最初是CLR的副本,经过修改以支持不同的操作系统。它们分别并行维护。
  2. 将CIL代码编译成二进制代码,并集成任何所需的.NET框架组件,以生成单文件自包含可执行文件,其性能更接近于使用本地语言编写的代码。这项技术称为.NET Native。CoreRT是该技术的开源实现。.NET Native和CoreRT之间的主要区别在于前者使用的AOT编译器是UTC编译器(MSVC编译器后端),而后者目前使用RyuJIT。UTC在优化代码方面比RyuJIT更加激进。此外,在CoreRT中,一些运行时组件已在C#中进行了清晰的重新实现,而CoreCLR仍然使用C++实现。
  3. 类似于.NET Native的NGEN,但所产生的可执行文件不是自包含的,需要外部安装的运行时。
LLILC是基于可移植LLVM编译器框架的CIL编译器。它可以用于构建JIT(当前)和AOT(未来)编译器。这个编译器的优点在于它利用了Clang C++编译器的优化,并将LLVM可扩展性模型(分析和优化传递)带到了.NET中。
CoreRT和LLILC是新项目,仍处于早期开发阶段,需要更多的工作来支持生产应用程序。因此,如果您是用户而不是贡献者,那么CoreCLR和Roslyn就适合您。再次说明,CoreCLR是运行时,而Roslyn是C#和VB编译器。

有人知道LLILC是否仍在积极开发中,或者是否有替代品吗?他们的GitHub页面显示已经有两年没有更新了。 - Anthony Gatlin
3
@AnthonyGatlin,请查看此链接。似乎LLILC既不死也不活。 - Hadi Brais
2
@AnthonyGatlin 你为什么认为他们在推动人们远离 .net core?他们正在大力投入 .net core。.net core 3.0 将于2019年发布,还有许多其他版本的计划,同时也会有 C# 8.0 的更新。 - IEnjoyEatingVegetables
4
@JohnOsborne,八个月前我留下那条评论时持有的观点已经改变了。我每天都在使用.NET Core,并且认为他们正在充分投入资源到该项目中。我的观点是错误的。 - Anthony Gatlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接