# Projecte Mono

Mono és el nom d'un projecte de codi obert impulsat per Novell per crear un grup d'eines lliures, basades en GNU/Linux i compatibles amb .NET segons l'especificat pel ECMA.
Mono posseïx importants components útils per a desenvolupar programari:
* Una màquina virtual de llenguatge comú d'infraestructura (CLI) que conté un carregador de classes, un compilador en temps d'execució (JIT), i unes rutines de recol·lecció de memòria.
* Una llibreria de classes que pot funcionar en qualsevol llenguatge que funcioni en el CLR (Common Language Runtime).
* Un compilador per al llenguatge C#, MonoBasic (la versió per a Mono de Visual Basic), Java i Python.
* El CLR i el Sistema de tipus comú (CTS) permet que l'aplicació i les llibreries siguin escrites en una àmplia varietat de llenguatges diferents que compilin per a "byte code".
* Això significa per exemple, que si defineixes una classe que faci una manipulació algebraica en C#, aquesta classe pot ser reutilitzada en qualsevol llenguatge que suporti el CLI. Pot crear una classe en C#, una subclasse en C++ i instanciar aquesta classe en un programa en Eiffel.
* Un sistema d'objectes únic, sistema de fils, llibreries de classes i sistema recol·lector de memòria poden ser compartits per tots aquests llenguatges.
* És un projecte independent de la plataforma. Actualment Mono funciona sobre Linux, FreeBSD, UNIX, MacOS X, Solaris i plataformes Windows.
Existeix un projecte similar, anomenat Portable.NET, que és part del projecte dotGNU.

## Història

Tan bon punt Microsoft publica els documents que parlen de l'arquitectura .NET al desembre de 2000, Miguel de Icaza (Co-fundador de l'empresa Ximian, fundador i president de la GNOME Foundation) comença a interessar-se en ells.
GNOME sempre havia lluitat per proporcionar facilitats al programador i una de les característiques més conegudes és que existeixen multitud de "bindings" (connectors) per a poder utilitzar qualsevol llenguatge per a desenvolupar aplicacions. Però l'elaboració de d'aquests connectors era tremendament laboriosa i cada vegada que es realitzava un canvi a la interfície original, era necessari canviar tots i cadascun dels connectors.
Per a intentar millorar i facilitar la reutilització del codi es va realitzar una implementació de components utilitzant CORBA dita Bonobo. Però tampoc va tenir èxit, ja que era necessari que tot el món utilitzés aquesta característica i això no va ser així. Per tant, amb .NET s'obre una nova porta per aconseguir fer de GNOME, en un futur, un escriptori millor i més atractiu. Tant per als usuaris com per als programadors. Amb aquesta tecnologia per fi s'aconsegueix el que el projecte GNOME sempre havia cercat, independència del llenguatge per a programar en aquest escriptori.
Miguel d'Icaza, després d'analitzar l'intèrpret del byte code, adverteix que no existeixen especificacions. Al febrer de 2001 comença a indagar per aquesta informació a les llistes de correu de .NET i al mateix temps comença a treballar en un compilador C# amb la cooperació amb Rhys Weatherley i Jay Freeman. El compilador també va ser programat en C# com un exercici per a demostrar la seva potència.
A l'abril de 2001, l'ECMA publica el format d'arxius que faltava i a la GUADEC (6 al 8 d'abril de 2001) Icaza demostra les habilitats del seu compilador. Després d'una minuciosa anàlisi, on clarament es conclou que és possible construir aquesta tecnologia, Ximian reasigna recursos humans d'altres projectes i crea l'equip Mono. Aspirant a tenir una eina que anés un substituint per complet la tecnologia .NET, van formar "The Mono Open Source Project", el qual va ser anunciat al juliol de 2001 a la conferència d'O’Reilly.
Van passar 3 anys fins que el 30 de juny de 2004 Mono 1.0 finalment va ser llançat.

## Components
### Biblioteques de classe

