【转】如何开始学习CoreCLR源代码?

作者:RednaxelaFX
链接:https://www.zhihu.com/question/28554410/answer/41486461
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

先解决些大问题再回到题主的具体问题。

首先,请确定自己是不是真的想深入到VM(CLR)层面的代码。是不是其实有些好奇的地方在.NET Core的库层面就已经够用?是的话请看dotnet/corefx,而不是CoreCLR。

然后,如果是已经对C#有所了解但想进一步了解CLR的话,《CLR via C#》值得一读。通过它先了解CLR都提供了一些怎样的服务,各种服务之间是如何联系起来的,有个大体概念。
另外还有两本书可以伴随《CLR via C#》一起读。一本是《Pro .NET Performance》,另一本是《Writing High-Performance .NET Code》。两本的切入点都是编写高性能.NET代码,都涉及一些关于CLR的知识,可以让读者了解到CLR的某些功能(或者说优化)会如何反映到应用的性能上。

再次,在深入CLR之前,先打好MSIL(Microsoft Intermediate Language,也叫做CIL(Common Intermediate Language))的基础是件值得做的事。熟悉MSIL所提供的功能之后,带着“CLR要如何逐一实现MSIL的功能”的问题去整理知识脉络钻进CoreCLR去看,比没头绪乱看一通要有效的多。
这个可以阅读CLI(Common Language Infrastructure)规范ECMA-335,也可以读一些现成的书,例如《Inside Microsoft .Net Il Assembler》、《Expert .NET 2.0 IL Assembler》等。

接下来,确定想了解CoreCLR源码但没有任何基础的话,请先仔细阅读《Shared Source CLI 2.0 Internals》。这是一本免费发布的书,讲的是Shared Source Common Language Infrastructure 2.0 Release(SSCLI 2.0)的实现,其中很多内容对应到CoreCLR里仍然适用(或大致思路仍然一致);SSCLI 2.0与CLRv2的主要区别是JIT编译器和GC的具体实现不同,runtime涉及PAL的部分也可能不同,而runtime的其它部分几乎一样。通读一遍此书能让初学者至少有个概念,CLR的源码会涉及什么方面的知识,有啥看不懂的可以先有针对性的补充背景知识。
相比《CLR via C#》,这本书更多的涉及到代码,但仍站在比较抽象的角度去描述CLR各部分的功能和联系,适合当作阅读代码的线索。

微软在CLRv2之后还给CLR添加了许多新功能,这些新东西自然在SSCLI 2.0没有反映,在看CoreCLR代码时得另找资料去学习。
例如说security model的差异。SSCLI 2.0反映CLRv2的情况,其security model主要还是“Code Access Security”(CAS),需要在安全检查是做栈遍历(stack walk);CoreCLR实现的是transparency model(Mono里直接把这个叫做CoreCLR security model),不需要做栈遍历。

再接下来,读完SSCLI 2.0书之后,请在钻进CoreCLR源码前先阅读CoreCLR源码中自带的Book of the Runtime(BotR)。这是CoreCLR自带的文档,写得非常好而且专门为CoreCLR更新了内容,与时俱进。微软还在慢慢更新BotR的,逐渐放出更多内容出来,值得持续关注。
说BotR好主要是因为CoreCLR里有很多代码细节不太直观,如果没有文档描述大体概念和思路的话,直接钻进代码里很容易被大量奇怪的细节淹没——除非您对managed runtime已经非常熟悉了。但就像

@代码豆

大大的回答所说,BotR跟实际代码之间还有一定距离,光靠它还不足以深入到CoreCLR的枝末细节;一边调试一边学习是最靠谱的。
CoreCLR的代码有着浓厚的微软色彩——存在大量仅为维持向后兼容性的代码。最初入门阅读代码时要自己知道如何自动忽略掉它们才行。

最后,如果要深入到JIT编译器和GC的话,请另外阅读专门书籍。
SSCLI 2.0里的JIT编译器是一个非常简单的FJIT,基本上就是把MSIL一条条对应到各自的汇编模版生成出来,不涉及多少编译原理;CoreCLR里的JIT编译器是RyuJIT,里面需要用的知识大多是传统编译原理书上会讲到的,可以挑几本自己喜欢的编译原理书读读来打基础。
GC方面的话,《The Garbage Collection Handbook》是学习的不二之选。

还有可以多骚扰

@代码豆

大大让他多写点介绍文,哈哈~~

===========================================================

然后回到题主的问题:

1、CoreCLR是用什么IDE编写的:根本不重要。
CoreCLR的build系统可以在第一次build之后生成出Visual Studio的solution,所以可以很方便的在Visual Studio里开发和调试。这些solution包括C++和C#的project,CLR自身的代码主要用C++实现,而mscorlib(.NET标准库的核心部分)则主要用C#实现。
实际上CLR开发们里emacs党比较多吧。以前看Channel 9的访谈几乎没看到他们有用Visual Studio来开发CLR的。所以说用啥IDE根本不是重点。
<- 更新:CLR组里工作的

