Roslyn 编译器和RyuJIT 编译器
Roslyn 编译器
https://msdn.microsoft.com/zh-cn/library/mt162308.aspx
https://blogs.msdn.microsoft.com/dotnet/2018/06/19/the-ryujit-transition-is-complete/
http://www.cnblogs.com/supersnowyao/p/9218740.html
Roslyn编译器用于将C#或VB.NET代码编译为程序集(assembly),它的编译过程是一个管道式的处理过程一共包含4个步骤,具体过程见下图。
[img-name(http://qiniu.xdpie.com/67c85d7cd5052d62769327d5ba605df3.png?imageView2/2/w/700)]
compiler pipeline
A. Parser(解析)
根据语法对源代码进行解析。
B. Declaration (声明)
为代码生成元数据(metadata),元数据是一个数据表的集合,描述了在当前代码中定义的数据类型和成员,同时也描述了引用的类型及成员。
C. Bind(绑定)
将生成的IL代码与描述它的元数据绑定在一起,生成托管模块(managed module)。
D. Emit(生成)
将一个或多个托管模块合并生成程序集(assembly)。
RyuJIT 编译器
https://blogs.msdn.microsoft.com/dotnet/tag/ryujit/
https://blog.csdn.net/jxxiaocunguan/article/details/80787167
RyuJIT是作为.NET即时编译器的代号称谓,它是.NET运行时的基本组件之一。与此相反的是,Roslyn作为C#编译器,其编译C#代码成为IL字节码。然后,其再将IL字节码编译成相对于多种处理器的机器码。
随着最近对dotnet/coreclr #18064的合并,将生成组件的遗留代码(来自较老的JIT实现)从RyuJIT的源码中进行了移除。这个版本删除了近5万行代码!现在,四种处理理体系结构(x86、x64、ARM32、ARM64)可完全基于RyuJIT架构。
回顾一下关于RyuJIT短暂的历史,以及我们是如何做到现在这样的,是一件很有趣的事情。
RyuJIT架构的设计开始于9年前,而着手实现开始于7年前。RyuJIT是现有的JIT32编译器(它支持x86和ARM32)的进化版实现,并逐步用一个新的寄存器分配器和代码生成器替换了编译器的大部分“后端”,并入了许多新的和改进的“前端”优化组件。在向新的代码生成体系结构过渡的过程中,我们将旧代码与之结合。这样做提供了好处,但是在测试和维护成本方面,以及开发人员需要处理由大量的分散的遗留代码的困惑,这些都是非常昂贵的。现在,由于RyuJIT在功能上优于遗留代码,所以现在是删除遗留代码,简化JIT代码,以及着眼于未来的时候了。
在近5年前,RyuJIT的x64版本作为社区技术预览版展示给世界。这在当时是不寻常的。我们为人们提供了多年的更新,让人们可以尝试,并在我们发布产品之前给我们反馈。RyuJIT的x64系列是随.NET Framework 4.6发布的,它取代了3年前的JIT64,对于现在而言,它是一个遗留的代码库。
在去年发布的.NET Core 2.0中,x86取代了JIT32。作为公共开发过程的一部分,我们宣布了JIT32的替换,并在.NET Core 2.0的发布声明中分享了完成的工作。
.NET Core 2.0作为包含支持ARM32架构的预览版,使用了遗留后端代码。截至去年12月,对于dotnet/coreclr #15134的合并,.NET Core 2.1版本正式支持了ARM32体系架构。这一变化也包括了三星的许多贡献。
RyuJIT对于ARM64架构的支持,在.NET Core 2.1中近乎为预览版程度,此支持是在RyuJIT架构实现之初就进行构建的。实际上,在过去的4年中,我们一直致力RyuJIT支持ARM64的相关工作,而这项工作最近又被高通的贡献者们所做的重要工作推进了。
总的来说,RyuJIT的投入一直专注于发展代码库,以便更好地支持:
1)多代码生成目标(指令集和操作系统);
2)改进优化;
3)更好和更灵活的代码生成;
4)开放、灵活和健壮的设计与实现;
我们相信新的RyuJIT编译器架构比(现在已删除)传统的代码生成器实现这些目标有很大的改进。
最近,我们在RyuJIT代码生成器中,投入了新的代码生成技术。例如,SIMD支持,特定于硬件内部的体系结构,以及对Linux软件约定的支持。
到达这一点是非常令人满意的,我们已经可以看到,删除所有这些旧的代码将使我们在前进的过程中更加灵活。
感谢所有为这一切长期努力做出贡献的人!
参考链接
【1】https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md
【2】https://github.com/dotnet/corefx
【3】https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/glossary.md
【4】https://www.microsoft.com/net/core#windows
【5】https://msdn.microsoft.com/en-us/library/dn807190(v=vs.110).aspx
【6】https://blogs.msdn.microsoft.com/dotnet/2013/09/30/ryujit-the-next-generation-jit-compiler-for-net/
【7】https://zh.wikipedia.org/wiki/.NET_Core
Roslyn 编译器和RyuJIT 编译器的更多相关文章
- C++主流编译器整理(编译器版本--供应商--C++11支持情况)
C++标准 年份 C++标准 俗称 备注 2011 ISO/IEC 14882:2011 C++11 第三个C++标准 2007 ISO/IEC TR ...
- Effective C++ 条款二 用编译器替换预编译器
/************************************************************************/ /* C++条款二:用编译器替换预编译器 */ / ...
- GCC、g++编译器和gcc编译器的区别
GCC:(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分. gcc:GNU的C语 ...
- fatal error C1047: 对象或库文件“.\x64\Release\Des.obj”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库
问题描述: 在把一个32位的dll编译成64位的时候提示上面的错误 解决办法: >属性->常规->项目默认值->全程序优化 将这里的默认项 "使用链接时间代码生成& ...
- IIS网站打不开错误解决方案集锦(一):编译器错误消息: 编译器失败,错误代码为 -1073741502。
[2015-05-12解决记录] 问题:服务器上的文件一直都是好的,但是运行了很长一段时间以后,发现网站打不开,或者上传不了图片了,怎么办? 错误信息:c:\windows\system32\inet ...
- cmake之指定clang(++)编译器为默认编译器
1.说明 本文演示环境的cmake版本3.18 clang是自己源码安装的,非获取已经编译好的binary 2.代码 2.1 添加下面的代码到CMakeLists.txt中,且放到 project语句 ...
- [.NET大牛之路 006] 了解 Roslyn 编译器
.NET大牛之路 • 王亮@精致码农 • 2021.07.09 维基百科对编译器的解释是:编译器是一种程序,它将某种编程语言编写的源代码(原始语言)转换成另一种编程语言(目标语言).编译是从源代码(通 ...
- 微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn【转】
基金会初始董事包括 Mono 项目和 Xamarin 的老大 Miguel de Icaza,微软 .NET 团队代表和微软开放技术公司(这是微软专门为开源和开放技术.标准化成立的独立公司)代表. 首 ...
- 谈谈JIT编译器和本机影像生成器(NGen.exe)
前言 在看<CLR>的时候,作者在开篇的时候提到了NGen.exe,前面一节执行程序集的代码中提到:程序或方法执行前会执行MSCorEE.dll中的JIT函数把要执行方法的IL转换成本地的 ...
随机推荐
- ACM学习历程——HDU5015 233 Matrix(矩阵快速幂)(2014陕西网赛)
Description In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 2 ...
- 【Lintcode】087.Remove Node in Binary Search Tree
题目: Given a root of Binary Search Tree with unique value for each node. Remove the node with given v ...
- uC/OS-II源码分析(五)
每个任务被赋予不同的优先级等级,从0 级到最低优先级OS_LOWEST_PR1O,包括0 和 OS_LOWEST_PR1O 在内.当μC/OS-Ⅱ初始化的时候,最低优先级OS_LOWEST_PR1O ...
- 图形化升级单机oracle 11.2.0.1 到 11.2.0.4
1. 讲补丁包上传到 oracle server ,解压.安装 [root@11g ~]#unzip p13390677_112040_Linux-x86-64_1of7.zip -d /tmp &a ...
- rt-thread的定时器管理源码分析
1 前言 rt-thread可以采用软件定时器或硬件定时器来实现定时器管理的,所谓软件定时器是指由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务.而硬件 ...
- 创建Maven项目步骤
(转自:http://blog.csdn.net/chuyuqing/article/details/28879477) 使用eclipse插件创建一个web project 首先创建一个Maven的 ...
- gSoap使用入门(2)----自定义接口头文件
摘自:http://blog.csdn.net/zhuzhihai1988/article/details/8131556 接口头文件的格式在向导中没有看到明确的说明性的内容,但通过看开发包中示例程序 ...
- XXX.h:143: error: expected declaration specifiers or ‘...’ before ‘YYY’
出现上面头文件错误,原因是定义YYY的头和XXX.h互相包含了
- 26.OpenIdConnect获取用户信息的两种方式
openId在OAuth基础之上,在下面这红框内拿到Authorization Code之后还可以返回IdToken. IdToken和AccessToken一起返回.IdToken就会包括了用户的信 ...
- Fedora下Msitools使用
msitools学习 msitools使用 wixl-heat使用 概述 打包程序就是把程序依赖的所有库文件和可执行文件以及其他一些资源文件按照源目录结构进行压缩,知道自己的程序依赖哪些库是简单的,但 ...