Nie NET, a Mono

Udostępnienie przez Microsoft specyfikacji Common Language Infrastructure (która opisuje środowisko uruchomieniowe platformy .NET i definiuje kod pośredni dotnetowych aplikacji) oraz specyfikacji języka programowania C#, otworzyło drogę do niezależnej implementacji elementów platformy .NET. Jedną z takich implementacji jest wspierany przez firmę Novell projekt open source - Mono.

Udostępnienie przez Microsoft specyfikacji Common Language Infrastructure (która opisuje środowisko uruchomieniowe platformy .NET i definiuje kod pośredni dotnetowych aplikacji) oraz specyfikacji języka programowania C#, otworzyło drogę do niezależnej implementacji elementów platformy .NET. Jedną z takich implementacji jest wspierany przez firmę Novell projekt open source - Mono.

Aby właściwie zdefiniować Mono, trzeba najpierw dokładnie przyjrzeć się platformie .NET, a właściwie całej inicjatywie .NET firmy Microsoft. Trzeba wiedzieć, że platforma .NET jest tylko jednym z elementów inicjatywy, na którą składają się nowoczesne desktopowe systemy operacyjne (ze zintegrowanymi usługami typu Microsoft Passport), serwerowe systemy operacyjne oferujące usługi sieciowe (Web Services), środowisko do tworzenia aplikacji (Microsoft Visual Studio .NET) oraz nowoczesna koncepcja użytkowania oprogramowania na zasadzie subskrypcji usług.

W tym kontekście sama platforma .NET jest zaledwie zestawem technologii, które ułatwiają realizację inicjatywy .NET. Jednak koncepcja platformy .NET jako środowiska uruchomieniowego i ujednoliconego modelu programistycznego aplikacji tworzonych w różnych językach i działających na różnych platformach sprzętowych jest sama w sobie bardzo atrakcyjna.

Dlaczego? Po pierwsze, jest to kolejny krok w rozwoju technik programistycznych. Wychodząc od strukturalnych początków, przeszliśmy etap obiektowy, aby znaleźć się w erze rozproszonych komponentów, oferujących swoje usługi zdalnie dowolnym klientom (Service Oriented Architecture). Po drugie, zyskujemy możliwość dystrybuowania tej samej binarnej wersji aplikacji na wszystkie platformy. Po trzecie, model komponentowy, przestrzenie nazw i zaawansowana kontrola wersji aplikacji umożliwiają budowanie ogromnej uporządkowanej biblioteki funkcji. Stają się one automatycznie dostępne we wszystkich językach programowania, do których są kompilatory generujące kod pośredni platformy .NET.

Program skompilowany i uruchomiony za pomocą Mono w środowisku Windows. W systemie nie ma ani platformy .NET Framework, ani kompilatora języka C# zawartego w .NET Framework SDK.

Program skompilowany i uruchomiony za pomocą Mono w środowisku Windows. W systemie nie ma ani platformy .NET Framework, ani kompilatora języka C# zawartego w .NET Framework SDK.

W świecie linuksowo-uniksowym potrzeba unifikacji technik i narzędzi programistycznych oraz powszechna dostępność bibliotek już od dawna daje o sobie znać. Teraz za sprawą projektu Mono - niejako z pierwotnej inicjatywy Microsoftu - programowanie w Linuksie i Uniksie może się stać dużo łatwiejsze i znacznie przyjemniejsze. Celem projektu jest bowiem utworzenie niezależnego od platformy sprzętowej i systemu operacyjnego środowiska tworzenia i uruchamiania aplikacji, które pozwoli budować aplikacje z dużo większą niż dotychczas wydajnością i będzie dostępne na zasadach open source.

Najważniejszym elementem platformy .NET w systemie Windows jest bez wątpienia środowisko uruchomieniowe CLR (Common Language Runtime). Takie samo środowisko musi zostać zaimplementowane w innych systemach operacyjnych, aby potrafiły uruchamiać, rozprowadzane w postaci binarnej, programy skompilowane do kodu pośredniego CIL (Common Intermediate Language). Implementacja CLR w Linuksie była pierwszym z zadań projektu Mono. Drugim było przygotowanie kompilatora języka C#, zaprojektowanego przez Microsoft jako wzorcowy język do tworzenia aplikacji na platformę .NET. Oba te zadania zostały już w zadowalającym stopniu ukończone.

Mono oferuje obecnie środowisko uruchomieniowe, kompilator języka C# oraz bibliotekę klas, która zawiera odpowiedniki bibliotek Microsoftu realizujących dostęp do danych (ADO.NET) oraz umożliwiających tworzenie dynamicznych serwisów internetowych (ASP.NET). Do tworzenia i uruchamiania aplikacji ASP.NET w Mono przeznaczony jest serwer internetowy XSP, chociaż można też korzystać ze specjalnego modułu mod_mono, współpracującego z serwerem Apache 2. Zaawansowane prace trwają także nad kompilatorem języka MonoBASIC, który stanowi rozszerzoną wersję Visual Basic .NET.

Warto zwrócić uwagę, że zadaniem Mono jest nie tylko odwzorowanie platformy .NET, a przez to uzyskanie wspólnej platformy uruchomieniowej Windows i Linux/Unix. Biblioteka klas Mono jest rozbudowywana również o komponenty i funkcje niedostępne na platformie .NET Microsoftu, dlatego Mono z jednej strony staje się również samodzielną nowoczesną platformą programistyczną, a z drugiej - w pewnym sensie rozszerza platformę .NET. Jednym z takich rozszerzeń jest Gtk#, które pozwala aplikacjom dotnetowym korzystać z bibliotek Gtk+, używanych w systemach Windows i Unix do tworzenia graficznych interfejsów aplikacji.