@代码豆

大大提醒说现在内部还是用VS的多,用emacs的少。请参考他的回答。2、学习此类开源代码要如何入手比较合适:“此类”就是“托管运行时”(managed runtime)咯?或者叫“虚拟执行环境”(virtual execution environment)或“虚拟机”(virtual machine)。先从我前面说的那些资料入手至少对学习CoreCLR来说是条好路线。
如果是说别的类似的东西,例如JVM,我以前发过一个书单,可以参考:从表到里学习JVM实现

 

作者:代码豆
链接:https://www.zhihu.com/question/28554410/answer/41572753
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

不请自来,不是大牛,只是在CLR混了1年说说体会吧。首先你要明白你到底了解那块,一上来就想把CoreCLR全部搞定,这个说实话不现实。有个大体概念,比如CLR有那几块组成,然后每块的分工是什么,然后挑一个自己觉得有兴趣的点入手。材料

@RednaxelaFX

都说的很详细了,就不多说了。还有个人感觉,对于大多数人来说一上来就想通过看源码直接了解CLR,这个不现实,而且这个是我们组的认同,实话讲CLR的内部资料写的其实不是很好,Book of runtime虽然不错,但也只是告诉你大体的概念,非常具体东西还是没有涉及到。所以很多尝试直接看源码的人开始还行,后来就开始被转晕了。组里大部分人学习的办法还是靠mentor辅导和修bug,然后通过修bug扩大知识面,比如你修了一个简单EH bug,然后你可以尝试看一下CLR是怎么处理EH的怎么做stackwalking的,慢慢就有感觉了。如果是作为external的dev,你在github直接联系我们就行了,coreclr还是有很多bug我们想要修但没时间管的,所以如果你要是想帮忙大家还是很高兴的。对了还是要说一点,我上面说的只是针对普通人,我知道也有人是特殊的存在。比如我知道一个大牛,他之前在windows组有8-9年的经验,来了CLR后从来都不看什么资料或者问别人,对于他来讲有什么不懂得直接看代码就行了。还有一个我不得不说,他和组里其他大牛的区别就是扫地僧和少林历任主持的区别,大多数是都是对自己在组的知识极为精通,同时对CLR其他部分有大体了解,他基本上是对所有的部分都极为精通。。。而且他的办法感觉就是记代码。。。没错就是记代码!那哥们传说强大到你问他CLR的任何问题,他都可以直接告诉你去哪个函数修改,然后还基本都能成。。。如果你是这两种人,大哥请受小弟一拜!
然后回答一下第一个问题,虽然我们IDE用VS,但不是真正意义上的用,只是当text editor和代码阅读,所以有部分人也会用emacs代替。而VS的build和debug功能,因为我们会搭建自己的private runtime用VS debug的话有时候会不管用,所以大家debug普遍喜欢用windbg,而VS的build基本就不用,我们都是用自己内部写的脚本调用msbuild。github的版本是为了方便非CLR的人使用专门修改过的,所以你要是build的话还是以github上方式为主。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 数据分析三剑客之 Matplotlib(四):线性图的绘制

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

Hbase error: KeeperErrorCode = NoNode for /hbase/master错误

Hbase运行hbase shell输入status与list测试会报错error: KeeperErrorCode NoNode for /hbase/master 经过两天的不挺找错&#xff0c;更改&#xff0c;解决&#xff0c;出现这个错误的原因是hadoop与Hbase版本不兼容所致。 别用hadoop3 经过几天的奋战&#xff0c;开始用的…

【转】MFC与.NET的区别

1. MFC是在API的基础上封装出来的一个类库&#xff0c;给C程序员在Windows上快速开发用的。 .Net类库是在Windows非托管API的基础上封装出来的一个托管类库&#xff0c;给程序员在各种Windows平台上跨平台开发用的。 2. 只是两个不同平台的编程&#xff0c;一个是NET平…

Python 数据分析三剑客之 Matplotlib(五):散点图的绘制

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

hadoop集群-格式化namenode节点后,从节点的datanode不能启动,或者是datanode启动到主节点上。

进行二次namenode格式化前&#xff0c;请注意&#xff1a; hadoop namenode -format进行着一步前&#xff0c;要把以前格式化的内容删掉&#xff0c;如果&#xff0c;你的路径是在hadoop文件夹内&#xff0c;那么直接格式化即可&#xff0c;如果是在外部创建的文件夹&#xff…

Magento 2开发教程 - 创建新模块

视频在youtube网站国内访问不了&#xff0c;可以使用翻墙软件查看。 视频地址&#xff1a;www.youtube.com/embed/682p52tFcmYautoplay1 下面是视频文字介绍&#xff1a; Magento 2系统整体结构是建立在模块的基础上。通常&#xff0c;创建定制的第一步是构建模块。 要创建模…

