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 编译器的更多相关文章

  1. C++主流编译器整理(编译器版本--供应商--C++11支持情况)

    C++标准   年份 C++标准                俗称   备注 2011 ISO/IEC 14882:2011     C++11  第三个C++标准 2007 ISO/IEC TR ...

  2. Effective C++ 条款二 用编译器替换预编译器

    /************************************************************************/ /* C++条款二:用编译器替换预编译器 */ / ...

  3. GCC、g++编译器和gcc编译器的区别

    GCC:(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分. gcc:GNU的C语 ...

  4. fatal error C1047: 对象或库文件“.\x64\Release\Des.obj”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库

    问题描述: 在把一个32位的dll编译成64位的时候提示上面的错误 解决办法: >属性->常规->项目默认值->全程序优化  将这里的默认项 "使用链接时间代码生成& ...

  5. IIS网站打不开错误解决方案集锦(一):编译器错误消息: 编译器失败,错误代码为 -1073741502。

    [2015-05-12解决记录] 问题:服务器上的文件一直都是好的,但是运行了很长一段时间以后,发现网站打不开,或者上传不了图片了,怎么办? 错误信息:c:\windows\system32\inet ...

  6. cmake之指定clang(++)编译器为默认编译器

    1.说明 本文演示环境的cmake版本3.18 clang是自己源码安装的,非获取已经编译好的binary 2.代码 2.1 添加下面的代码到CMakeLists.txt中,且放到 project语句 ...

  7. [.NET大牛之路 006] 了解 Roslyn 编译器

    .NET大牛之路 • 王亮@精致码农 • 2021.07.09 维基百科对编译器的解释是:编译器是一种程序,它将某种编程语言编写的源代码(原始语言)转换成另一种编程语言(目标语言).编译是从源代码(通 ...

  8. 微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn【转】

    基金会初始董事包括 Mono 项目和 Xamarin 的老大 Miguel de Icaza,微软 .NET 团队代表和微软开放技术公司(这是微软专门为开源和开放技术.标准化成立的独立公司)代表. 首 ...

  9. 谈谈JIT编译器和本机影像生成器(NGen.exe)

    前言 在看<CLR>的时候,作者在开篇的时候提到了NGen.exe,前面一节执行程序集的代码中提到:程序或方法执行前会执行MSCorEE.dll中的JIT函数把要执行方法的IL转换成本地的 ...

随机推荐

  1. IDEAL葵花宝典:java代码开发规范插件 p3c

    前言: P3C插件 是阿里巴巴p3c项目组进行研发.这个项目组是阿里巴巴开发爱好者自发组织形成的虚拟项目组,根据<阿里巴巴Java开发规范>转化而成的自动化插件,并且实现了部分自动编程. ...

  2. ffmpeg拼接mp4视频

    首先需要把mp4格式的文件转成ts格式.拼接好之后,再将ts封装格式转换回mp4. ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4to ...

  3. 通过在classpath自动扫描方式把组件纳入spring容器中管理。

    前面的例子我们都是使用xml的bean定义来配置组件,如果组件过多很臃肿.spring2.5引入了组件自动扫描机制,在指定目录下查找标注了@Component.@Service.@Controller ...

  4. linux C++ scandir 的使用

    () 头文件 #include <dirent.h> () 函数定义 int scandir(const char *dir,struct dirent **namelist,int (* ...

  5. 白痴qwerta的胡言乱语(一句话日度感想?

    10.2 >我tm吹爆这个Latex插件!!!太漂亮了吧?!!! 10.3 >什么鬼气考试 还有这考试的大家也肽水了吧 >再吹一次这个Latex插件!!! 10.6 >今天在琢 ...

  6. POJ2349(求生成树中符合题意的边)

    Arctic Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14977   Accepted: 4777 D ...

  7. java基础知识 学习 关于URL中传递的参数含有特殊字符

    有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码                                   ...

  8. session和cookie(2)

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  9. [codeforces274b]Zero Tree(树形dp)

    题意:给出一棵树,每个点有权值,每次操作可以对一个联通子集中的点全部加1,或者全部减1,且每次操作必须包含点1,问最少通过多少次操作可以让整棵树每个点的权值变为0. 解题关键:自底向上dp,记录up, ...

  10. phpcms后台栏目权限修改无效的原因和解决方法

    现象:在phpcms后台中,新建角色,然后修改角色对应栏目权限,结果一直只能选择一半数量的栏目.剩下的栏目怎么修改都不生效. 对比: step1:再另一个phpcms后台做同样操作,依旧是这个结果.跟 ...