Unity C# 和 Mono
众所周知,一般Unity游戏开发,都使用C#作为主要开发语言。虽然Unity本身支持Unity(一种Java的扩展)和Boo(一种受Python启发的语言),但是在正常生产实践中,还是会使用C#作为主要开发语言。
什么是C#?
C# 是微软推出的一种基于 .NET 框架的、面向对象的高级编程语言。微软在 2000 年发布了这种语言,希望借助这种语言来取代Java,更多详细的介绍可以参看 C# Wiki。
为什么是C#?
因为C#的跨平台特性可以解决Unity引擎的跨平台支持问题。
其实确切的说,跨平台的并不是C#这个语言,而是C# 编译后生成的中间语言(CIL,Common Intermediate Language,以前也叫 MSIL)。
而且,确切的说,CIL也不仅仅只有C#可以生成,微软的全系列动态语言都可以生成CIL( C# 、 F# 、 VB.NET ,VB),在维基百科上你还可以查到( C++ 、 Python ),上文提到的Unity和Boo两种语言最终也会编译成CIL。
如果一种语言实现生成了CLI,它也可以通过使用CLR被调用,这样它就可以与任何其他.NET语言生成的资料相交互。CLR也被设计为 操作系统 无关性。
是的,按照标准,你还可以从C++生成CIL,当然,这有点多此一举。
.Net 和 CLI?
好像在以前C#都是跟.Net联系在一起的?
.Net全称是.NET Framework,包含了一整套开发工具和套件,听过没听过的,(CIL,CLR, Windows Forms 、 ADO.NET 及 ASP.NE T等一堆东西 )
.NET的初级组成就是上文所说CLI和CLR,而C#是.Net第一推荐开发语言。
另外,2014 年11月13日,在微软新任首席执行官 萨帝亚·纳德拉 推动下,该公司发布的.NET源代码部分核心源码,包含.NET Framework Libraries、.NET Core Framework Libraries和RyuJit VM。
具体可以查看这个链接 .net 。
CIL和C#的标准化
2000年8月, 微软 、 惠普 和 英特尔 共同制定 CLI 和 C# 编程语言的标准规格。2001年12月,以上两者通过并成为 ECMA 标准规格。( ECMA 335 Archived 2013-06-26 at WebCite和 ECMA 334 页面存档备份 ,存于 互联网档案馆 )。 ISO 亦于 2003年4月 跟随( ISO/IEC 23271 页面存档备份 ,存于 互联网档案馆 和 ISO/IEC 23270 页面存档备份 ,存于 互联网档案馆 )。
任何按照上述标准实现的CLR都可以在其平台上解释和和运行CIL。
小结:
Unity第一推荐开发语言C#,之所以用C#的跨平台特性。而C#之所以跨平台是因为CIL是平台无关的。只要任何一个平台实现了当前平台对应的CLR,就可以在当前平台上解析和运行CIL。从而达到了一次编译,全平台运行的效果。
通用语言运行平台 ( Common Language Runtime ,简称 CLR )
从上面可以看出,C#或者CIL跨平台离不开对应平台CLR的支持。如果没有对应平台CLR对CIL的解析和对应机器码的实现,CIL就无法在当前平台运行。
维基百科上CLR包含如下功能:
1.基类库支持 Base Class Library Support
2.内存管理 Memory Management
3.线程管理 Thread Management
4.垃圾回收 Garbage Collection
5.安全性 Security
6.类型检查 Type Checker
7.异常管理 Exception Manager
8.调试管理 Debug Engine
9.中间码(MSIL)到机器代码(Native)编译
10.类别装载 Class Loader
Unity上所使用的的CLR实现
主流的CLR实现有两个版本
一个是 .NET Core 是微软开发的跨平台 ( Windows 、 Mac OSX 、 Linux ) 的应用程序开发框架(Application Framework)。
另外一个就是Unity所使用的 Mono ,一个 开源 的CLR实现版本。
Mono是什么?
Mono 是跨平台的 .Net Framework 的实现。Mono 做了一件很了不起的事情,将 CLR 在所有支持的平台上重新实现了一遍(包含手机上常用的安卓平台和Switch,PS4,这样的游戏机平台),并且mono还将 .Net Framework 提供的基础类库也重新实现了一遍。
Unity当年选用Mono而不是几乎只能在Windows上运行的.Net Core 就是看重了Mono的跨平台支持。并且Mono是一个开源软件,Unity也很方便在Mono的基础上做修改和微调。
好了,上面就是Unity和C#,Mono的各种纠葛。
总结一下就是
Unity因为方便和跨平台选择了C#作为主要的开发语言。而且C#的跨平台是基于.Net Framework框架下的(CIL,通用描述语言)和CLR(通用运行环境的)。
在经过各种考量后,Unity选择了开源,并且平台支持性很好的Mono这一开源的.Net Framework跨平台实现方案。