Python 数据分析三剑客之 Matplotlib(六):直方图 / 柱状图 / 条形图的绘制

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

Hive环境搭建(完整版)-配置

Hive部署&#xff1a; 前提&#xff1a; 在安装Hive之前&#xff0c;要求先预装&#xff1a; - 安装JDK 8 - 安装Hadoop-2.7.7 - 安装MySQL 5.6.x&#xff01;&#xff01;&#xff01;我这里主节点叫chun1&#xff0c;根据自己的进行修改 一、安装 1. 下载hive&#xff0c…

Magento微信支付接口开发小记

姗姗来迟的Magento微信支付接口插件 半年之前&#xff0c;有朋友网站需要接入微信支付&#xff0c;是Magento站&#xff0c;于是花费了近二周时间&#xff0c;研究微信开发文档、示例代码&#xff0c;并初步制作了个支付模块&#xff0c;不巧的是&#xff0c;朋友的微信支付接…

猿浪

本文作者&#xff1a;datamonday 原文链接&#xff1a;https://blog.csdn.net/weixin_39653948/article/details/105981392 转载此文已经过作者本人同意&#xff01; 《猿浪》那些口口声声&#xff0c;一代不如一代的人&#xff0c;应该看着你们&#xff1b;像我一样&#xff…

【转】你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问

电脑出现“你不能访问此共享文件夹&#xff0c;因为你组织的安全策略阻止未经身份验证的来宾访问。”的原因是系统错误导致的&#xff0c;具体解决两个方案 一、修改Lanman WorkStation 1、首先打开计算机&#xff0c;再计算机内敲击windowR组合键打开运行界面。 2、然后在界…

VMware安装出错-无法安装服务“VMware Authorization Service”,请确保您有足够的权限安装系统服务;centos7网络服务不可用,主ip地址:网络信息不可用

今天遇到一个bug&#xff0c;VMware突然网络服务不可用了&#xff0c;虚拟机里右上角有网络但是点开不显示网络的连接信息。也不能上网&#xff0c;不能ping通外网&#xff08;百度&#xff09; VMware下显示 主ip地址&#xff1a;网络信息不可用 尝试了重启网络&#xff0c;重…

Python 数据分析三剑客之 Matplotlib(七):饼状图的绘制

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

访问网络共享时出现“拒绝访问”

今天公司副总说要我连接一下前面的打印机&#xff0c;二话不说&#xff0c;屁颠屁颠的就到现场了。虽然是简单的活&#xff0c;但也得去不是。 到老总计算机上 开始--运行 \\192.168.0.45 &#xff08;装有打印的计算机&#xff0c;OS是XP系统&#xff01;&#xff09; 结果出…

zookeeper集群自动启动-关闭-查询的shell脚本

由于zookeeper启动需要在每台虚拟机都进行zkServer.sh start&#xff0c;很不方便&#xff0c;由此写个shell脚本来进行一个命令全部启动。 前提&#xff1a;配置好ssh免密登录&#xff0c;并且每台虚拟机都可以互通&#xff0c;没配置好的可以看下我的hadoop集群搭建里有免密…

Python 数据分析三剑客之 Matplotlib(八):等高线 / 等值线图的绘制

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

【转】Office365完整离线安装包下载及自定义安装教程

Office365部署方法 概要提示&#xff1a; 全文内容归结起来其实也就2条命令 下载&#xff1a;D:\365\setup.exe /download D:\365\Configuration.xml&#xff08;此命令为1条&#xff0c;不可以拆分为2行输入&#xff09; 安装&#xff1a;D:\365\setup.exe /configure D:\3…

Python 数据分析三剑客之 Matplotlib(九):极区图 / 极坐标图 / 雷达图的绘制

CSDN 课程推荐&#xff1a;《Python 数据分析与挖掘》&#xff0c;讲师刘顺祥&#xff0c;浙江工商大学统计学硕士&#xff0c;数据分析师&#xff0c;曾担任唯品会大数据部担任数据分析师一职&#xff0c;负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

Hive启动报错org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeE...

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot create directory /tmp/hive/root/ee19ad01-2190-4759-9a94-6cc09771ecf7. Name node is in safe mode. 因为没有关闭安全模式&#xff0c;把安全模式关…

【转】中国式管理最有趣的地方,可能就在这些关键词之中

曾仕强老先生的中国式管理&#xff0c;就像中医中药&#xff0c;你说他对吗&#xff1f;根本不符合现代的科学逻辑&#xff0c;有些甚至荒诞。然而&#xff0c;即便这样&#xff0c;依然能西医所不能&#xff0c;这就是他的魅力。让我们一探究竟&#xff0c;对也好&#xff0c;…