欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~javascript
做者:易立 | 腾讯IEG高级工程师编程
为何 Unity3D 能够运行 C#,C# 和 Mono 是什么关系,Mono 和 .Net Framework 又是什么关系?咱们深刻的来聊一聊这个话题!框架
一句话介绍编译器:编译器是将用某种程式语言写成的源代码(源语言),转换成另外一种程式语言(目标语言)等价形式的程序。一般咱们是将某种高级语言(如C、C++、C# 、Java)转换成低级语言(汇编语言、机器语言)。机器学习
编译器以流水线的形式进行工做,分为几个阶段:源代码 → 词法分析 → 语法分析 → 语义分析 → 目标代码 → 连接 → 可执行文件。现代编译器还会更复杂,中间会增长更多的处理过程,好比预处理器,中间代码生成,代码优化等。编程语言
虚拟机(VM),简单理解,就是能够执行特定指令的一种程序。为了执行指令,还须要一些配套的设施,如寄存器、栈等。虚拟机能够很复杂,复杂到模拟真正的计算机硬件,也能够很简单,简单到只能作加减乘除。学习
在编译器领域,虚拟机一般执行一种叫中间代码的语言,中间代码由高级语言转换而成,以 Java 为例,Java 编译后产生的并非一个可执行的文件,而是一个 ByteCode (字节码)文件,里面包含了从 Java 源代码转换成等价的字节码形式的代码。Java 虚拟机(JVM)负责执行这个文件。优化
虚拟机执行中间代码的方式分为 2 种:解释执行和 JIT(即时编译)。解释执行即逐条执行每条指令,JIT 则是先将中间代码在开始运行的时候编译成机器码,而后执行机器码。因为执行的是中间代码,因此,在不一样的平台实现不一样的虚拟机,均可以执行一样的中间代码,也就实现了跨平台。ui
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# 也是一样的。推而广之,理论上任何语言均可以跨平台,只要在相应平台实现了编译器或者虚拟机等配套设施。spa
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。
Mono 是跨平台的 .Net Framework 的实现。Mono 作了一件很了不得的事情,将 CLR 在全部支持的平台上从新实现了一遍,将 .Net Framework 提供的基础类库也从新实现了一遍。
以上,Compile Time 的工做实际上能够直接用微软已有的成果,只要将 Runtime 的 CLR 在其余平台实现,这个工做量不只大,并且须要保证兼容,很是浩大的一个工程,Mono 作到了,致敬!
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 代码(经过任意平台编译)。
理论上,你创造了一门语言,而且实现了某一平台下的编译器,而后实现了全部平台下符合语言规范的虚拟机,你的语言就能够运行在任意平台啦。
问答
相关阅读
此文已由做者受权腾讯云+社区发布,更多原文请点击
搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!
海量技术实践经验,尽在云加社区!