# Mono (projeto)

Mono é um projecto liderado pela Novell (anteriormente pela Ximian) para criar um conjunto de ferramentas compatível com a plataforma .NET, conforme às normas Ecma, incluindo, entre outras, um compilador C# e um CLR. O Mono pode ser executado nos sistemas operativos Linux, BSD, UNIX, Mac OS X, Solaris e Windows.
A Microsoft tem uma versão do. NET 2.0 disponível apenas para Windows XP, denominada de Shared Source Common Language Infrastructure (SSCLI). A licença da Microsoft Shared Source pode ser insuficiente para as necessidades da comunidade (que proíbe explicitamente o uso comercial). O projecto Mono tem muitos dos mesmos objectivos do projecto Portable.NET, mas o DotGNU é executado pela Free Software Foundation.

## História

Miguel de Icaza ficou interessado na tecnologia .NET, assim que os documentos .NET foram publicados, em dezembro de 2000. Depois de olhar para o interpretador do bytecode, ele percebeu que não havia especificações para os metadados. Em fevereiro de 2001, Icaza pediu a informação em falta no formato de arquivo metadados (metadata) nos mailing lists .NET e, ao mesmo tempo, começou a trabalhar num compilador C# escrito em C#, como um exercício em C#. Em abril de 2001, ECMA publicou o formato de ficheiro em falta e, em GUADEC (6 de abril – 8 de abril de 2001), Icaza mostrou as características de seu compilador (que até então era capaz de se analisar gramaticalmente).
Internamente na Ximian, houve muita discussão sobre a construção de ferramentas para aumentar a produtividade: tornando possível criar mais aplicações em menos tempo e, consequentemente, reduzir o tempo e o custo de desenvolvimento. Após um estudo de viabilidade, que tornou claro que era possível construir a tecnologia, Ximian recolocou pessoal de outros projetos e criou a equipe do Mono. Por falta de recursos próprios para construir uma plataforma .NET alternativa, eles formaram o projecto Mono open source, que foi anunciado no dia 19 de julho de 2001 na conferência O'Reilly.
Quase três anos mais tarde, em 30 de junho de 2004, o Mono 1.0 foi lançado.
O logótipo do Mono é a face de um macaco, sendo mono, macaco em espanhol. O nome diz respeito a macacos e símios, que são um tema central dentro da Ximian, como o logótipo do projecto GNOME (uma pegada de macaco), o projecto Bonobo (bonobo é uma espécie relacionada com chimpanzés), o projecto Novell Evolution (antigo Ximian Evolution), bem como o logótipo Ximian em si (a silhueta de um macaco). As FAQ’s do Mono afirmam que a origem do nome é "Gostamos de macacos".

## Estado actual e plano de evolução

A versão actual do Mono é a 2.2 (a partir de 13 de janeiro de 2009). Esta versão oferece o núcleo API (Application Programming Interface) da plataforma .NET, bem como suporte para o Visual Basic.NET e C# versões 2.0 e (parcialmente) 3.0. LINQ para objectos e para XML fazem parte da distribuição, mas não LINQ para SQL. C # 3.0 é agora o modo padrão de funcionamento para o compilador C#. O Windows Forms 2.0 é também suportado agora.
A implementação da plataforma .NET 3.0 está em desenvolvimento sob um subprojecto Mono experimental chamado "Olive", mas a disponibilidade de uma plataforma Mono que apoie o .NET 3.0 ainda não está planeado.
Uma aplicação de código aberto (open source) de Silverlight, chamada Moonlight, está actualmente em curso, tendo sido incorporada desde o Mono 1.9. Moonlight 1.0, que suporta o Silverlight 1,0 APIs, foi lançada em 20 de Janeiro de 2009. O lançamento do Moonlight 2.0 alpha, que irá apoiar o conteúdo do Silverlight 2.0 está previsto para Junho de 2009

## Componentes do Mono

O Mono é composto por três grupos de componentes:
* Componentes centrais
* Pilha de desenvolvimento Mono / Linux / GNOME
* Pilha de compatibilidade Microsoft
Os componentes core incluem o compilador C#, a máquina virtual e a biblioteca base de classes. Esses componentes são baseados nas normas Ecma-334 e Ecma-335, permitindo que o Mono forneça máquinas virtuais normalizadas, livres e de CLI open source.
A stack de desenvolvimento Mono / Linux / GNOME fornece ferramentas para desenvolvimento de aplicações. Estes incluem: Gtk# para o desenvolvimento da GUI, bibliotecas do Mozilla para trabalhar com o Gecko (layout engine), bibliotecas de integração ao Unix, bibliotecas de conectividade a bases de dados, uma stack de segurança, e a linguagem XML Schema RelaxNG. Gtk# permite que as aplicações Mono se possam integrar no ambiente de trabalho do Gnome como aplicações nativas. As bibliotecas de bases de dados fornecem conectividade para MySQL, SQLite, PostgreSQL, Firebird, Open Database Connectivity (ODBC), Microsoft SQL Server (MSSQL), Oracle, o objecto relacional de bases de dados db4o, entre outros. O projecto Mono traça o desenvolvimento de componentes de bases de dados no seu website.
A stack de compatibilidade Microsoft fornece uma via para a portabilidade de aplicações Windows. NET para Linux. Este grupo de componentes inclui ADO.NET, ASP.NET, e Windows.Forms, entre outros. Como estes componentes não são abrangidos pelas normas ECMA, alguns deles continuam a estar sujeitos a receios e preocupações de direitos.

