Программирование на .NET в Linux
Часть 1. Обзор возможностей
В последние годы здорово набирает популярность новая технология программирования от Microsoft, названная .NET. И несмотря на то, что в ней нет ничего революционного по сравнению с другими технологиями (взять хоть бы те же Java, Ruby, Perl и пр.), все же это немалый шаг вперед. Неудивительно, что программистам всего мира так понравились новые возможности, предложенные Microsoft. Каждый, кто пишет программу, должен задать себе вопрос: чего он хочет? Применить все свои таланты, чтобы за огромные сроки написать на низкоуровневом языке красивый с точки зрения других программистов код или быстро разработать качественный продукт? Посмотрим правде в глаза: каким бы красивым ни был код, если он ничего толкового не делает или в нем пропала необходимость из-за задержек в разработке... ну, вы меня поняли:-).
Платформа .NET позволяет быстро разрабатывать приложения любой сложности. Среди программистов ходит байка, дескать, некто сравнивал работу на языках С, С++ и C# (.NET). И вышло, что при кодировании на С 30% времени уходило непосредственно на написание текста программы, а 70% — на отладку написанного. В C++ этот показатель был уже 50/50%, а в C# — 70/30%. Что ж, на мой взгляд, это истинная правда. Какое-то время только пользователи MS Windows имели возможность применять такую классную технологию, как .NET. Но Microsoft зарегистрировала свою платформу .NET как стандарт ECMA. Поэтому появилась возможность для сторонних разработчиков реализовать свою собственную платформу, совместимую с MS .NET. Мне известно по крайней мере о двух таких проектах: dotGNU и Mono. Оба разрабатываются сообществом OpenSource, и безусловным лидером среди них является Mono. Именно о Mono и пойдет речь в этой статье. Mono — это открыто разрабатываемая платформа .NET, спонсируемая Novell, UNIX-версия платформы разработки Microsoft .NET. Цель Mono — дать возможность UNIX-разработчикам писать кроссплатформенные приложения .NET. Идея свободной кроссплатформенной реализации .NET принадлежит хакеру Мигелю де Икаца (Miguel de Icaza), он же и выполнил основную часть работы по созданию framework'а. Ранее Мигель занимался разработкой ядра Linux, много сделал для GNOME. А еще, думаю, всем пользователям *nix-платформ известен его файл-менеджер Midnight Commander. Мигеля всегда беспокоила проблема повторного использования кода. В UNIX эта технология была не слишком распространена, и он попытался создать новое решение — компонентную архитектуру Bonobo на основе CORBA. Однако это решение, в чем-то напоминающее COM из MS Windows, было недостаточно эффективным (IMHO, оно устарело еще до своего "рождения", учитывая существование на тот момент Java). Надо отдать должное Мигелю, он признал свою ошибку и взялся за реализацию самой передовой на 2001 год технологии — .NET. Но главная цель, которой он хотел достичь, осталась той же — внести в мир UNIX средства быстрой разработки приложений. На данный момент Mono реализует уже почти все технологии MS .NET, стандартизированные в ECMA. Чтобы не быть голословным, приведу пару примеров реализованных технологий.
1. Common Language Environment (CLR) — основа виртуальной машины .NET. При компиляции программы .NET-компилятор создает код на общем промежуточном языке (Common Intermediate Language — CIL). Во время исполнения CLR транслирует CIL в настоящий процессорный байт-код, что позволяет приложению .NET быть таким же эффективным по скорости, как и традиционные приложения. Для CLR, реализованного в Mono, уже разработано несколько высокоуровневых языков: C#, VB.NET, Java, Nemerlie, Boo.
2. Garbage Collector (GC). Основан на библиотеке сбора мусора Boehm. Эта библиотека работает по старому проверенному алгоритму и ищет объекты без ссылок на них только в памяти, выделенной GC. Это значит, что все объекты, создаваемые в Mono традиционным способом, будут взяты "на карандаш" самой платформой, а за объектами памяти, созданными при помощи malloc, должен следить программист.
3. Кроме самой платформы .NET, в Mono реализованы различные технологии. Среди них — и три наиважнейших: ADO.NET, ASP.NET, Remoting. Список этот можно продолжать долго. Но Mono — это не просто клон MS .NET. Здесь есть свои собственные технологии, библиотеки. Вот несколько компонент Mono, которых нету в MS .NET:
1. Gtk# — привязки к популярной библиотеке графических интерфейсов Gtk. Gtk хороша тем, что она реализована как под UNIX-системы, так и под MS Windows. А это значит, что любое оконное приложение, правильно разработанное под Linux, без изменений и даже без повторной компиляции будет работать и в Windows.
2. Tao Framework — привязки к OpenGL. Думаю, комментариев не требуется: в игры ведь все играли;-)?
3. Mono.Data — поставщики данных для ряда баз данных: PostgreSQL, MySql, Sybase, DB2, SqlLite, Tds (SQL server protocol) и Oracle.
4. Mono.Remoting.Channels.Unix — Remoting, основанный на UNIX-сокетах.
5. Mono.Security — расширенная и улучшенная платформа криптографии.
И т.д.
Чего нет в Mono, что есть в MS .NET? Разработчики Mono посчитали, что некоторые редко используемые технологии реализовывать чересчур накладно или долго. Поэтому часть компонент, реализованных Microsoft, но не стандартизированных в ECMA, решили не разрабатывать. Это, например, Passport и software-as-a-service. Думаю, сюда же нужно добавить и Windows.Forms. На самом деле они, конечно, реализованы в Mono (для UNIX-систем на основе Wine), и притом неплохо. Вот только их реализация от Microsoft меняется чаще, чем погода осенью, и совместимости с ней добиться слишком сложно. Что касается взаимодействия Microsoft и Novell по реализации Mono, то официально его нет. Но неофициально у программистов обеих компаний хорошие отношения, и они часто помогают друг другу. Так, в FAQ'е Mono выражается признательность сотрудникам Microsoft, которые помогли лучше понять стандарт .NET и правильно его реализовать.
Рассказывая о платформе разработки, нельзя не упомянуть о средствах разработки. В Microsoft прекрасно понимают всю важность инструментов для разработчиков и прилагают все усилия, чтобы их Visual Studio была лучшей в мире средой для программистов. И если вы хотите разработать коммерческое приложение .NET, и у вас есть лишних тысячи полторы американских денег на покупку среды разработки, то, безусловно, ваш выбор — MS Visual Studio! Вот только для большинства венчурных проектов такая сумма слишком велика, а штрафы за нелегальное использование MS VS в коммерческих целях грандиозны. Ситуация с Mono совершенно иная. Здесь как платформа, так и среда разработки MonoDevelop совершенно бесплатны и доступны в исходных кодах. Mono можно использовать в любых целях в соответствии с лицензией GPL, по которой она распространяется. Дистрибутив Mono размером примерно 60 Мб поставляется вместе со средой разработки MonoDevelop, документацией, напоминающей MSDN, и массой полезных компонент. Скачать все это можно здесь: сайт
MonoDevelop — уже вполне толковая IDE, внешне очень похожая на MS Visual Studio. Здесь похожее управление проектами, приличный редактор кода с подсветкой и автодополнением, редактор соединений с базами данных и т.д. Однако проект Mono все еще на стадии разработки, и некоторые вещи сделаны не до конца. Так, например, дебагер пока не интегрирован в среду разработки. Впрочем, разработчики Mono клятвенно обещают, что уже скоро он будет встроен в MonoDevelop. Интересная ситуация с визуальным редактором интерфейсов. Проще говоря, его нет. Зато есть компонент, позволяющий строить интерфейсы на основе файлов ресурсов, которые генерирует Glade2.
Кроме того, уже достаточно давно ведется разработка своего собственного редактора интерфейсов Stetic. Он пока доступен только из SVN- репозитория, но, опять же, по обещаниям разработчиков, скоро будет встроен в MonoDevelop. Ну и на закуску расскажу о нескольких проектах, связанных с Mono. X-Develop — коммерческая среда разработки от Omnicore для Mono и JVM. У нее очень красивый интерфейс и масса полезной функциональности. Даже если сравнивать хотя бы редактор кода с аналогичными в тех же MonoDevelop или MS VS, то сразу бросается в глаза, что он умеет несколько больше, чем его конкуренты. В X-Develop так почти все: как у конкурентов, но немножко лучше. Есть даже свой собственный .NET- дебагер, которого так не хватает MonoDevelop'у. Единственное, что меня не очень впечатлило — встроенный редактор интерфейсов. Мне, больше привыкшему к qt-designer'у или Visual Studio, он показался несколько неудобным. На этом перед MonoDevelop преимущества X-Develop заканчиваются, а начинаются перед MS VS. Как уже было сказано, лицензия на Visual Studio стоит больше тысячи "вечнозеленых", а на X-Develop — около $300. При этом политика лицензирования у Omnicore довольно гибкая: так, к Новому году эта цена была на целый месяц снижена до $150; кроме того, есть отдельные виды лицензии для студентов, преподавателей, членов каких-то загадочных организаций и т.д. Короче говоря, самая низкая цена лицензии на X-Develop составляет... $15.
Ну, а тот, кто не уверен, нужна ли ему X-Develop, может воспользоваться ею бесплатно в течение 20 дней в ознакомительных целях. Коммерческих приложений Mono уже достаточно. Но традиционно в мире UNIX отдают предпочтения свободному софту. Пожалуй, лучшим примером OpenSource-приложений Mono будет поисковой движок Beagle от Novell. Думаю, все пользователи Windows наслышаны о тех революционных возможностях, которые будут реализованы в назревающей Windows Vista. Среди них — интеграция интернет-поисковика Microsoft с локальной файловой системой. Но насколько это будет гениально, инновационно и уникально — судить пока рано, т.к. релиза этой ОС еще не было. А поисковик по файловой системе давно есть, правда, не от Microsoft. И, надо сказать, он меня здорово порадовал. Представьте себе эдакий google.com, работающий только по вашему компьютеру! Beagle в фоновом режиме индексирует документы по всем каталогам, на которые он настроен, после чего поиск становится практически мгновенным. А знает он следующие типы документов: файлы электронной почты, логи чат-клиентов и интернет- пейджеров, web-страницы, RSS-ленты, документы Open Office и Microsoft Office разных форматов, документы AbiWord, документы в Rich Text Format, pdf, исходные тексты программ на разных языках, документация в форматах Man Pages, TeX, chm, изображения разных форматов, аудио разных форматов и т.д., и т.п.
Для платформы Mono существует уже множество интересных проектов. В дальнейшем я расскажу, как при помощи MonoDevelop быстро писать
кроссплатформенные приложения и тем самым встать в ряды Mono-разработчиков.
Дмитрий Бушенко, nop@list.ru
В последние годы здорово набирает популярность новая технология программирования от Microsoft, названная .NET. И несмотря на то, что в ней нет ничего революционного по сравнению с другими технологиями (взять хоть бы те же Java, Ruby, Perl и пр.), все же это немалый шаг вперед. Неудивительно, что программистам всего мира так понравились новые возможности, предложенные Microsoft. Каждый, кто пишет программу, должен задать себе вопрос: чего он хочет? Применить все свои таланты, чтобы за огромные сроки написать на низкоуровневом языке красивый с точки зрения других программистов код или быстро разработать качественный продукт? Посмотрим правде в глаза: каким бы красивым ни был код, если он ничего толкового не делает или в нем пропала необходимость из-за задержек в разработке... ну, вы меня поняли:-).
Платформа .NET позволяет быстро разрабатывать приложения любой сложности. Среди программистов ходит байка, дескать, некто сравнивал работу на языках С, С++ и C# (.NET). И вышло, что при кодировании на С 30% времени уходило непосредственно на написание текста программы, а 70% — на отладку написанного. В C++ этот показатель был уже 50/50%, а в C# — 70/30%. Что ж, на мой взгляд, это истинная правда. Какое-то время только пользователи MS Windows имели возможность применять такую классную технологию, как .NET. Но Microsoft зарегистрировала свою платформу .NET как стандарт ECMA. Поэтому появилась возможность для сторонних разработчиков реализовать свою собственную платформу, совместимую с MS .NET. Мне известно по крайней мере о двух таких проектах: dotGNU и Mono. Оба разрабатываются сообществом OpenSource, и безусловным лидером среди них является Mono. Именно о Mono и пойдет речь в этой статье. Mono — это открыто разрабатываемая платформа .NET, спонсируемая Novell, UNIX-версия платформы разработки Microsoft .NET. Цель Mono — дать возможность UNIX-разработчикам писать кроссплатформенные приложения .NET. Идея свободной кроссплатформенной реализации .NET принадлежит хакеру Мигелю де Икаца (Miguel de Icaza), он же и выполнил основную часть работы по созданию framework'а. Ранее Мигель занимался разработкой ядра Linux, много сделал для GNOME. А еще, думаю, всем пользователям *nix-платформ известен его файл-менеджер Midnight Commander. Мигеля всегда беспокоила проблема повторного использования кода. В UNIX эта технология была не слишком распространена, и он попытался создать новое решение — компонентную архитектуру Bonobo на основе CORBA. Однако это решение, в чем-то напоминающее COM из MS Windows, было недостаточно эффективным (IMHO, оно устарело еще до своего "рождения", учитывая существование на тот момент Java). Надо отдать должное Мигелю, он признал свою ошибку и взялся за реализацию самой передовой на 2001 год технологии — .NET. Но главная цель, которой он хотел достичь, осталась той же — внести в мир UNIX средства быстрой разработки приложений. На данный момент Mono реализует уже почти все технологии MS .NET, стандартизированные в ECMA. Чтобы не быть голословным, приведу пару примеров реализованных технологий.
1. Common Language Environment (CLR) — основа виртуальной машины .NET. При компиляции программы .NET-компилятор создает код на общем промежуточном языке (Common Intermediate Language — CIL). Во время исполнения CLR транслирует CIL в настоящий процессорный байт-код, что позволяет приложению .NET быть таким же эффективным по скорости, как и традиционные приложения. Для CLR, реализованного в Mono, уже разработано несколько высокоуровневых языков: C#, VB.NET, Java, Nemerlie, Boo.
2. Garbage Collector (GC). Основан на библиотеке сбора мусора Boehm. Эта библиотека работает по старому проверенному алгоритму и ищет объекты без ссылок на них только в памяти, выделенной GC. Это значит, что все объекты, создаваемые в Mono традиционным способом, будут взяты "на карандаш" самой платформой, а за объектами памяти, созданными при помощи malloc, должен следить программист.
3. Кроме самой платформы .NET, в Mono реализованы различные технологии. Среди них — и три наиважнейших: ADO.NET, ASP.NET, Remoting. Список этот можно продолжать долго. Но Mono — это не просто клон MS .NET. Здесь есть свои собственные технологии, библиотеки. Вот несколько компонент Mono, которых нету в MS .NET:
1. Gtk# — привязки к популярной библиотеке графических интерфейсов Gtk. Gtk хороша тем, что она реализована как под UNIX-системы, так и под MS Windows. А это значит, что любое оконное приложение, правильно разработанное под Linux, без изменений и даже без повторной компиляции будет работать и в Windows.
2. Tao Framework — привязки к OpenGL. Думаю, комментариев не требуется: в игры ведь все играли;-)?
3. Mono.Data — поставщики данных для ряда баз данных: PostgreSQL, MySql, Sybase, DB2, SqlLite, Tds (SQL server protocol) и Oracle.
4. Mono.Remoting.Channels.Unix — Remoting, основанный на UNIX-сокетах.
5. Mono.Security — расширенная и улучшенная платформа криптографии.
И т.д.
Чего нет в Mono, что есть в MS .NET? Разработчики Mono посчитали, что некоторые редко используемые технологии реализовывать чересчур накладно или долго. Поэтому часть компонент, реализованных Microsoft, но не стандартизированных в ECMA, решили не разрабатывать. Это, например, Passport и software-as-a-service. Думаю, сюда же нужно добавить и Windows.Forms. На самом деле они, конечно, реализованы в Mono (для UNIX-систем на основе Wine), и притом неплохо. Вот только их реализация от Microsoft меняется чаще, чем погода осенью, и совместимости с ней добиться слишком сложно. Что касается взаимодействия Microsoft и Novell по реализации Mono, то официально его нет. Но неофициально у программистов обеих компаний хорошие отношения, и они часто помогают друг другу. Так, в FAQ'е Mono выражается признательность сотрудникам Microsoft, которые помогли лучше понять стандарт .NET и правильно его реализовать.
Рассказывая о платформе разработки, нельзя не упомянуть о средствах разработки. В Microsoft прекрасно понимают всю важность инструментов для разработчиков и прилагают все усилия, чтобы их Visual Studio была лучшей в мире средой для программистов. И если вы хотите разработать коммерческое приложение .NET, и у вас есть лишних тысячи полторы американских денег на покупку среды разработки, то, безусловно, ваш выбор — MS Visual Studio! Вот только для большинства венчурных проектов такая сумма слишком велика, а штрафы за нелегальное использование MS VS в коммерческих целях грандиозны. Ситуация с Mono совершенно иная. Здесь как платформа, так и среда разработки MonoDevelop совершенно бесплатны и доступны в исходных кодах. Mono можно использовать в любых целях в соответствии с лицензией GPL, по которой она распространяется. Дистрибутив Mono размером примерно 60 Мб поставляется вместе со средой разработки MonoDevelop, документацией, напоминающей MSDN, и массой полезных компонент. Скачать все это можно здесь: сайт
MonoDevelop — уже вполне толковая IDE, внешне очень похожая на MS Visual Studio. Здесь похожее управление проектами, приличный редактор кода с подсветкой и автодополнением, редактор соединений с базами данных и т.д. Однако проект Mono все еще на стадии разработки, и некоторые вещи сделаны не до конца. Так, например, дебагер пока не интегрирован в среду разработки. Впрочем, разработчики Mono клятвенно обещают, что уже скоро он будет встроен в MonoDevelop. Интересная ситуация с визуальным редактором интерфейсов. Проще говоря, его нет. Зато есть компонент, позволяющий строить интерфейсы на основе файлов ресурсов, которые генерирует Glade2.
Кроме того, уже достаточно давно ведется разработка своего собственного редактора интерфейсов Stetic. Он пока доступен только из SVN- репозитория, но, опять же, по обещаниям разработчиков, скоро будет встроен в MonoDevelop. Ну и на закуску расскажу о нескольких проектах, связанных с Mono. X-Develop — коммерческая среда разработки от Omnicore для Mono и JVM. У нее очень красивый интерфейс и масса полезной функциональности. Даже если сравнивать хотя бы редактор кода с аналогичными в тех же MonoDevelop или MS VS, то сразу бросается в глаза, что он умеет несколько больше, чем его конкуренты. В X-Develop так почти все: как у конкурентов, но немножко лучше. Есть даже свой собственный .NET- дебагер, которого так не хватает MonoDevelop'у. Единственное, что меня не очень впечатлило — встроенный редактор интерфейсов. Мне, больше привыкшему к qt-designer'у или Visual Studio, он показался несколько неудобным. На этом перед MonoDevelop преимущества X-Develop заканчиваются, а начинаются перед MS VS. Как уже было сказано, лицензия на Visual Studio стоит больше тысячи "вечнозеленых", а на X-Develop — около $300. При этом политика лицензирования у Omnicore довольно гибкая: так, к Новому году эта цена была на целый месяц снижена до $150; кроме того, есть отдельные виды лицензии для студентов, преподавателей, членов каких-то загадочных организаций и т.д. Короче говоря, самая низкая цена лицензии на X-Develop составляет... $15.
Ну, а тот, кто не уверен, нужна ли ему X-Develop, может воспользоваться ею бесплатно в течение 20 дней в ознакомительных целях. Коммерческих приложений Mono уже достаточно. Но традиционно в мире UNIX отдают предпочтения свободному софту. Пожалуй, лучшим примером OpenSource-приложений Mono будет поисковой движок Beagle от Novell. Думаю, все пользователи Windows наслышаны о тех революционных возможностях, которые будут реализованы в назревающей Windows Vista. Среди них — интеграция интернет-поисковика Microsoft с локальной файловой системой. Но насколько это будет гениально, инновационно и уникально — судить пока рано, т.к. релиза этой ОС еще не было. А поисковик по файловой системе давно есть, правда, не от Microsoft. И, надо сказать, он меня здорово порадовал. Представьте себе эдакий google.com, работающий только по вашему компьютеру! Beagle в фоновом режиме индексирует документы по всем каталогам, на которые он настроен, после чего поиск становится практически мгновенным. А знает он следующие типы документов: файлы электронной почты, логи чат-клиентов и интернет- пейджеров, web-страницы, RSS-ленты, документы Open Office и Microsoft Office разных форматов, документы AbiWord, документы в Rich Text Format, pdf, исходные тексты программ на разных языках, документация в форматах Man Pages, TeX, chm, изображения разных форматов, аудио разных форматов и т.д., и т.п.
Для платформы Mono существует уже множество интересных проектов. В дальнейшем я расскажу, как при помощи MonoDevelop быстро писать
кроссплатформенные приложения и тем самым встать в ряды Mono-разработчиков.
Дмитрий Бушенко, nop@list.ru
Компьютерная газета. Статья была опубликована в номере 03 за 2006 год в рубрике программирование