Mono

Mono是一個由Xamarin公司不同，Mono專案不僅可以運行於Windows系統上，還可以運行於Linux、FreeBSD、Unix、OS X和Solaris，甚至一些遊戲平臺，例如：Playstation 3、Wii或XBox 360。Mono的標誌是一個猴子格式的臉。Mono現由Novell持有雙重許可，這和Qt和Mozilla Application Suite的情況相似。Mono的C#編譯器及其相關工具釋出於GNU通用公共許可證之下，其類庫釋出於MIT許可證之下。這些均是開源協議因此Mono是一個開源軟體。微軟開發了一個稱為通用語言架構。另外，GNU也有一個.NET實現版本專案，該專案與Mono專案有著很多相同的目標。Mono虛擬機器包含一個即時編譯引擎，該引擎可用於如下處理器：x86、SPARC、PowerPC、ARM、S390、x86-64、IA-64和64位模式的SPARC。該虛擬機器可以將程式碼編譯為本機程式碼。歷史.當Microsoft在2000年6月第一次公佈.NET Framework時，它被描述為一個以網際網路標準為基底的新的平臺。並且在12月發表了基本的共通語言架構開放標準的形式，提供了無相依性實作的可能。Ximian的米格爾·德伊卡薩在.NET的文件於2000年10月釋出時就馬上對.NET產生了興趣。在檢視位元組碼直譯器後，他發現對於元資料。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的永久性許可證，正式地帶起這個案子的管理方式。目前的狀況與藍圖.Mono目的的版本為3.10.0。在實驗性質mono的開發.NET Framework的一些遺失部份稱做OliveMono專案也建立了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組成元件包含了以下三類："核心元件"包含了C# 編譯器，Common Language Infrastructure虛擬機器，以及核心類別程式庫。這些元件都是基於Ecma-334 and Ecma-335標準,而使得Mono能夠提供與標準相容、免費、並且是開放原始碼的CLI 虛擬機器。微軟曾經宣告這些標準都是基於Community Promise license的社群保護承諾之下。"Mono/Linux/GNOME開發堆疊"則是提供了工具以用於開發應用軟體。這些工具使用了既有的GNOME以及自由並且開放原始碼程式庫，它們包含了針對圖形使用者介面、Oracle、PostgreSQL、SQLite等等。在網站上可看見Mono專案一直都在持續更新維護資料庫程式庫。"微軟相容堆疊"則是提供了一種方式來使得Windows .NET應用程式可以被移植到GNU/Linux上。這個堆疊包含了ADO.NET、ASP.NET以及Windows Forms等等。不過，由於這些元件並沒有被上述所說Ecma標準所涵蓋，因此部份元件有所謂專利恐懼與疑慮的問題。架構.程式執行引擎.Mono程式的執行包含一個程式碼運作引擎，它會將ECMA CIL的byte code轉譯為原生碼、x86、x86-64以及IA-64 64位元模式。程式的轉譯有三種模式：從2.6版起，Mono開始支援使用LLVM來產生執行碼，而非原本自帶的方式。這對於高效能計算方面非常有用，因為在這種場合下，程式的執行效能比啟動速度來得重要。從2.7 Preview版開始，使用者不再需要在程式編譯前的Configuration時就必須選定執行碼產生引擎，執行碼的產生可以在程式啟動時以codice_1或codice_2的引數來指定即可，預設是以自帶的引擎為主，因為它的產生速度比較快。垃圾回收.當2.8版推出時，Mono runtime提供了兩套垃圾回收器：generational collector以及Boehm conservative collector。在Mono 3.1.1版之前，預設的垃圾回收器，跟商業環境如Java Virtual Machine或.NET framework的垃圾回收器相比，一直有很大的限制，在某些狀況的應用軟體上會發生記憶體洩漏的現象，這使得Mono無法用於需要長時間執行的伺服器應用。截至2010年 (2010)[ [update]]，一個稱之為「Simple Generational GC」，並且對這些物件使用mark-and-sweep演演算法。目前SGen是以比較保守的方式來對待堆疊與暫存器，並且，那些可被參考到的物件是由它們的root來負責pin的動作。未來版本的Mono將會以精確方式來掃描託管的堆疊，藉此減少那些被pin的物件。類別庫.類別庫為應用程式開發提供一套廣泛而有效的工具類。這些工具類可以用於任何.NET語言。類別庫被按名稱空間進行了結構化，並被放置於稱為程式集的共享庫中。在我們談到.NET Framework時，我們多數是指這個類庫。名稱空間和程式集.名稱空間是一種用於將邏輯上相似的類按層次結構分組的機制。這種機制防止了命名衝突。在這種結構化採用被點號"."分隔的單詞來實現。通常最頂層的名稱空間是System，例如System.IO和System.Net。當然還有別的頂層名稱空間，例如Accessibility和Windows就是這樣的例子。新建的名稱空間還可以以開發組織的名字開頭。程式集是這些類庫的物理載體。它們跟Win32共享庫一樣都是dll檔案，儘管不完全一樣。一些程式集的例子有：mscorlib.dll，System.dll，System.Data.dll和Accessibility.dll。名稱空間經常被分拆到幾個程式集中，而一個程式集可以由幾個檔案組成。公共語言基礎和公共語言規範.公共語言基礎即CLR是CLI標準的實現，Mono是實現者之一。該執行時用於執行已編譯的.NET應用程式。公共語言基礎已被ECMA定義為標準ECMA-335。要執行一個.NET應用程式，你必須使用相應的引數呼叫執行時。在ECMA-335的第六章詳細說明了「公共語言規範」。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的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開發的軟體.以下是使用Mono API和C#編寫的部分程式：分支版本.2011年4月，Novell公司被公司所併購，而原先在Novell公司裡的Mono開發者被大量資遣。2011年5月，原先Mono的開發者另外成立一家Xamarin的公司，仿Mono發行他們的Xamarin跨平臺.NET套件，在Windows下能與整合到Microsoft Visual Studio的IDE之中。2011年7月，公司旗下的Novell公司批准了Mono相關專案到Xamarin的授權。