## Arquitectura do framework
### Motor Just-in-time

O runtime do Mono contém um motor de compilação just-in-time (JIT) para um número de processadores: x86, SPARC, PowerPC, ARM, S390 (em 32-bit e 64-bit mode), e x86_64, IA64 e SPARC para 64-bit modes. O runtime irá realizar uma compilação just-in-time para o código nativo da máquina que está em cache quando a aplicação é executada. Também é possível fazer pré-cache da imagem nativa antes da execução. Para outros sistemas suportados que não constam da lista, um intérprete executa cada byte code um por um sem compilar a imagem para o código nativo. Em quase todas as condições o método JIT irá melhorar o desempenho do método de interpretação.
No entanto, o tradicional garbage collector (gestão automática de memória) apresenta uma séria desvantagem em relação ao garbage collected runtimes comercial, como o Java Virtual Machine ou o runtime da plataforma .NET. Existe uma possibilidade teórica de correr em memory leaks que pode até resultar num fim abrupto de um pedido de execução de uma aplicação devido a uma condição out-of-memory. Isto é especialmente uma grande preocupação para aplicações de servidor destinadas a serem executadas por um longo período de tempo. O desenvolvimento de um garbage collector moderno está em curso (chamado "Simple Generational GC"), mas uma data para o incorporar num lançamento de uma produção parece não ter sido ainda definido.

### Biblioteca de classes

A biblioteca de classes oferece um conjunto compreensível de facilidades para o desenvolvimento de aplicações. Elas são essencialmente escritas em C#, mas devido à Common Language Specification podem ser utilizadas por qualquer linguagem .NET. A biblioteca de classe é estruturada em namespaces, e organizadas em bibliotecas partilhadas conhecidas como assemblies.

#### Namespaces e assemblies

Namespaces são um mecanismo para agrupar logicamente classes semelhantes numa estrutura hierárquica. Isso previne conflitos entre nomes. A estrutura é implementada utilizando palavras separadas por ponto, onde os namespaces mais comuns de alto nível são System, tais como o System.IO e System.Net (uma lista completa pode ser encontrada em Documentação Mono). Existem outros namespaces de alto nível, tais como Accessibility e Windows. Um utilizador pode definir um namespace, colocando elementos dentro de um namespace block.
Assemblies são bibliotecas partilhadas da biblioteca de classes. Estes são ficheiros .dll, tal como bibliotecas partilhadas Win32. Exemplos de assemblies são mscorlib.dll, System.dll, System.Data.dll e Accessibility.dll. Namespaces são frequentemente distribuídos por vários assemblies e um assembly pode ser constituído por vários ficheiros.

### Common Language Infrastructure e Common Language Specification

O Common Language Infrastructure (CLI), ou, mais comummente conhecido como o Common Language Runtime, é implementada pelo executável Mono. O runtime é usado para executar aplicações compiladas .NET. A linguagem comum das infra-estruturas é definida pela norma ECMA-335. Para executar uma aplicação, deve-se invocar o runtime com os parâmetros relevantes. A Common Language Specification (CLS) é especificada no capítulo 6 da ECMA-335 e define a interface para o CLI. O compilador Mono gera uma imagem que vai de encontro à CLS. Esta é a Common Intermediate Language. O runtime Mono pega nessa imagem e executa-a. As normas ECMA definem formalmente uma biblioteca que se encontra em conformidade com a CLS como uma framework.

### Código gerido e não gerido

Dentro de um pedido .NET/Mono nativo, todo o código é gerido, ou seja, é gerido pelo estilo de gestão de memória e do fio de segurança do CLI. Outras aplicações .NET ou Mono podem utilizar código já existente, que é designado por não gerido, utilizando as bibliotecas System.Runtime.InteropServices para criar ligações em C#. Muitas bibliotecas que vêm com o Mono usam esta funcionalidade do CLI, como o Gtk#.

### Projectos relacionados

Existem vários projectos relacionados com o Mono, que aumentam as potencialidades do Mono e permitem aos programadores usarem o Mono no seu ambiente de desenvolvimento. Estes projectos incluem:
* Cocoa# relações em torno do conjunto de ferramentas do nativo do Mac OS X (Cocoa).
* Gecko#, colecções para armazenar o esquema de arranque utilizado no Mozilla (Gecko).
* Gtk#, C# relações subjacentes ao GTK+ e bibliotecas GNOME, escritas em C.
* Tao, uma colecção de gráficos e jogos ligados (OpenGL, SDL, Glut, Cg).
* A ferramenta Mono Migration Analyzer (MoMA).

