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转换成本地的 ...
随机推荐
- laravel基础课程---6、请求(如何获取当前 HTTP 请求的实例)
laravel基础课程---6.请求(如何获取当前 HTTP 请求的实例) 一.总结 一句话总结: 依赖注入:通过依赖注入的方式来获取当前 HTTP 请求的实例:public function sto ...
- URL过滤
URL过滤 就是网址过滤.把不安全的.少儿不宜的.政治的东西过滤掉,访问这些网址就会提示受限,不能访问. 一.url过滤简介 针对企业对员工上网行为的控制管理,可以采用URL过滤技术.如企业不允许研发 ...
- ffmpeg拼接mp4视频
首先需要把mp4格式的文件转成ts格式.拼接好之后,再将ts封装格式转换回mp4. ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4to ...
- python基础-私有变量和方法
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问 __priva ...
- Ajax处理后台返回的Json数据
// 处理后台传来的Json字符串装换成Json对象 var dataJson = JSON.parse(data); // 此时可以从Json对象中取值 if(dataJson.result == ...
- 2015推荐的Android框架
一.Guava Google的基于java1.6的类库集合的扩展项目,包括collections, caching, primitives support, concurrency libraries ...
- 解决系统存在大量TIME_WAIT状态的连接
系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决, vi /etc/sysctl.conf 编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ipv4 ...
- 1066 Bash 游戏
传送门 1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到最后1 ...
- 京东ie6中轮播模块小图出现在大图上
请大家给个评论,给个支持!呵呵 本人最新一套模版小清新童装母婴日韩风全屏轮播(上线风暴),在审核时审核失败,报的是“ie6中全屏海报轮播是小图出现在大图中间的兼容性错误” 而本人本机出现的是小图基本上 ...
- 浏览器关闭或刷新事件--window.onbeforeunload
window.onunload=function(){ //不可以阻止浏览器的刷新或者关闭 return false; } window.onbeforeunload=function(){ //可以 ...