Mono

電腦軟體專案

Mono是一個由Xamarin公司(先前是Novell,最早為Ximian)所主持的自由開放原始碼專案。該專案的目標是建立一系列符合ECMA標準(Ecma-334[1]和Ecma-335[2])的.NET工具,包括C#編譯器和通用語言架構。與微軟的.NET Framework共通語言執行平臺)不同,Mono專案不僅可以執行於Windows系統上,還可以執行於LinuxFreeBSDUnixOS XSolaris,甚至一些遊戲平台,例如:Playstation 3、Wii或XBox 360。Mono的標誌是一個猴子格式的臉。

Mono
開發者Novell, Xamarin
目前版本6.12.0.122(2021年2月23日,​3年前​(2021-02-23
原始碼庫 編輯維基數據連結
作業系統跨平台
類型系統平台
特許條款GPLLGPLMIT特許條款,或雙重特許
網站http://www.mono-project.com/

Mono現由Novell持有雙重特許,這和QtMozilla 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英語Portable.NET專案,該專案與Mono專案有着很多相同的目標。

Mono虛擬機器包含一個即時編譯引擎,該引擎可用於如下處理器:x86SPARCPowerPCARMS390(32位元模式和64位元模式)、x86-64IA-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的永久性特許條款,正式地帶起這個案子的管理方式。

發行歷史(Release History)
發行日(Date) 版本(Version)[3] 備註(Notes)
2004-06-30 1.0[4] C# 1.0 support
2004-09-21 1.1[5]
2006-11-09 1.2[6] C# 2.0 support
2008-10-06 2.0[7] Mono's APIs are now in par with .NET 2.0. Introduces the C# 3.0 and Visual Basic 8 compilers. New Mono-specific APIs: MonoCecil, MonoCairo and MonoPosix. Gtk# 2.12 is released. The Gendarme verification tool and Mono Linker are introduced.
2009-01-13 2.2[8] Mono switches its JIT engine to a new internal representation [9]that gives it a performance boost and introduces SIMD support in the MonoSimd [10]MonoSimd namespace.
Mono introduces Full Ahead of Time頁面存檔備份,存於互聯網檔案館) compilation that allows developers to create full static applications and debuts the C# Compiler as a Service [11]and the C# Interactive Shell [12](C# REPL)
2009-03-30 2.4[13] This release mostly polishes all the features that shipped in 2.2 and became the foundation for the Long-Term support of Mono in SUSE Linux.
2009-12-15 2.6[14] The Mono runtime is now able to use LLVM as a code generation backend and this release introduces Mono co-routines, the Mono Soft Debugger and the CoreCLR security system required for Moonlight and other Web-based plugins.
On the class library System.IO.Packaging, WCF client, WCF server, LINQ to SQL debut. The Interactive shell supports auto-completion and the LINQ to SQL supports multiple database backends. The xbuild build system is introduced.
2010-09-22 2.8[15] Defaults to .NET 4.0 profile, C# 4.0 support, new generational garbage collector, includes Parallel Extensions英語Parallel Extensions, WCF Routing, CodeContracts, ASP.NET 4.0, drops the 1.0 profile support; the LLVM engine tuned to support 99.9% of all generated code, runtime selectable llvm and gc; incorporates Dynamic Language Runtime, MEF英語Managed Extensibility Framework, ASP.NET MVC2, OData Client open source code from Microsoft;. Will become release 3.0
2011-02-15 2.10[16]
2012-10-18 3.0[17] C# 5.0 support, async support, Async Base Class Library Upgrade and MVC4 - Partial, no async features support.
2013-07-24 3.2[18]
2014-05-31 3.4[19]
2014-05-31 3.6[20]
2014-09-04 3.8[21]
2014-10-04 3.10[22]

目前的狀況與藍圖 

Mono目的的版本為3.10.0(2014年10月)。這個版本提供了.NET Framework的核心API、Visual Basic .NET的支援、C#版本2.0,3.0,及4.0、LINQ to Objects、XMLSQL等。在C#編譯器的目前操作的預設模式是C# 4.0。Windows Forms 2.0也有被支援,但沒有積極地被開發,因此,它在Mono的支援不完整。Mono的目標是達成在.NET 4.0的完整功能支援,除了Windows Presentation Foundation(WPF)和Limited Windows Communication Foundation(WCF)。 在實驗性質mono的開發.NET Framework的一些遺失部份稱做Olive Mono專案也建立了Visual Basic .NET編譯器與一個runtime的VB.NET的應用程式。它目前一直由Rolf Bjarne Kvinge進行開發。

Moonlight

Moonlight是一個Microsoft Silverlight的開源實作,自從Mono 1.9起即包含了這實作。在2009年1月20日釋出的Moonlight 1.0支援Silverlight 1.0 APIs。而Moonlight 2.0支援Silverlight 2.0。Moonlight 3.0則在2010年2月被發表,包含了Silverlight 3.0的支援。Moonlight最終在2012年3月29日被放棄。依據米格爾所言,兩個因素扼殺了這個專案的命運:Microsoft增加了「人為限制」...這造成了桌面程式無用武之地...",並且在Web上的技術沒有獲得足夠的配合。

Mono組成元件

Mono組成元件包含了以下三類:

  1. 核心元件
  2. Mono/Linux/GNOME開發堆疊
  3. 微軟相容堆疊

核心元件包含了C# 編譯器,Common Language Infrastructure虛擬機器,以及核心類別程式庫。這些元件都是基於Ecma-334 and Ecma-335標準,[23]而使得Mono能夠提供與標準相容、免費、並且是開放原始碼的CLI 虛擬機器。微軟曾經聲明這些標準都是基於Community Promise license的社群保護承諾之下。[24]

Mono/Linux/GNOME開發堆疊則是提供了工具以用於開發應用軟件。這些工具使用了既有的GNOME以及自由並且開放原始碼程式庫,它們包含了針對圖形用戶介面(GUI)開發的Gtk#、可套用Gecko rendering engine的Mozilla程式庫、Unix整合程式庫(Mono.Posix)、安全性推疊、以及XML schema語言RelaxNG。Gtk# 讓Mono應用程式融入Gnome桌面環境而成為原生程式。資料庫程式庫則提供了與物件關連式資料庫連結的能力,這些資料庫包含了 db4oFirebirdMicrosoft SQL Server(MSSQL)、MySQLOpen Database Connectivity(ODBC)、OraclePostgreSQLSQLite等等。在網站上可看見Mono專案一直都在持續更新維護資料庫程式庫。[25]

微軟相容堆疊則是提供了一種方式來使得Windows .NET應用程式可以被移植到GNU/Linux上。這個堆疊包含了ADO.NETASP.NET以及Windows Forms等等。不過,由於這些元件並沒有被上述所說Ecma標準所涵蓋,因此部份元件有所謂專利恐懼與疑慮的問題。

架構

 

程式執行引擎

Mono程式的執行包含一個程式碼運作引擎,它會將ECMA CIL的byte code轉譯為原生碼(Native Code),它支援了以下處理器:ARMMIPS(只有32位元模式)、SPARCPowerPCS390(64位元模式)、x86x86-64以及IA-64 64位元模式。

程式的轉譯有三種模式:

  • Just-in-time (JIT)編譯:在程式執行當中將ECMA CIL的byte code轉譯為原生碼。
  • Ahead-of-Time (AOT)編譯:ECMA CIL的byte code(通常在.exe檔或.dll檔中)會轉譯出原生碼並儲存在作業系統中、以及CPU架構設定檔(例如在Linux上,如果是foo.exe,就會產生foo.exe.so檔)。通常,此種模式可產生出絕大部份前種模式所產生的原生碼,部份的例外是trampolines或是控管監督相關的碼(仍舊需要JIT來執行),由此可知AOT影像檔並非可以完全獨立執行的。
  • 完全靜態編譯:這個模式只支援少數平台,它基於AOT編譯模式上,更進一步產生所有的trampoline、wrappers以及proxies,這幾樣東西是用於靜態連結出靜態檔案時所需。完全靜態編譯模式可以讓程式的執行期完全不需要用到JIT,這個做法適用於Apple iOS作業系統、Sony PlayStation 3以及微軟的XBox 360等作業系統。[來源請求]

從2.6版起,Mono開始支援使用LLVM來產生執行碼,而非原本內建的方式。這對於高效能計算方面非常有用,因為在這種場合下,程式的執行效能比啟動速度來得重要。

從2.7 Preview版開始,用戶不再需要在程式編譯前的Configuration時就必須選定執行碼產生引擎,執行碼的產生可以在程式啟動時以--llvm--nollvm的參數來指定即可,預設是以內建的引擎為主,因為它的產生速度比較快。

垃圾回收

當2.8版推出時,Mono runtime提供了兩套垃圾回收器:generational collector[26]以及Boehm conservative collector。在Mono 3.1.1版之前,預設的垃圾回收器(Boehm-Demers-Weiser Conservative Garbage Collector),[26][27]跟商業環境如Java Virtual Machine或.NET framework的垃圾回收器相比,一直有很大的限制,在某些狀況的應用軟件上會發生記憶體流失的現象,這使得Mono無法用於需要長時間執行的伺服器應用。

截至2010年10月 (2010-10),一個稱之為「Simple Generational GC」(SGen-GC)的新一代垃圾回收器開始用於Mono中,在3.1.1版之後就直接變成是預設的垃圾回收器。對於Mono 2.8到3.1.0,用戶可以以傳入參數--gc=sgen來讓Mono runtime啟動時使用SGen垃圾回收器。[26]這個新的垃圾回收器相較於傳統基於保守型掃描方式的回收器,有很多優點,它使用了generational garbage collection,從物件一開始被組態、到各個週期,所有活着的物件都會被轉移到較早代的記憶體池,這個想法是來自於因為許多物件都只是短暫使用的,因此可以被快速回收再利用,只有少數物件是長期性的存活在應用程式的整個生命期中。另外,為了改善效率,這個回收器對每個線程組態了個別的記憶體池,讓線程不需要跟別的線程打交道就可以自行組態記憶體區塊。對於前述所說,物件的轉移到較早代記憶體池的做法則是,在轉移之後,將所有目前指向該物件的指標都更新為新的地址。由於這樣的做法在大型物件時比較浪費記憶體,因此SGen為大型物件使用了獨自的記憶體池(Large Object Section),並且對這些物件使用mark-and-sweep演算法。

目前SGen是以比較保守的方式來對待堆疊與暫存器,並且,那些可被參考到的物件是由它們的root來負責pin的動作。未來版本的Mono將會以精確方式來掃描寄存的堆疊,藉此減少那些被pin的物件。

類別庫

類別庫為應用程式開發提供一套廣泛而有效的工具類。這些工具類可以用於任何.NET語言。類別庫被按命名空間進行了結構化,並被放置於稱為程式集的共用庫中。在我們談到.NET Framework時,我們多數是指這個類別館。

命名空間和程式集

命名空間是一種用於將邏輯上相似的類按階層分組的機制。這種機制防止了命名衝突。在這種結構化採用被點號"."分隔的單詞來實現。通常最頂層的命名空間是System,例如System.IO和System.Net(完整的命名空間列表可以在Mono文件[28]中找到)。當然還有別的頂層命名空間,例如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。這些專案包括:

  • Cocoa#[29],對原生Mac OS X工具包的一系列包裝(Cocoa)。
  • Gecko#,一個對在Mozilla中使用的嵌入式佈局引擎的繫結(Gecko)。
  • Gtk#,對使用CGTK+庫的C#的外包。
  • Tao,一個圖形及遊戲庫的繫結。

特許

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#編譯器的特許改變是從GPLMIT X11特許,允許編譯器的程式碼在少許的GPL限制例子中被重複使用,如例:

  • 作為服務的Mono編譯器
 * Mono互動介面的Shell
 * Mono可崁入的的C#編譯器
  • Mono的C# 4.0的動態綁定的實作
  • MonoDevelop的內建parser和AST

Mono與微軟的專利

人們對於微軟能否採用專利摧毀Mono專案進行了大量的爭論。其實,專利問題不在於已被提交到ECMA組織的核心技術或Unix/Gnome的專有部分,而在於由微軟基於.NET Framework建立的技術,例如ASP.NETADO.NETWindows Forms。這些技術在Mono中至今還沒有被完全地實現,事實上,在開發Mono應用程式時也不需要用到,然而,在開發基於Windows平台的程式時卻是不可缺少的。Mono團隊將目標定為將這些技術納入到專案中,並制訂了一個三步驟策略來處理它們:

  1. 採用其它實現方式來實現從而繞過專利問題
  2. 把包含專利的代碼清除出專案
  3. 找出「現有技術(prior art)」從而將專利變為非專利

顯然,第一個選項並不總是可行的。對於一些問題,例如那些與協同工作和互動相關的,可能就只有一種解決方案。由於這個相同的原因,儘管第二個選項總是可行的,它卻可能導致一個開發出來的產品並不能作為.NET的替代品。第三個選項則是昂貴的,甚至不可能的,這需要一定程度的運氣。

使用Mono開發的軟件

 
F-Spot photo management program
 
Muine music player

以下是使用Mono APIC#編寫的部分程式:

分支版本

2011年4月,Novell公司被Attachmate英語Attachmate公司所併購,而原先在Novell公司裏的Mono開發者被大量資遣。2011年5月,原先Mono的開發者另外成立一家Xamarin的公司,仿Mono發行他們的Xamarin跨平台.NET套件,在Windows下能與整合到Microsoft Visual Studio的IDE之中。2011年7月,Attachmate英語Attachmate公司旗下的Novell公司批准了Mono相關專案到Xamarin的特許。

備註

  1. ^ For more information about the licensing, see Mono FAQ: Licensing頁面存檔備份,存於互聯網檔案館

參考文獻

  1. ^ Ecma-334頁面存檔備份,存於互聯網檔案館
  2. ^ Ecma-335頁面存檔備份,存於互聯網檔案館
  3. ^ OldReleases - Mono. Mono-project.com. [2013-07-17]. (原始內容存檔於2020-09-24). 
  4. ^ Mono 1.0 Release Notes. Go-mono.com. [2013-07-17]. (原始內容存檔於2020-04-09). 
  5. ^ Mono 1.1.1: Development Release: Features and Known Issues. Go-mono.com. [2013-07-17]. (原始內容存檔於2020-04-09). 
  6. ^ Mono 1.2: Release Notes. Go-mono.com. [2013-07-17]. (原始內容存檔於2020-04-09). 
  7. ^ Release Notes Mono 2.0 - Mono. Mono-project.com. 2008-10-06 [2013-07-17]. (原始內容存檔於2020-11-09). 
  8. ^ Release Notes Mono 2.2 - Mono. Mono-project.com. [2013-07-17]. (原始內容存檔於2020-06-12). 
  9. ^ Linear IR - Mono. Mono-project.com. [2013-07-17]. (原始內容存檔於2020-11-09). 
  10. ^ Mono's SIMD Support: Making Mono safe for Gaming - Miguel de Icaza. Tirania.org. 2008-11-03 [2013-07-17]. (原始內容存檔於2010-11-04). 
  11. ^ Mono's C# Compiler as a Service on Windows. - Miguel de Icaza. Tirania.org. 2010-04-27 [2013-07-17]. (原始內容存檔於2020-11-09). 
  12. ^ CsharpRepl - Mono. Mono-project.com. [2013-07-17]. (原始內容存檔於2020-09-20). 
  13. ^ Release Notes Mono 2.4 - Mono. Mono-project.com. [2013-07-17]. (原始內容存檔於2020-11-09). 
  14. ^ Release Notes Mono 2.6 - Mono. Mono-project.com. [2013-07-17]. (原始內容存檔於2020-08-29). 
  15. ^ Release Notes Mono 2.8 - Mono. Mono-project.com. [2013-07-17]. (原始內容存檔於2020-11-09). 
  16. ^ Release Notes Mono 2.10 - Mono. Mono-project.com. [2013-07-17]. (原始內容存檔於2020-08-04). 
  17. ^ Release Notes Mono 3.0. Mono-project.com. [2013-09-23]. (原始內容存檔於2020-11-12). 
  18. ^ Release Notes Mono 3.2. Mono-project.com. [2013-09-23]. (原始內容存檔於2020-11-12). 
  19. ^ Release Notes Mono 3.4.0. Mono-project.com. [2014-05-31]. (原始內容存檔於2020-09-24). 
  20. ^ Release Notes Mono 3.6. Mono-project.com. [2014-05-31]. (原始內容存檔於2020-09-24). 
  21. ^ Release Notes Mono 3.8.0. Mono-project.com. [2014-09-04]. (原始內容存檔於2020-09-24). 
  22. ^ Release Notes Mono 3.10.0. Mono-project.com. [2014-10-04]. (原始內容存檔於2020-09-24). 
  23. ^ Ecma-335. [2006-04-14]. (原始內容存檔於2013-06-26). 
  24. ^ Technet.com. [2014-06-10]. (原始內容存檔於2013-06-22). 
  25. ^ Database Access - Mono. [2014-06-10]. (原始內容存檔於2020-04-09). 
  26. ^ 26.0 26.1 26.2 Compacting GC. mono-project.com. [2008-12-16]. (原始內容存檔於2020-11-09). 
  27. ^ Boehm, Hans-J. Advantages and Disadvantages of Conservative Garbage Collection. Xerox PARC. [2008-12-16]. (原始內容存檔於2013-07-24). 
  28. ^ Mono文件頁面存檔備份,存於互聯網檔案館
  29. ^ Cocoa#頁面存檔備份,存於互聯網檔案館
  30. ^ Planet Gnome頁面存檔備份,存於互聯網檔案館
  31. ^ 行星頁面存檔備份,存於互聯網檔案館
  32. ^ Bless頁面存檔備份,存於互聯網檔案館
  33. ^ CDCollect頁面存檔備份,存於互聯網檔案館
  34. ^ Fiddler頁面存檔備份,存於互聯網檔案館
  35. ^ Galaxium頁面存檔備份,存於互聯網檔案館
  36. ^ GLyrics
  37. ^ Gpremacy頁面存檔備份,存於互聯網檔案館
  38. ^ imeem頁面存檔備份,存於互聯網檔案館
  39. ^ MindFire

外部連結

國際站點