## MonoDevelop: o Mono IDE

O MonoDevelop é um ambiente GNOME livre e integrado de desenvolvimento concebido essencialmente para C# e outras linguagens .NET tais como Nemerle, Boo, e Java (via IKVM.NET). O MonoDevelop era inicialmente uma conversão do SharpDevelop para Gtk#, mas, desde então, tem evoluido para atender às necessidades dos programadores Mono. O IDE inclui uma classe de gestão, ajuda built-in, code completion, Stetic (um designer GUI), suporte ao projecto, e um compilador integrado. O navegador MonoDoc permite o acesso a documentação API e a exemplos de código. A documentação do navegador usa um estilo wiki de gestão de conteúdo, permitindo aos programadores editar e melhorar a documentação.

## Licença

O Mono é duplamente licenciado pela Novell, semelhante a outros produtos, tais como o Qt e o Mozilla Application Suite. O compilador C# e as ferramentas do Mono estão a ser lançadas sob a licença GNU General Public License (apenas GPLv2) (começando com a versão 2.0 do Mono, o código-fonte do compilador C# do Mono estará também disponível sob a licença MIT X11), as bibliotecas do runtime com a licença GNU Lesser General Public License (LGPLv2 apenas) e as bibliotecas de classes sob a licença MIT. Estes são todos softwares livres e de licenças de código-fonte aberto e, consequentemente, o Mono é também livre e um software de código aberto.

## Mono e patentes da Microsoft

A implementação no Mono dos componentes da stack do .NET não submetidos à norma de standard ECMA tem sido a fonte de preocupações no que diz respeito à vida do projecto devido à violação desta patente. Em particular, o debate teve lugar sobre se o Microsoft poderia destruir o projecto Mono devido à sua posse das patentes.
As tecnologias de base apresentadas ao ECMA, e, portanto, também partes específicas do Unix / GNOME, podem não ser problemáticas. Essencialmente, as preocupações dizem respeito às tecnologias assentes na Framework .NET desenvolvidas pela Microsoft, tais como ASP.NET, ADO.NET e Windows Forms, ou seja, partes que constituem a compatibilidade da stack Windows com o Mono. Estas tecnologias, actualmente não estão totalmente implementadas no Mono, mas também não são necessárias para o desenvolvimento de aplicações Mono. Richard Stallman afirmou que a utilização do Mono pode ser "perigosa" por causa da possível ameaça das patentes da Microsoft. No dia 2 de Novembro de 2006, a Microsoft e a Novell anunciaram um acordo comum no qual a Microsoft concordou em não processar os clientes da Novell devido à violação da patente. De acordo com o líder do projecto Mono - Miguel de Icaza - este acordo estende-se apenas a programadores e clientes da Novell. Foi criticado por alguns membros da comunidade de software livre porque assim viola os princípios de igualdade de direitos para todos os utilizadores de um determinado programa (veja Novell and their Patent Agreement with Microsoft). Para mais informações sobre este tópico, consulte Patents and free software.

## Software desenvolvido com Mono

Programas que usam o Mono API e C #:
* Banshee – gestão de músicas e software de playback para o GNOME
* Beagle - é uma ferramenta de procura no desktop.
* Blam! - É um RSS - news aggregator, especialmente bom para a leitura de Planet-feeds tais como o Planet Gnome.
* Diva - aplicação para edição de vídeo para o GNOME.
* GNOME Do - aplicação no desktop que corre software (semelhante ao Quicksilver).
* F-Spot é um programa de gestão de fotografias.
* iFolder 3 (da Novell) - permite partilhar ficheiros entre vários computadores e com outros utilizadores através de peer-to-peer ou com um conjunto de produtos de servidor da Novell's.
* KeePass 2 - Gerenciador de senha de código aberto.
* libsecondlife é uma implementação open source do protocolo de rede do Second Life escrito em C # que será executado sob a plataforma Mono ou. NET.
* MonoDevelop é um IDE para criar aplicações Mono. Foi originalmente um porto de SharpDevelop para Gtk #, mas é hoje desenvolvida por sua própria conta. A instalação para Windows não é fornecida, mas pode ser construído e executado no Windows.
* Muine é um player de música com uma interface de utilizador desenhada para ser intuitiva, desenvolvido por Jorn Baayen que também trabalhou em Rhythmbox.
* Second Life, o mundo virtual criado pela Linden Lab, começou a oferecer a sua compilação Mono para Linden Scripting Language, em Agosto de 2008.
* Tomboy é uma aplicação de desktop note-taking que utiliza um sistema de ligação wiki-like.
* Unity é um motor de jogo que usa o Mono para o scripting do jogo.
* MonoTorrent (anteriormente denominado bitsharp) é uma biblioteca bittorrent escrita com Mono.
* My Animal Centre é um jogo da consola Wii construído sob a plataforma Mono.
* FusionFall é um jogo de vídeo animado, em rede, para as crianças e é construído sob a plataforma Mono.
* E um conjunto de jogos para o iPhone.