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

【转】如何开始学习CoreCLR源代码?相关推荐

  1. java计算机毕业设计蔚蓝在线学习平台源代码+数据库+系统+lw文档

    java计算机毕业设计蔚蓝在线学习平台源代码+数据库+系统+lw文档 java计算机毕业设计蔚蓝在线学习平台源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 ...

  2. java计算机毕业设计网络学习平台源代码+数据库+系统+lw文档

    java计算机毕业设计网络学习平台源代码+数据库+系统+lw文档 java计算机毕业设计网络学习平台源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软 ...

  3. java计算机毕业设计软件工程在线学习平台源代码+数据库+系统+lw文档

    java计算机毕业设计软件工程在线学习平台源代码+数据库+系统+lw文档 java计算机毕业设计软件工程在线学习平台源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  4. 树莓派学习笔记—— 源代码方式安装opencv

    0.前言 本文介绍如何在树莓派中通过编译源代码的方式安装opencv,并通过一个简单的例子说明如何使用opencv. 更多内容请参考--[树莓派学习笔记--索引博文] 1.下载若干依赖项 在开始安装之 ...

  5. List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源代码解析

    学习List接口实现类 ArrayList  Vector  LinkedList List接口的实现类中最经常使用最重要的就是这三个:ArrayList.Vector.LinkedList. JDK ...

  6. 深度学习入门源代码下载使用mnist数据集出现错误EOFError Compressed file ended before the end-of-stream marker was reached

    深度学习入门:基于Python的理论与实现源代码下载使用mnist数据集出现错误[EOFError: Compressed file ended before the end-of-stream ma ...

  7. 在线学习系统源代码_学习系统设计和软件体系结构必看的5门在线免费课程

    程序员书库(ID:CodingBook) 猿妹编译 编译:https://www.java67.com/2019/09/top-5-courses-to-learn-system-design.htm ...

  8. 学习bind源代码,比较bind的方式绑定函数在在内存使用上优于箭头函数

    前言 使用ES的class,到底是使用箭头函数更有效率,还是在构造器函数(constructor)中使用bind函数给函数绑定context更加有效率?在Demystifying Memory Usa ...

  9. 共同学习Java源代码-多线程与并发-FutureTask类(三)

    static final class WaitNode {         volatile Thread thread;         volatile WaitNode next;       ...

最新文章

  1. 今日 Paper | 模态平衡模型;组合语义分析;高表达性SQL查询;多人姿态估计模型等
  2. 浅谈Linux下的EXT3文件系统
  3. CentoS7 and MySql 5.7下载安装
  4. 如何取消 DiscuzX 帖子被系统自动隐?
  5. 微软起诉Google阻止前高管跳槽
  6. LVS-DR模式原理
  7. nssl1186-字串数量【前缀和】
  8. qt下实现文件的拖拽打开
  9. jdbc连接对象的获取 20210409233805735
  10. Computer Systems A Programmer's Perspective(深入理解计算机系统)第一章读书笔记
  11. (2)把BlackBerry作为插件安装到已有的Eclipse中
  12. 多款浏览器修复基于 JavaScript 的地址栏欺骗漏洞
  13. 再也不学AJAX了!(三)跨域获取资源 ② - JSONP CORS
  14. C语言编程之学用rectangle画方形
  15. linux中tar命令怎么用,linux tar命令使用详解
  16. 猴子摘香蕉问题python_猴子搬香蕉问题的C语言解
  17. 【软考】2020下半年软件设计师 易错知识点(1)
  18. 深入解读-微信小程序SDK
  19. mysql cpu 高 原因 汇总_MySQL CPU 使用率高的原因和解决方法(来自aliyun官方文档)
  20. 一级建造师资格审核需要提交哪些材料?

热门文章

  1. element-ui select
  2. 深入浅出etcd系列 – 心跳和选举
  3. Combobox报错:row[opts.textField].toLowerCase is not a function。
  4. shell 提示符个性化设置
  5. 【WPF学习笔记】[转]周银辉之WPF中的动画 晓风影天之wpf动画——new PropertyPath属性链...
  6. 个人应用开发详记. (三)
  7. 你是个有魅力的人吗?人格魅力这样修养而成
  8. HDU-6180 Schedule
  9. 赋值给集合_ArrayList集合源码
  10. python 导入包 作用域_Python 包、模块、函数、变量作用域