Genesis-3D中的Mono(一)

在这部分系列文章中我将想大家介绍两部分内容,第一是关于Mono的一些基础知识,另外一部分则是Genesis-3D中所使用的Mono。下面我们来详细了解一下有关Mono的基本内容。

     Mono自诞生以来就带有大量Microsoft的影子,为何这么说?因为Mono起初的目的就是将Microsoft的C#语言搬到Linux操作系统中。我不得不承认C#是一门不错的语言,虽然讨论编程语言很容易引起开发者的热烈讨论,但我这里不否认python,Go也是很棒的编程语言。我无意追捧或者批评某些语言。还是回到Mono,经过几年的发展,Mono不仅仅可以在Linux中使用,其他操作系统也得到了发展。例如你可以使用C#语言来开发iOS应用,也可以使用C#来编写Mac OS X桌面软件。由于Mono的一些特殊性,在Windows操作系统中我们可以使用原生的.net framework,也可以通过Mono的runtime来运行Mono项目。这里我要介绍一下Mono最重要的两部分。

C# Compliler

     在Mono中,我们使用的是Mono提供的编译器来编译C#源码。由于C#语言也一直处于发展状态,目前Microsoft官方最新版本为C#5.0,但Mono对于C#5.0的支持处于预览版本状态。当你安装了Mono的SDK后,你可以使用命令行来编译你的Mono项目。由于版本的缘故,Mono的编译器提供了四个版本。通过不同的命令我们可以加以区分。
gmcs :  这是旧版本的编辑器,对应编译的目标是mscorlib 2.0
smcs :  这个版本我并没有在最新的SDK中找到,他的编译目标对应mscorib 2.1。不过这个版本中有个特殊的东西,可以编译出Moonlight应用。所谓Moonlight应用就是跨平台的Silverlight。
dmcs :  这个编译器可支持mscorlib 4.0
     我想大家看到这里已经感觉非常混乱了,开发者通常不希望为不同版本还需要选择不同的编译器来使用。作为一个跨平台的工具,我们尽量减少各个版本之间的差异为了统一这些编译器,你现在可以使用一个新的命令。
mcs : 目前我们常用的编译器,他实现了ECMA-334的语言实现规范。在这个新的编译器中兼容了C#1、2、3、4版本。但是大家在实际使用的时候需要注意的是,默认mcs仅仅引用了mscorlib、System和system.xml三个库,如果你想使用其他功能,需要在命令行中手动引用。具体功能说明可以使用  “man mcs”命令(仅限于Mac OSX和Linux系统,Windows请查看官方网站说明)
或者你也可以使用 “mcs -help”命令来查看相关命令参数说明。

 Mono Runtime

     近几年的计算机语言的技术发展多偏向于运行时的方式,虽然解释型语言在性能上无法媲美编译型语言。但在开发难度和跨平台兼容性上远远高于编译型语言。
     Mono提供了一套自己的runtime,Mono Runtime是一套符合ECMA标准的CLI(Common Language Infrastructure)。在这套runtime中提供了一套JIT(Just in Time)编译器。我想对于这名词,做Android开发的开发者再也熟悉不过了。同时该runtime还提供一个AOT编译器(Ahead of Time)。另外runtime还包含了一套library装载机、一个垃圾回收机和一套线程系统。
     简单介绍了一下Mono,其实大家可以发现,除了C#语法以外,其他的东西全部自成一套。但由于跨平台的需要,Mono在API上对于各个系统平台兼容做足了功夫。在Mono中,我们可以找到两大类Library。
     Base Class Library 这部分提供的类非常全面,同时也与Microsorf的.net framework相兼容。
     Mono Class Library 这是Mono独有的,也提供非常多的跨平台功能如Gtk+的支持、Zip文件操作、LDAP、OpenGL、Cairo和POSIX。
     上面是关于Mono的介绍,介绍这部分内容的目的是为了让大家对与Mono的机制与环境有一个大概的了解。在以后的文章中我还会更多的介绍Mono中的一些特性与使用经验,帮助大家在编写Genesis-3D脚本时候不至于无从下手。
     关于Genesis-3D中的Mono,在Genesis-3D中所有底层代码均使用C++来编写,并未使用Mono的技术。实际上在开发游戏时候,如果你使用了C#脚本,那么你的脚本将运行于Mono runtime中,而真正实现功能的则是最下层由C++编写的功能模块快。你可以在Genesis-3D中的Mono理解为一个脚本解释器,仅此而已。
     这是一个简单的,先入为主的概念。如果你深入使用Genesis-3D来开发项目的话,你会发现,Mono有时候会帮助你更加灵活的处理问题。