Unity C# 和 Mono简史

一般Unity游戏开发,都使用C#作为主要开发语言。虽然Unity本身支持UnityScript(也就是 JavaScript for Unity)和Boo(一种受Python启发的语言。Unity5.0后不再支持Boo),但是在正常生产实践中,还是会使用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 FormsADO.NETASP.NET等一堆东西

.NET的初级组成就是上文所说CLI和CLR,而C#是.Net第一推荐开发语言。

另外,2014 年11月13日,在微软新任首席执行官萨帝亚·纳德拉推动下,该公司发布的.NET源代码部分核心源码,包含.NET Framework Libraries、.NET Core Framework Libraries和RyuJit VM。

具体可以查看这个链接.net

CIL和C#的标准化

2000年8月,微软惠普英特尔共同制定CLIC#编程语言的标准规格。2001年12月,以上两者通过并成为ECMA标准规格。(ECMA 335Archived2013-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 是微软开发的跨平台 (WindowsMac OSXLinux) 的应用程序开发框架(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跨平台实现方案。

“Unity当年选用Mono而不是几乎只能在Windows上运行的.Net Core 就是看重了Mono的跨平台支持。”这句问题有点多啊。Unity当年只有.NET Framework,它是只支持Windows的

C#当年只能在Windows跑的版本是.Net Framework,之后为了跨平台才推出了.Net Core,这是两套东西。虽然.Net Core一大部分工作就是搬运.Net Framework的API,但是还是分开讨论比较好

Unity C# 和 Mono - 知乎

猜你喜欢

转载自blog.csdn.net/qq_42672770/article/details/124137029