当前位置: 首页 > 工具软件 > CoreCLR > 使用案例 >

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

广绪
2023-12-01

作者: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上方式为主。

 

 

 类似资料: