我第一次查看了Mono的源代码,本以为会看到一堆C或C++代码,结果发现有26,192个.cs文件和7个.cpp文件。
虽然我并不完全惊讶,但这让我想起了一个一直在我脑海中的问题:
一个项目是如何最终以这种“自身”的方式编写的?
是早期版本的Mono更多地使用C/C++吗?还是有初始努力创建某种机器编码编译器……
这里的“技巧”是什么?
我第一次查看了Mono的源代码,本以为会看到一堆C或C++代码,结果发现有26,192个.cs文件和7个.cpp文件。
虽然我并不完全惊讶,但这让我想起了一个一直在我脑海中的问题:
一个项目是如何最终以这种“自身”的方式编写的?
是早期版本的Mono更多地使用C/C++吗?还是有初始努力创建某种机器编码编译器……
这里的“技巧”是什么?
Mono的编译器是用C#编写的。您可能希望阅读有关编译器引导的内容。
我认为重要的是要记住,Mono既是虚拟机运行时(JIT编译器、垃圾回收器等),也是在此框架上运行的类库集合(System.Linq命名空间、XML解析器等)。
你看到的大多数.cs文件都是类库的一部分。这些基本上是像你自己的C#代码一样运行的C#代码(有一些例外,但基本上对于每个人来说重新发明和重新分发轮子没有意义,因此这些是C#“基础”类库)。这就是为什么如果机器上已经安装了Mono,你可以下载复杂的Mono程序作为如此小的文件大小。
对于Mono,JIT、运行时和垃圾回收器大部分是用C/C++编写的,正如你所期望的那样。如果你遇到低级错误,通常会看到GNU调试工具转储,就像在C中一样,只是有更多有用的信息。Mono框架非常擅长将任何C#代码转换为可以在任何地方运行的CIL代码,并使用最适合确保代码在任何地方运行的工具集(在这种情况下是Linux上的C编译器运行时)。