Программирование в Linux. Часть четвертая. .NET в Linux

Все наслышаны о своеобразии армейского юмора. Зачем в анекдотах (а порой и в жизни) солдат заставляют чистить унитаз зубной щеткой и подметать аэродром ломом? Чтобы солдат заколебался. Почему до сих пор многие пишут прикладной несистемный софт на С++ или даже на С? А между тем, уже давно есть инструмент более подходящий для прикладного программиста — .NET.

В среде Windows технология .NET давно заняла прочные позиции и уже уверенно теснит классические WinAPI, COM и т.д. Одно из объяснений популярности .NET в том, что эта платформа помогает разрабатывать приложения за меньшее время и меньшими силами. Да и, чего уж греха таить: опыта .NET-программисту тоже нужно значительно меньше. Для того чтобы написать распределенное .NET-приложение, уже совсем не обязательно фанатично владеть сокетами транспортного уровня или DCOM, а для доступа к базе данных не нужно знать тонкостей ODBC, DAO, RDO или ADO; кроме того, платформа .NET прощает практически все ошибки начинающих включая выход за пределы массива и утечку памяти.

Конечно, такая технология не могла обойти Linux. Все дело в том, что Microsoft для более широкого распространения .NET зарегистрировала свою платформу как стандарт (ECMA 334 и 335), и, таким образом, у сторонних разработчиков появился шанс сделать свою альтернативную свободную версию .NET. Имена этих разработчиков, дерзнувших бросить вызов аж целой корпорации Microsoft — Miguel de Icaza, Paolo Molaro и Dietmar Maurer, а созданная ими по стандартам .NET платформа называется Mono. Надо сказать, сообщество OpenSource широко поддержало идею создания свободной .NET- реализации для Unix- и Unix-like-систем, и ее разработка идет достаточно бурно. Главные силы разработчиков Mono брошены на реализацию грамотно оптимизированного движка для just-in-time-компиляции, а также библиотек классов для поддержки технологий ASP.NET WebForms, WebServices, ADO.NET, Windows.Forms плюс специфических Mono-, Unix- и Gnome-библиотек. За несколько лет, потраченных на разработку Mono, платформа сильно "повзрослела" и уже пригодна к использованию. Как показатель: на Западе уже вышло несколько печатных книг по Mono, а всем известная фирма Novell позиционирует MonoDevelop чуть ли не как главную среду разработки для своего дистрибутива — SUSE Linux. Тем не менее, популярность Mono среди линуксоидов не так велика — нет разъяснительной работы, как сказали бы лет 30 назад. Зачастую технологии .NET приписывают недостатки других похожих платформ (например, Java), при этом даже не удосужившись хотя бы прочитать ее описание. Поэтому в двух словах о грехах, в которых .NET неповинна. Во-первых, несмотря на то, что .NET — виртуальная машина, это не интерпретатор, как Java. Байт-код программы не интерпретируется, а компилируется в настоящий процессорный код, причем только один раз. То есть, к примеру, циклы в .NET будут выполняться с той же скоростью, что и в C. Во-вторых, сборщик мусора работает достаточно быстро. Например, в .NET от Microsoft сборка мусора в поколении 0 (локальные переменные и служебные объекты, время жизни которых очень мало) происходит с той же скоростью, что и обработка обычной страничной ошибки памяти. В Mono, правда, все не так идеально, но разница сильно не ощущается. И в-третьих, .NET вполне способен корректно взаимодействовать с существующим кодом.

Теперь, чтобы убедить вас в преимуществах C# и Mono перед классическим C++ в разработке пользовательских утилит, я покажу, насколько это просто делается, и расскажу об основных отличиях Microsoft .NET и Mono. Для начала нужно раздобыть Mono. Версии этой платформы в дистрибутивах Linux сильно устаревшие. Например, в SUSE 9.3 поставляется Mono 1.1.4, в то время как уже готов релиз 1.1.8.3. Поэтому советую зайти на сайт и скачать последнюю версию дистрибутива Mono, которая занимает около 50 Мб. Устанавливать Mono лучше в текстовом режиме на случай ошибки графики (бывали прецеденты), и, естественно, под root'ом:

