Mono
Mono是一个由Xamarin公司(先前是Novell,最早為Ximian)所主持的自由開放源碼專案。該專案的目標是创建一系列符合ECMA标准(Ecma-334[1]和Ecma-335[2])的.NET工具,包括C#编译器和通用语言架构。与微软的.NET Framework(共通語言執行平臺)不同,Mono项目不仅可以运行于Windows系统上,还可以运行于Linux、FreeBSD、Unix、OS X和Solaris,甚至一些遊戲平台,例如:Playstation 3、Wii或XBox 360。Mono的標誌是一個猴子格式的臉。 Mono现由Novell持有双重许可,这和Qt和Mozilla Application Suite的情况相似。Mono的C#编译器及其相关工具发布于GNU通用公共许可证(GPL)之下,其运行时库发布于GNU宽通用公共许可证(LGPL)之下,其类库发布于MIT許可證之下。这些均是开源协议因此Mono是一个开源软件。 微软开发了一个称为通用语言架构(Shared Source Common Language Infrastructure,Shared Source CLI;即今ECMA—通用语言架构)的可用于FreeBSD,Windows和Mac OS X的.NET实现版本。微软的共享源代码协议并不是开源软件协议,且可能对于社区来说也是不足够的(它明文禁止了对软件的商业用途)。另外,GNU也有一个.NET实现版本Portable.NET项目,该项目与Mono项目有着很多相同的目标。 Mono虚拟机包含一个即時編譯引擎,该引擎可用于如下处理器:x86、SPARC、PowerPC、ARM、S390(32位模式和64位模式)、x86-64、IA-64和64位模式的SPARC。该虚拟机可以将代码编译为本机代码。 历史當Microsoft在2000年6月第一次公佈.NET Framework時,它被描述為一個以網際網路標準為基底的新的平台。並且在12月發表了基本的共通語言架構開放標準的形式(ECMA-335),提供了無相依性實作的可能。Ximian的 米格爾·德伊卡薩在.NET的文档于2000年10月发布时就马上对.NET产生了兴趣。在查看字节码解释器后,他发现对于元数据(metadata)没有相应的说明文档。2001年2月,德伊卡薩在.NET邮件列表中索要到了那段缺失了的关于元数据文件格式的信息,并开始了采用C#编写一个C#编译器的工作,作为对C#的实践。2001年4月ECMA公布了那段缺失的文件格式,而在GUADEC(2001年4月6日-4月8日)德伊卡薩展示了他的编译器的一些特性(那个时候他的编译可以解释自身)。 Ximian内部对如何创建能有效提升生产效率的工具进行了大量的讨论,他们的目标是通过这些创建出来的工具让使用者可以在更短时间内创建出更多的应用程序从而缩短开发周期和降低开发成本。经过可行性研究后,他们清楚地见到创建这样的一项技术是可行的,于是Ximian从其它的项目抽调人员并创建了Mono的开发小组。由于缺少人力来创建整个.NET替代产品,他们在2001年7月19日的歐萊禮大会创建了Mono的开源项目。 差不多三年后,Mono于2004年7月30日发布了1.0版本。Mono逐步從一開始的重點為Linux桌面應用程式開發者平台,到支援寛廣範圍的架構和作業系統,包含了嵌入式系統。 在2011年4月,Attachmate收購Novell後,針對Novell發布了上百位人力的解僱。在3月16號德伊卡薩在他的blog發佈在被Novell解僱後,他找到一家公司將透過Xamarin繼續支援Mono。原本的Mono團隊也被移到新的公司。Xamarin計畫維持在Mono的工作。由於在這時間點Novell仍然擁有MonoTouch和專為Android的Mono,所以計畫針對iOS和Android上重寫商業化的.NETstacks。 在這發表之後,這個專案的未來被質疑。因為,專屬 Android的MonoTouch and Mono變成跟現存Attachmate所屬的商業化商品有直接競爭,也考量了Xamarin團隊為了相同的作品而不使用之前在Novell開發的技術,證實是有困難的。無論如何,在2011年七月Novell、Attachmate的子公司及Xamarin發表了對Xamarin for Mono, MonoTouch and Mono for Android的永久性許可證,正式地帶起這個案子的管理方式。
目前的狀況與藍圖截止2024年12月,Mono更新到了6.12.0.206版本,但项目已经由被微软收购的Xamarin移交给WineHQ[23],官方建议将现有Mono应用程序迁移到同样开源的.Net平台上。 Mono組成元件Mono組成元件包含了以下三類:
核心元件包含了C# 編譯器,Common Language Infrastructure虛擬機器,以及核心類別程式庫。這些元件都是基於Ecma-334 and Ecma-335標準,[24]而使得Mono能夠提供與標準相容、免費、並且是開放原始碼的CLI 虛擬機器。微軟曾經聲明這些標準都是基於Community Promise license的社群保護承諾之下。[25] Mono/Linux/GNOME開發堆疊則是提供了工具以用於開發應用軟體。這些工具使用了既有的GNOME以及自由並且開放原始碼程式庫,它們包含了針對圖形使用者介面(GUI)開發的Gtk#、可套用Gecko rendering engine的Mozilla程式庫、Unix整合程式庫(Mono.Posix)、安全性推疊、以及XML schema語言RelaxNG。Gtk# 讓Mono應用程式融入Gnome桌面環境而成為原生程式。資料庫程式庫則提供了與物件關連式資料庫連結的能力,這些資料庫包含了 db4o、Firebird、Microsoft SQL Server(MSSQL)、MySQL、Open Database Connectivity(ODBC)、Oracle、PostgreSQL、SQLite等等。在網站上可看見Mono專案一直都在持續更新維護資料庫程式庫。[26] 微軟相容堆疊則是提供了一種方式來使得Windows .NET應用程式可以被移植到GNU/Linux上。這個堆疊包含了ADO.NET、ASP.NET以及Windows Forms等等。不過,由於這些元件並沒有被上述所說Ecma標準所涵蓋,因此部份元件有所謂專利恐懼與疑慮的問題。 架构程式執行引擎Mono程式的執行包含一個程式碼運作引擎,它會將ECMA CIL的byte code轉譯為原生碼(Native Code),它支援了以下處理器:ARM、MIPS(只有32位元模式)、SPARC、PowerPC、S390(64位元模式)、x86、x86-64以及IA-64 64位元模式。 程式的轉譯有三種模式:
從2.6版起,Mono開始支援使用LLVM來產生執行碼,而非原本自帶的方式。這對於高效能計算方面非常有用,因為在這種場合下,程式的執行效能比啟動速度來得重要。 從2.7 Preview版開始,使用者不再需要在程式編譯前的Configuration時就必須選定執行碼產生引擎,執行碼的產生可以在程式啟動時以 垃圾回收當2.8版推出時,Mono runtime提供了兩套垃圾回收器:generational collector[27]以及Boehm conservative collector。在Mono 3.1.1版之前,預設的垃圾回收器(Boehm-Demers-Weiser Conservative Garbage Collector),[27][28]跟商業環境如Java Virtual Machine或.NET framework的垃圾回收器相比,一直有很大的限制,在某些狀況的應用軟體上會發生内存泄漏的現象,這使得Mono無法用於需要長時間執行的伺服器應用。 截至2010年10月[update],一個稱之為「Simple Generational GC」(SGen-GC)的新一代垃圾回收器開始用於Mono中,在3.1.1版之後就直接變成是預設的垃圾回收器。對於Mono 2.8到3.1.0,使用者可以以傳入參數 目前SGen是以比較保守的方式來對待堆疊與暫存器,並且,那些可被參考到的物件是由它們的root來負責pin的動作。未來版本的Mono將會以精確方式來掃描託管的堆疊,藉此減少那些被pin的物件。 類別庫類別庫为应用程序开发提供一套广泛而有效的工具类。这些工具类可以用于任何.NET语言。類別庫被按命名空间进行了结构化,并被放置于称为程序集的共享库中。在我们谈到.NET Framework时,我们多数是指这个类库。 命名空间和程序集命名空间是一种用于将逻辑上相似的类按层次结构分组的机制。这种机制防止了命名冲突。在这种结构化采用被点号"."分隔的单词来实现。通常最顶层的命名空间是System,例如System.IO和System.Net(完整的命名空间列表可以在Mono文档[29]中找到)。当然还有别的顶层命名空间,例如Accessibility和Windows就是这样的例子。新建的命名空间还可以以开发组织的名字开头。 程序集是这些类库的物理载体。它们跟Win32共享库一样都是dll文件,尽管不完全一样。一些程序集的例子有:mscorlib.dll,System.dll,System.Data.dll和Accessibility.dll。命名空间经常被分拆到几个程序集中,而一个程序集可以由几个文件组成。 公共语言基础和公共语言规范公共语言基础(Common Language Infrastructure,CLI)是一套标准(ECMA335),公共语言运行时(Common Language Runtime)即CLR是CLI标准的实现,Mono是实现者之一。该运行时用于执行已编译的.NET应用程序。公共语言基础已被ECMA定义为标准ECMA-335。要运行一个.NET应用程序,你必须使用相应的参数调用运行时。 在ECMA-335的第六章详细说明了「公共语言规范」(Common Language Specification,CLS)并定义了提供给公共语言基础的接口,例如对于枚举类型的隐含表示类型的协定。Mono的编译器负责生成符合公共语言规范的映射代码,即公共中间语言(Common Intermediate Language,CIL)。Mono的运行时将运行这类代码。ECMA标准先前还定义了一个符合公共语言规范的程序库作为应用框架。 托管与非托管代码在原生的.NET/Mono应用程序中,所有代码都是托管的,也就是说,是受管于CLI式的内存管理和线程安全管理的。其它的.NET或Mono应用程序可以通过使用System.InterOpServices库创建C#绑定来调用已存的非托管代码。很多移植到Mono的类库使用了CLI的这个特性,例如Gtk#。 相关项目现有大量与Mono相关的用于扩展Mono的项目,这些项目允许开发者在他们的开发环境中使用Mono。这些项目包括:
授權Mono是透過Xamarin的雙重授權,相似於其他產品,如Qt和Mozilla application Suite。Mono's C#編譯器與工具是依照GNU Leasser General Public License(LGPLv2 only)來釋出(開始於Mono 2.0,Mono C#的編譯器源碼在MIT X11 License仍然是有效的),屬於GNU Leasser General Public License(LGPLv2 only)的runtime函式庫及屬於MIT X11 License的類別函式庫。 有完全免費的軟體與開源授權,因此Mono是免費的開源軟體。 C#編譯器的授權改變是從GPL到MIT X11授權,允許編譯器的程式碼在少許的GPL限制例子中被重複使用,如例:
* Mono互動介面的Shell * Mono可崁入的的C#編譯器
Mono与微软的专利人们对于微软能否采用专利摧毁Mono项目进行了大量的争论。其实,专利问题不在于已被提交到ECMA组织的核心技术或Unix/Gnome的专有部分,而在于由微软基于.NET Framework创建的技术,例如ASP.NET、ADO.NET和Windows Forms。这些技术在Mono中至今还没有被完全地实现,事实上,在开发Mono应用程序时也不需要用到,然而,在开发基于Windows平台的程序时却是不可缺少的。Mono团队将目标定为将这些技术纳入到项目中,并制订了一个三步驟策略来处理它们:
显然,第一个选项并不总是可行的。对于一些问题,例如那些与协同工作和交互相关的,可能就只有一种解决方案。由于这个相同的原因,尽管第二个选项总是可行的,它却可能导致一个开发出来的产品并不能作为.NET的替代品。第三个选项则是昂贵的,甚至不可能的,这需要一定程度的运气。 使用Mono开发的软件
分支版本2011年4月,Novell公司被Attachmate公司所併購,而原先在Novell公司裡的Mono開發者被大量資遣。2011年5月,原先Mono的開發者另外成立一家Xamarin的公司,仿Mono發行他們的Xamarin跨平台.NET套件,在Windows下能與整合到Microsoft Visual Studio的IDE之中。2011年7月,Attachmate公司旗下的Novell公司批准了Mono相關專案到Xamarin的授權。 备注
参考文献
外部链接
|