本篇文章给大家带来的内容是关于c#执行原理深入解析(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
为什么 unity3d 可以运行 c#,c# 和 mono 是什么关系,mono 和 .net framework 又是什么关系?我们深入的来聊一聊这个话题!
从编译原理说起
一句话介绍编译器:编译器是将用某种程式语言写成的源代码(源语言),转换成另一种程式语言(目标语言)等价形式的程序。通常我们是将某种高级语言(如c、c++、c# 、java)转换成低级语言(汇编语言、机器语言)。
编译器以流水线的形式进行工作,分为几个阶段:源代码 → 词法分析 → 语法分析 → 语义分析 → 目标代码 → 链接 → 可执行文件。现代编译器还会更复杂,中间会增加更多的处理过程,比如预处理器,中间代码生成,代码优化等。
虚拟机是什么
虚拟机(vm),简单理解,就是可以执行特定指令的一种程序。为了执行指令,还需要一些配套的设施,如寄存器、栈等。虚拟机可以很复杂,复杂到模拟真正的计算机硬件,也可以很简单,简单到只能做加减乘除。
在编译器领域,虚拟机通常执行一种叫中间代码的语言,中间代码由高级语言转换而成,以 java 为例,java 编译后产生的并不是一个可执行的文件,而是一个 bytecode (字节码)文件,里面包含了从 java 源代码转换成等价的字节码形式的代码。java 虚拟机(jvm)负责执行这个文件。
虚拟机执行中间代码的方式分为 2 种:解释执行和 jit(即时编译)。解释执行即逐条执行每条指令,jit 则是先将中间代码在开始运行的时候编译成机器码,然后执行机器码。由于执行的是中间代码,所以,在不同的平台实现不同的虚拟机,都可以执行同样的中间代码,也就实现了跨平台。
int run(context* ctx, code* c) { for (cmd in c->cmds) { switch (cmd.type) { case add: // todo add break; case sub: // todo subtract break; // ... } } return 0;}
总结一下,虚拟机本身并不跨平台,而是语言是跨平台的,对于开发人员来说,只需要关心开发语言即可,不需要关心虚拟机是怎么实现的,这也是 java 可以跨平台的原因,c# 也是同样的。推而广之,理论上任何语言都可以跨平台,只要在相应平台实现了编译器或者虚拟机等配套设施。
c# 是什么,il 又是什么
c# 是微软推出的一种基于 .net 框架的、面向对象的高级编程语言。微软在 2000 年发布了这种语言,希望借助这种语言来取代java,更多详细的介绍可以参看 c# wiki。
c# 是一个语言,微软给它定制了一份语言规范,提供了从开发、编译、部署、执行的完整的一条龙的服务,每隔一段时间会发布一份最新的规范,添加一些新的语言特性。从语法层面来说,c# 是一个很完善,写起来非常舒服的语言。
c# 和 java 类似,c# 会编译成一个中间语言(cil,common intermediate language,也叫 msil),cil 也是一个高级语言,而运行 cil 的虚拟机叫 clr(common language runtime)。通常我们把 c#、cil、clr,再加上微软提供的一套基础类库称为 .net framework。
c# 天生就是为征服宇宙设计的,不过非常遗憾,由于微软的封闭,这个目标并没有实现。当然 c# 现在还过得很好,因为游戏而焕发了新的活力,因为 unity3d,因为 mono。
.net framework vs mono
mono 是跨平台的 .net framework 的实现。mono 做了一件很了不起的事情,将 clr 在所有支持的平台上重新实现了一遍,将 .net framework 提供的基础类库也重新实现了一遍。
以上,compile time 的工作实际上可以直接用微软已有的成果,只要将 runtime 的 clr 在其他平台实现,这个工作量不仅大,而且需要保证兼容,非常浩大的一个工程,mono 做到了,致敬!
unity3d 中的 c
unity3d 内嵌了一个 mono 虚拟机,从上文可以知道,当实现了某个平台的虚拟机,那语言就可以在该平台运行,所以,严格的讲,unity3d 是通过 mono 虚拟机,运行 c# 通过编译器编译后生成的 il 代码。
unity3d 默认使用 c# 作为开发语言,除此之外,还支持 js 和 boo,因为 unity3d 开发了相应的编译器,将 js 和 boo 编译成了 il。
小结
c# 在 windows 下,是通过微软的 c# 编译器,生成了 il 代码,运行在 clr 中。
c# 在除 windows 外的平台下,是通过 mono 的编译器,生成了 il 代码,运行在 mono 虚拟机中,也可以直接运行将已经编译好的 il 代码(通过任意平台编译)。
理论上,你创造了一门语言,并且实现了某一平台下的编译器,然后实现了所有平台下符合语言规范的虚拟机,你的语言就可以运行在任意平台啦。
以上就是c#执行原理深入解析(图文)的详细内容。
