Nejdůležitější přínos z platformy .NET na operačním systému GNU/Linux budou mít samozřejmě uživatelé, protože by konečně mohl nastat konec všem nářkům o tom, že na Linuxu nejedou aplikace pro Microsoft Windows.
Microsoft .NET Framework je skupina technologií, zahrnující řadu jazyků, zejména pak C#, C++ (managed), Visual Basic, které jsou překládány do mezijazyku Intermediate Language (IL - obdoba Java Byte Code) a při spuštění jsou technologií JIT (just in time), překládány do strojového kódu daného počítače. Díky tomu mohou různé programovací jazyky sdílet stejné knihovny, a to dokonce na různých platformách.
Mezi nejvýznamnější části patří jazyk C# (z hudební terminologie cis) a sada knihoven pro nejrůznější účely - od práce se soubory, regulárními výrazy, přes zpracování XML, až po přístup k databázím a webovým službám. Jazyk C# patří do kategorie tzv. moderních jazyků, obsahuje garbage collector (stejně jak všechny jazyky v rámci .NET), což znamená, že se programátor nemusí starat o řádnou alokaci a dealokaci paměti. Syntakticky je velmi podobný jazyku Java společnosti Sun Microsystems. Obsahuje některá "vylepšení", jako autoboxing, konstrukci foreach - pro iterování nad kolekcemi, možnost přetěžovat operátory, vlastnosti objektů (properties) a další. Jako zajímavost musím uvést, že spoustu těchto vlastností má i nová verze Javy - 1.5. Dochází tak k situaci, kdy nejdřív Microsoft "opisoval" od Sunu a nyní Sun od Microsoftu.
Nejlepší je originál
První zajímavou implementací, kterou je nutné zmínit, je originální port (Common Language Infrastructure) na FreeBSD a MacOS X, který je dostupný na MSDN. Dostupné jsou i zdrojové kódy pod Shared Source licencí, která umožňuje pouze do zdrojových kódů nahlédnout, nikoliv však je modifikovat, natož pak distribuovat.
Mono
Druhou významnou implementací je projekt Mono, původně vyvíjený společností Ximian, kterou nedávno převzal Novell. Tento projekt si klade za cíl implementovat všechny klíčové komponenty technologie MS .NET, které jsou součástí standardu ECMA - překladač jazyka C#, runtime s podporou JIT, ale i těch, které nejsou standardizované (např. ASP.NET), což je dost kontroverzní krok vzhledem k tomu, že existuje určité riziko neočekávaných modifikací ze strany Microsoftu, nebo dokonce patentových sporů (na území Spojených států).
Projekt již dosáhl první stabilní verze 1.0. Překladač (mcs) je napsán v C#, díky tomu, je možné jej provozovat na libovolné platformě (x86, s390, SPARC, HPPA, StrongARM a PowerPC s operačními systéemy GNU/Linux, FreeBSD, popř. Windows), pro kterou existuje třeba jen interpretr IL (mint, ilrun), případně i vhodný runtime s podporou JIT. To, že je překladač napsán v C#, nepřináší jen filozofický problém, co bylo dřív, jestli vejce, nebo slepice, ale taky velmi nepříjemně zvýšenou dobou kompilace. JIT funguje dobře na platformě - i386, v poslední době ale došlo k významnému pokroku i na jiných platformách.
Kód generovaný překladačem je plně přenositelný a spustitelný i v jiných prostředích než jen v Monu. U knihoven je bohužel situace o malinko horší, protože místy se implementace rozchází s knihovnami Microsoftu, obvykle se jedná o extrémní případy, které nejsou nikde specifikovány a vývojáři si je v obou případech vyřešili po svém. Jedná se třeba o různé zpracování konce řádků. Takovéto triviální problémy pak dokáží aplikaci odladěnou na jedné platformně diskvalifikovat pro použití na platformně druhé. Doufejme, že se situace v budoucnu zlepší, jako referenční pak bude asi vždy brána implementace společnosti Microsoft.
Dalším problémem jsou knihovny třetích stran, jejichž autoři si docela často neuvědomují, že existují i jiné operační systémy a používají platformně závislé věci. Zde však, je nutné zmínit, že tento stav je hlavně dán výchovou programátorů. Otázkou však zůstává, jestli cílenou nebo ne. Samostatnou kapitolou pak je, knihovna Windows.Forms, o které se zmíním o něco později.
Mono obsahuje dvě docela zajímavé rozšíření. Prvním je implementace některých vlastností z C# 2.0, zejména se jedná o podporu generických typů, kterou zatím má zatím pouze Mono. Další zajímavostí, je možnost začlenit runtime, do aplikací napsaných v jazyce C, a tím jednoduše rozšířit aplikace o řadu nových schopností, počínaje "jednoduchým skriptováním" a konče psaním celých částí v managed kódu. Proto je zvažován jazyk C#, jako budoucí hlavní jazyk desktopového prostředí GNOME (verze 3 nebo spíše 4). Není divu - hlavní vývojář projektu Mono, Miguel de Icaza, stojí také za projektem GNOME.
Na druhou stranu Mono nepodporuje jednu z docela žádaných vlastností - generování dokumentace ze zdrojového kódu. Vývojáři to vysvětlují tím, že oinline dokumentace se neumí pořádně vypořádat s komentáři ve více jazycích, a proto používají vlastní systém - monodoc.
DotGNU, Portable .NET
Jako odpověď GNU na iniciativu .NET, vznikl "meta" projekt dotGNU, který má za cíl zabránit další monopolizaci trhu ze strany Microsoftu. Nejvýznamnější projekt spadající pod dotGNU je Portable .NET australské firmy Southern Storm, který implementuje překladač, runtime i knihovny. Sice za společností nestojí žádný velký gigant typu Novell, jako v případě Mona, nicméně tento projekt dosáhl verze 0.6.8 a je překvapivě živý a použitelný.
Velký důraz, jak z názvu vyplývá, je kladen na přenositelnost. Portable .NET je dostupný pro následující platformy (operační systémy - GNU/Linux, Windows, Solaris, NetBSD, FreeBSD a MacOS X, procesory - x86, PowerPC, ARM, Sparc, PARISC, s390, Alpha a IA-64). Překladač je napsán v ANSI C, což kromě zmíněné dobré přenositelnosti zaručuje i výrazně kratší (až 10x) dobu překladu než v případě Mona. Runtime (ilrun) zatím má podporu JIT v počáteční verzi (0.0.4), jedinou výraznější optimalizací je běh pomocí tzv. Converted Virtual Machine (zjednodušení IL) a proti Monu docela zaostává, to ale nebrání kompilovat program pomocí Portable .NET a spouštět jej v Monu. S podporou knihoven je to o něco horší než v případě Mona, ale ne výrazně. Je nutné podotknout, že část knihoven, je přebrána právě z Mona. Portable .NET ale není jen parazit na projektu Mono, kromě rychlejšího překladače přináší třeba nástroj pro extrakci dokumentace ze zdrojového kódu a následný převod do dalších formátů, včetně HTML nebo TeXInfo.
Windows.Forms
Jedním z nejkritičtějších míst při portování Microsoft .NET Framework jsou knihovny Windows.Forms, které jsou velmi významně svázány s prostředím Microsoft Windows. Existuje několik přístupů, jak se s tím vyrovnat.
Použít přímo Windows API - v prostředí MS Windows to jde velmi snadno a pro většinu ostatních existuje nezávislá implementace v podobě Wine (resp. Winelib). Tohoto přístupu se chytli v případě Mona, v současnosti se moc o použitelnosti a přenositelnosti nedá mluvit. Úplná implementace je plánovaná až pro verzi 1.2.
Druhý přístup je místo Windows.Forms použít stávající toolkit s propojením na C# (např. Gtk# nebo Qt#), toto je asi nejpopulárnější způsob, který používají programátoři v Portable .NET i v Monu. Na druhou stranu tyto knihovny nejsou slučitelné s Windows.Forms.
Třetí přístup, který je použit v Portable .NET, je naprogramovat celý toolkit, od začátku. Tato nevděčná práce přináší však své ovoce hlavně v oblasti přenositelnosti, proto můžete aplikaci napsanou v pod GNU/Linuxem bez problémů spustit pod MacOS X, nebo dokonce ve Windows pod "originálním" runtimem. Musím však upozornit, že aplikace napsané s použitím Windows.Forms z Portable .NET nejdou zatím spustit pomocí runtimu z Mona.
Vývojové prostředí
Jedním z hlavních lákadel Microsoftu pro přechod programátorů k .NET Frameworku je i jeho Visual Studio, což je léty prověřený vývojový nástroj. V GNU/Linuxu a na jiných operačních systémech nyní neexistuje žádná plnohodnotná náhrada. Pro vývoj v jazyce C#, je možné použít standardní editory Vim nebo Emacs, ty však neposkytují dostatečný komfort. Pro sestavovaní existuje dokonce obdoba velmi oblíbeného nástroje pro Javu - Ant v podobě Nant. Na menších projektech můžete vystačit dokonce s klasickým Make.
Jako do budoucna významný projekt se začíná jevit MonoDevelop (nyní ve verzi 0.5 - založený na SharpDevelop a knihovnách Gtk#), který už podporuje řadu základních vlastností včetně ladění, ale pořáad nedosahuje kvalit, na které jsou dnes již programátoři zvyklí.
Shrnutí
Pokud z nějakého rozumného důvodu potřebujete používat Microsoft .NET Framework na GNU/Linuxu, jsou Mono i Portable .NET docela důstojní soupeři originálnímu řešení. Je však nutné upozornit, že pro provoz na jiném prostředí s jinými knihovnami, je potřeba aplikaci řádně odladit a důsledně vybrat, které řešení je lepší. Mono má díky JIT skvělý výkon, Portable .NET zase lepší Windows.Forms. Situace se však může změnit s příchodem Mono 1.2. Vývoj u obou projektů je stále velmi bouřlivý a těžko předvídatelný.