Les biblioteques de classe ens proporcionen un conjunt de facilitats que ajuden al desenvolupament d'aplicacions. Són escrites primerament en C#, però gràcies al llenguatge comú d'especificació (CLS), poden ser invocades en qualsevol altre llenguatge de .NET. Les biblioteques de classe estan estructurades en Namespaces i posades en producció en biblioteques compartides denominades Assemblies. Quan parlem del framework de .NET, ens estem referint primerament a les llibreries de classe.

### Namespaces i Assemblies

Els Namespaces són un mecanisme que permet agrupar lògicament classes similars en una estructura jeràrquica evitant conflictes de noms. L'estructura s'implementa utilitzant paraules separades per punts, on la paraula de primer nivell més comú és System, com System.IO o System.Net.
Els Assemblies són el paquet físic de les llibreries de classe. Són arxius .dll, com per exemple les llibreries de Windows. Exemples de llibreries són mscorlib.dll, System.dll, System.Data.dll.
Els Namespaces en general estan composts per molts assemblies i un assembly pot estar compost de diversos arxius.

### Llenguatge Comú d'Infraestructura (CLR)

El llenguatge comú d'infraestructura o més comunament anomenat Common Language Runtime (CLR) és implementat per l'executable de Mono. El runtime és utilitzat per executar aplicacions compilades en .NET. Aquest llenguatge comú d'infraestructura està definit en els estàndards ECMA i ECMA-335. Per a executar una aplicació s'haurà d'invocar el runtime amb els paràmetres adequats.

### Llenguatge Comú d'Especificació (CLS)

Es troba especificat a l'estàndard ECMA-335 i defineix la interfase amb el CLR. Per exemple, convencions sobre el tipus de dades que s'utilitzarà per implementar els enumerats. El compilador de Mono genera una imatge que compleix amb el CLS, aquesta imatge està codificada en el denominat Common Intermediate Language (CIL) o Llenguatge Intermedi Comú. El runtime de Mono pren aquesta imatge i l'executa.

## MonoDevelop: l'IDE de Mono

MonoDevelop és un Entorn Integrat de Desenvolupament lliure de dissenyat primordialment per a C# i altres llenguatges .NET com Nemerle, Boo, i Java (via IKVM.NET). MonoDevelop originalment va ser una adaptació de SharpDevelop para Gtk#, però des de llavors s'ha desenvolupat per a les necessitats dels desenvolupadors de Mono. L'IDE inclou organitzador de classes, ajuda incorporada, completació de codi, Stetic (dissenyador de GUI), suport per a projectes, i un depurador integrat.

## Mono i les patents de Microsoft

La implementació de Mono d'aquests components de .NET no sotmesos a ECMA per a la seva estandardització ha aixecat algunes preocupacions de la violació de patents.

## Programari creat amb Mono

Els programes següents fan servir l'API de Mono i C#.
* Banshee és un sistema de gestió i reproductor de música per GNOME
* Beagle és una eina de cerca.
* Blam! és un agregador de notícies RSS.
* Bless Arxivat 2005-11-01 a Wayback Machine. és un editor hexadecimal.
* CDCollect és un catalogador de CD's.
* Diva és una aplicació d'edició de video per GNOME.
* F-Spot és un sistema de gestió de fotografies.
* Galaxium és un client de missatgeria instantània per la xarxa Windows Live Messenger.
* GLyrics és un cercador de lletres de cançons.

## Distribucions que inclouen Mono

* Debian (Etch i superiors)
* Fedora Core 5 i superiors
* SuSE Linux Enterprise Desktop 10
* openSuSE 9.1 i superiors
* Ubuntu 5.10 (breezy) i superiors
* Mandriva 2007 i superiors
* PCLinuxOS (a través d'apt)
* Gentoo 2006.1 i superiors
* FreeBSD 4.7 i superiors
* Sabayon 2.65.1 i superiors
* Xandros 4.1 i superiors
* Arch Linux (actual)

## Vegeu també

* DotGNU - una altra implementació de Microsoft.NET.
* IronPython