#./mono-1.1.8.3_0-installer.bin –mode text –prefix /usr/

Если у вас уже есть опыт программирования под .NET для Windows, то сообщу хорошую новость: сильно переучиваться не придется. А если переходить на альтернативные технологии совсем уж не хочется — то и не обязательно. Простой пример: в Mono есть поддержка даже пространства имен System.Windows.Forms, что позволяет писать .NET-приложения с интерфейсом пользователя как в Windows. Правда, нормально такое приложение будет работать тоже — только под Windows, потому что в Linux библиотека Windows.Forms написана поверху wineLIB (Wine — эмулятор Windows в Unix- и Unix- like-системах. Вместе с некоторыми дополнениями он неплохо запускает 3D'шные игрушки). Мои тесты в "полевых" условиях показали: не слишком навороченные приложения Windows.Forms, скомпилированные в Mono, работают одинаково хорошо как в Linux в Mono, так и в Windows в MS .NET. Некоторые нарекания вызывает пока компонент TextBox — его, кстати, сейчас очень активно дорабатывают. Вторая хорошая новость: если вы уж слишком привыкли к Microsoft Visual Studio .NET, то вам будет приятно узнать, что IDE есть и для Mono — MonoDevelop.

MonoDevelop во многом настолько похож на Visual Studio .NET, что даже возникают мысли о плагиате. Посудите сами: в MonoDevelop все как в Visual Studio .NET начиная от интерфейса и структуры каталогов и заканчивая ошибками самой вижуалки. Если вам приходилось плотно работать с Visual Studio .NET, вы наверняка знаете о строчке [assembly: AssemblyVersion("1.0.*")] в файле AssemblyInfo.cs — ее в каждом новом проекте приходится поправлять руками так, чтобы компилятор автоматически не наращивал номер билда, т.к. перестанут работать ссылки на эту сборку. И эта строчка в наилучшем виде тоже присутствует в аналогичном файле MonoDevelop'а. Список поддерживаемых языков у MonoDevelop'а чуть шире, чем ожидалось. Кроме ставших уже классическими C#, VB.NET, Java и ILAsm, присутствуют еще две вариации на тему "а не написать ли нам свой язык вроде C#, заодно ILAsm выучим": Boo и Nemerle. Список дополнительных библиотек тоже шире, чем у Visual Studio.NET, если, конечно, не учитывать, что в некоторых стандартных для .NET библиотеках в Mono все еще много "заглушек" и обещаний все доделать. Зато "в нагрузку" к стандартам добавили дополнительные библиотеки Mono для работы с XML, библиотеки математики, алгоритмов аутентификации и криптографии. Вместо чуждых Windows.Forms есть альтернативные библиотеки Gnome: графические компоненты Gtk#, графический движок Gdk и Art на замену GDI+ и еще кое-какие примочки для совместимости с Gnome. Движок для компонента webbrowser'а, естественно, от Mozilla (Gecko). А Novell расщедрилась на поддержку аж целой LDAP, что наверняка непосильным грузом легло на бюджет этого IT-гиганта. Соответствующая реклама по поводу библиотек Novell по всем правилам хорошего бизнеса лежит на сайт кроме того, по этой же тематике организованы платные интернет-курсы, тренинги и семинары:-). Лично для меня пределом мечтаний было узнать, что в Mono уже должным образом работают технологии .NET Remoting (технология работы с распределенными объектами), ADO.NET (доступ к базам данных) и ASP.NET (web-сервисы). Мои впечатления: очень даже юзабильно! Тесты показали, что .NET Remoting работает так же как и в Microsoft .NET(!); ADO.NET поддерживает широкий набор баз данных (Firebird Interbase, IBM DB2, MS SQL, ODBC, SQL Lite, Oracle, MySQl, PostgreSQL, Sybase и др.) и тоже нареканий не вызвал, если не считать того, что мой MySQL 4.1.10a оказался для Mono слишком старым. А ASP.NET прекрасен в своей новой ипостаси и обладает тем же функционалом, что его Microsoft'овский близнец за исключением специфических Win32-вызовов. К слову, ASP.NET особо "заточен" под XSP (легковесный web-server, написанный на C# и идеально работающий даже под MS .NET) и Apache.

Теперь, чтобы не быть голословным, приведу пример разработки простого Mono-приложения с пользовательским интерфейсом. Вместе с Mono для разработки интерфейсов лучше использовать дизайнер Glade — так будет быстрее. Итак, создаем в MonoDevelop новый C#-проект с поддержкой Glade# 2.0 — назовем его test. После того, как мастер solution'ов завершит работу, проект вполне готов и может быть запущен кнопкой F5. Теперь запустим Glade, откроем в нем форму проекта test.glade и вставим туда компоненты GtkFixed, GtkButton и GtkEntry.

Библиотека Gtk, впрочем, как и Qt, немного отличается от стандартных графических компонентов Windows. Одно из таких отличий состоит в использовании специальных невизуальных компонентов — выравнивателей (layout). Их задача — выстроить дочерние объекты в указанных пропорциях. То есть интерфейс будет автоматически подгонять все свои пропорции под изменяющиеся размеры. Если такое поведение интерфейса не годится, то используют фиксированный выравниватель — GtkFixed — который не тронет дочерних компонентов и будет вести себя так, будто его нет и вовсе. А поскольку в Gtk совсем без выравнивателя дочерних компонентов в окно не вставить, то в примере я предложил именно GtkFixed. Что до GtkButton и GtkEntry — эти компоненты ни у кого не вызовут вопросов. Давайте теперь создадим обработчик события clicked для кнопки. Для этого в дизайнере Glade в окне свойств нужно выбрать вкладку Сигналы и в поле Сигнал, воспользовавшись кнопкой обзора, выбрать clicked. В поле Обработчик появится имя будущего метода — on_button1_clicked. Нажмите кнопку Добавить и сохраните проект. Осталось написать код для этого обработчика:

[Glade.WidgetAttribute]
Gtk.Entry entry1;

private void on_button1_clicked (object sender, EventArgs a)
{
entry1.Text = "Hello, World!";
}

Работает все следующим образом. Созданный нами пользовательский интерфейс Glade сохранил в формате XML, а объект Glade.XML в конструкторе нашего класса загрузил его и проинициализировал. Единственное — для того, чтобы сделать доступными объекты окна, нужно их объявить как члены класса с атрибутом [Glade.WidgetAttribute], именем и типом, как они были в Glade. Обработчики событий тоже подгружаются автоматически, так что достаточно только написать их в стандартном виде с именем, которое было присвоено в дизайнере.

Пример для ASP.NET еще проще. Чтобы захостить любую ASP.NET-страницу, нужно просто запустить xsp в каталоге, где она находится. Если нужна вся мощь Apache — то к вашим услугам mod_mono — правда, с ним придется повозиться.

Теперь о недостатках. Один такой действительно имеется: дебагер mdb. Он выполнен в стиле gdb, и работать с ним просто отвратительно, количество фатальных ошибок в mdb тоже слишком велико.

Выводы. Mono — достаточно зрелая реализация .NET и пригодна к разработке пользовательских приложений и web-сервисов. Поддерживает практически все технологии, поддерживаемые MS .NET, кроме Windows.Forms — здесь поддержка частична и зависит от платформы. Зато на высоте оказались .NET Remoting, ADO.NET и ASP.NET. Благодаря интегрированной среде разработки использовать Mono действительно удобно. Приложения пишутся быстро и в более-менее привычном для Windows-программиста стиле. Mono активно поддерживается компанией Novell, что гарантирует ее дальнейшее развитие. И самое главное: Mono — свободная разработка, распространяется под лицензией GPL и, значит, со временем обязательно станет в Linux такой же привычной штукой, как Java. По моей личной шкале крутости, где 10 баллов — потолок, Mono заслужила "девятку" (подвел дебагер). Microsoft .NET я бы присудил "десятку", если бы не космическая стоимость Visual Studio .NET и еще более космические штрафы за ее нелегальное использование в коммерческих целях.

Дмитрий Бушенко, nop@list.ru


Компьютерная газета. Статья была опубликована в номере 31 за 2005 год в рубрике soft :: ос

©1997-2020 Компьютерная газета