Projekt Mono jest obecnie w fazie intensywnego rozwoju, więc nie wszystkie klasy dostępne w .NET Framework dostępne są w Mono. Na dodatek implementacja niektórych klas, dostępnych w Windows niemal automatycznie, w Linuksie wymaga dużo większego nakładu pracy. Przykładowo, aby umożliwić używanie Windows Forms w Linuksie, Mono wykorzystuje fragmenty projektu Wine - implementacji open source API systemu Windows. Nagrodą za dodatkową pracę przy integracji obu tych projektów jest duża kompatybilność implementacji Windows Forms w Mono z implementacją Windows Forms na platformie Windows. Dzięki temu w Linuksie możliwe będzie uruchamianie nawet takich aplikacji, które pomijają .NET Framework i odwołują się bezpośrednio do funkcji Win32 API.

Ten sam program skompilowany i uruchomiony w systemie Linux, przy czym kompilacja nie jest konieczna, ponieważ możemy równie dobrze uruchomić plik skompilowany wcześniej w systemie Windows.

Ten sam program skompilowany i uruchomiony w systemie Linux, przy czym kompilacja nie jest konieczna, ponieważ możemy równie dobrze uruchomić plik skompilowany wcześniej w systemie Windows.

Mono jako nowe środowisko programistyczne dla świata uniksowego może za sprawą Gtk# być już wykorzystywane do tworzenia aplikacji Gnome. ADO.NET w wersji Mono obsługuje oprócz komercyjnych systemów RDBMS również bazy danych PostgreSQL, MySQL i SQLite. Wokół Mono pojawia się też wiele projektów dodatkowych i wszystkie przyczyniają się do popularyzacji platformy. Wymienić można np. implementację technologii programowania rozproszonego CORBA i ICE, środowisko uruchomieniowe Javy działające na platformie Mono (IKVM) oraz środowisko programistyczne monodevelop.

Mono udostępniane jest na wiele sposobów, tj. w postaci kodu źródłowego, za pomocą programu Ximian Red Carpet, w postaci pakietów RPM do wybranych dystrybucji Linuksa (SUSE Enterprise Server 8 i 9, SUSE LINUX 9.0 i 9.1, Red Hat Linux 9, Fedora Core 1 i 2), w postaci automatycznego instalatora do Windows 2000 i nowszych oraz w wersji do Mac OS X.

Zgodność Mono z platformą .NET oraz dostępność narzędzi programistycznych w systemach Windows i Linux sprawia, że można już obecnie napisać aplikację w Windows i skompilować ją za pomocą .NET Framework SDK, a następnie uruchomić za pomocą Mono w Linuksie, albo odwrotnie - napisać i skompilować za pomocą Mono w Linuksie i uruchomić w Windows pod kontrolą .NET Framework. Można też, nie używając narzędzi Microsoftu, napisać program, który będziemy uruchamiać za pomocą Mono na obu platformach.

Aby zilustrować tę możliwość, napiszemy w Mono przykładową aplikację - program do prostego szyfrowania plików tekstowych za pomocą algorytmu ROT-13. Algorytm ten powoduje, że w 26-znakowym alfabecie łacińskim litery od A do M stają się literami od N do Z i odwrotnie, a pozostałe nie zmieniają się.

Otwieramy zatem dowolny edytor - może to być Notepad w Windows lub vi w Linuksie - tworzymy nowy pliki ROT13.cs i wpisujemy kod programu w języku C#.

using System;

using System.IO;

using System.Text;

class ROT13

{

static void Main(string[] args)

{

if (args.Length < 2) //sprawdzenie parametrów

{

Console.WriteLine("\n ROT13 [plik1] [plik2]\n");

return;

}

StreamReader Sr = null; //klasa czytająca z pliku

StreamWriter Sw = null; //klasa zapisująca do pliku

try

{

Sr = File.OpenText(args[0]); //otwieramy plik

Sw = File.CreateText(args[1]); //tworzymy plik

String Ln = Sr.ReadLine(); //czytamy pierwszy wiersz

while (Ln != null) //sprawdzamy, czy nie koniec pliku

{

//kopiujemy ciąg znaków do obiektu StringBuilder

StringBuilder Sb = new StringBuilder(Ln);

//pętla podmieniająca znaki

for (int i = 0; i < Sb.Length; i++)

{

if ((Sb[i] >= 'a') && (Sb[i] <= 'z'))

if (Sb[i] <= 'm')

Sb[i] = (char)((int)Sb[i] + 13);

else

Sb[i] = (char)((int)Sb[i] - 13);

else if ((Sb[i] >= 'A') && (Sb[i] <= 'Z'))

if (Sb[i] <= 'M')

Sb[i] = (char)((int)Sb[i] + 13);

else

Sb[i] = (char)((int)Sb[i] - 13);

}

Sw.WriteLine(Sb); //zapis wiersza do pliku

Ln = Sr.ReadLine(); //odczyt następnego wiersza

}

}

catch (Exception E) //informacja w razie błędu

{

Console.WriteLine("\n " + E.Message + "\n");

}

finally //na koniec zamykamy pliki

{

if (Sr != null) Sr.Close();

if (Sw != null) Sw.Close();

}

}

}

Kod programu wraz z opisem dostępny jest w miniprotalu programistycznym PCWK_PROG na naszej płycie.

Aby skompilować program za pomocą Mono w Windows, trzeba wpisać w wierszu poleceń mcs ROT13.cs, a następnie mono ROT13.exe plik1.txt plik2.txt, żeby uruchomić program. Dokładnie te same polecenia działają identycznie w Linuksie.


Zobacz również