Программирование: встречаем C# и Mono |
C# (читается как "Си шарп") является новым объектно-ориентированным языком программирования, разработанным для максимально удобного использования всех возможностей платформы Microsoft .NET. Он во многом похож на другие популярные объектно-ориентированные языки, такие как C++ и Java, но имеет и свои отличительные особенности. Благодаря появлению проекта Mono, в Linux тоже есть возможность разрабатывать приложения на C#. Mono - это свободно распространяемая реализация платформы .NET. Ниже я постараюсь рассказать об основных элементах Mono. Проект MonoВ настоящее время в рамках этого проекта реализованы два стандарта: язык программирования C# (Стандарт ECMA-334) и Инфраструктура Обобщенного Языка Программирования (CLI) (Стандарт ECMA-335). Обе спецификации были разработаны в корпорации Microsoft и представлены ECMA (Европейская Ассоциация Производителей Компьютеров) в октябре 2000 года. Формальное одобрение было получено в декабре 2001 года и эти предложения, возможно, станут стандартами ISO (благодаря соглашению о согласовании работы ["fast-track"], существующему между ISO и ECMA) ближе к концу следующего года. Проект Mono спонсируется компанией Ximian, той самой, которая дала нам графический рабочий стол GNOME. Лидер проекта -- мексиканский программист, главный технический директор Ximian - Мигель де Иказа (Miguel de Icaza). На мой взгляд разработчики, привлеченные к работе над проектом Mono, в очень короткое время проделали огромный объем работ. Между прочим, слово "Mono", в переводе с испанского, означает "обезьяна". А ребят из Ximian обезьяниичать учить не надо! Привет, мир Mono!Попробуем на примере простой программы разобраться в том, как взаимодействуют между собой различные компоненты Mono и языка C#. Перед тем как приступить к изучению, необходимо установить Mono у себя на компьютере (информацию об установке Mono вы найдете в разделе Ссылки). На диаграмме, приведенной ниже, показан путь, который проходит программа на языке C# от компиляции до исполнения: Для начала рассмотрим простую программу на языке C# (классический "Привет мир"). Создайте в любом текстовом редакторе файл со следующим содержимым: class Hello { public static void Main() { System.Console.WriteLine("Hello Mono World!"); } } и сохраните его с именем hello.cs. Программа состоит из класса Теперь скомпилируем программу компилятором C# (называется
он mcs hello.cs В результате работы компилятора - в текущем каталоге должен появиться файл hello.exe. Пусть вас не сбивает с тольку расширение .exe файла. Это не исполняемый файл системы Windows, во всяком случае - расширение не определяет способ пользования файлом. В отличие от компиляторов C/C++, компилятор C# не создает машинный код. Создаваемый им двоичный файл - сборка, содержит метаданные и инструкции на промежуточном, платформо-независимом языке (intermediate language (IL)). Это означает, что при запуске такой программы, она должна пройти этап дополнительной трансляции кода из промежуточного языка в машинные инструкции того процессора, на котором исполняется программа. Эта последняя стадия трансляции выполняется виртуальной машиной, которая определяется Инфраструктурой Обобщенного Языка Программирования (Common Language Infrastructure - CLI). CLI определяет объектно-ориентированную среду времени исполнения, поддерживающую базовую библиотеку классов, динамическую подгрузку и связывание классов, многопоточное исполнение, трансляцию "на лету" и механизмы автоматического управления памятью. В реализации спецификации от Microsoft - CLI обычно называется как Common Language Runtime - Среда Выполнения для Обобщенного Языка Программирования (CLR). Можно смело утверждать, что CLR является надмножеством для CLI, поскольку она содержит некоторые расширения, не являющиеся частью CLI. Чтобы запустить наш скомпилированный пример необходимо
воспользоваться программой mono hello.exe На стандартный вывод (окно терминала и т.п.) будет выведена строка: Hello Mono World! За кулисамиА теперь давайте "заглянем" внутрь
скомпилированного файла - сборки. Программа
monodis hello.exe Дизассемблер должен вывести нечто подобное: .assembly extern mscorlib { .ver 0:0:0:0 } .assembly 'hello' { .hash algorithm 0x00008004 .ver 0:0:0:0 } .class private auto ansi beforefieldinit Hello extends [mscorlib]System.Object { // method line 1 .method public hidebysig specialname rtspecialname instance default void .ctor() cil managed { // Method begins at RVA 0x20ec // Code size 7 (0x7) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void valuetype [corlib]System.Object::.ctor() IL_0006: ret } // end of method instance default void .ctor() // method line 2 .method public static default void Main() cil managed { // Method begins at RVA 0x20f4 .entrypoint // Code size 11 (0xb) .maxstack 8 IL_0000: ldstr "Hello Mono World!" IL_0005: call void class [corlib]System.Console::WriteLine(string) IL_000a: ret } // end of method default void Main() } // end of type Hello В первом разделе находятся метаданные. Они содержат текущую версию программы, дополнительные ограничения по безопасности, информацию о локали и список внешних сборок, используемых данной сборкой. Все остальное - это код на промежуточном языке (IL). Здесь можно видеть два метода:
Как уже говорилось ранее, виртуальная машина использует
JIT-компилятор (just-in-time - "на лету") для
трансляции кода на промежуточном языке (IL) в машииный код.
Трансляция производится только тогда, когда в этом возникает
необходимость (отсюда и название "на лету" -
just-in time). В нашем случае, для метода push %ebp mov %esp,%ebp sub $0x30,%esp push $0x80c9eb0 mov 0x805462c,%eax push %eax cmpl $0x0,(%eax) mov (%eax),%eax call *0x94(%eax) add $0x8,%esp mov 0x805462c,%eax push %eax cmpl $0x0,(%eax) mov (%eax),%eax call *0xb4(%eax) add $0x4,%esp leave ret Кроме того, в состав Mono входит интерпретатор
mint hello.exe Если вы хорошо знакомы с Java, то вы обнаружите, что эти технологии в значительной степени схожи. И это действительно так. Виртуальная машина является ключевым фактором в достижении независимости от аппаратной платформы. Это означает, что я могу написать и скомпилировать программу под Linux, используя Mono, а затем запустить ее под Windows с установленной .NET Framework. И при этом не потребуется переписывать или перекомпилировать исходный код. Однако, в противовес виртуальной машине Java, прочно привязанной к одному языку программирования, спецификация CLI (Инфраструктура Обобщенного Языка Программирования) провозглашает не только независимость от аппаратной платформы, но и независимость от языка программирования! Под Windows имеется целый ряд языков программирования, нацеленных на CLR (Среда Выполнения для Обобщенного Языка Программирования). Наиболее важные, являющиеся частью среды разработки Microsoft Visual Studio .NET: Visual Basic .NET, JScript .NET, Managed C++ и C#. Среди других языков программирования от сторонних производителей, поддерживающих новую технологию .NET, можно назвать APL, COBOL, Eiffel, Forth, Fortran, Haskell, Mercury, Mondrian, Oberon, Pascal, Perl, Python, RPG, Scheme и SmallScript. Что касается проекта Mono, то на сегодняшний день в нем существует единственный язык программирования - это C#, но, вероятно в ближайшем будущем, мы увидим поддержку и других языков программирования. Другая немаловажная часть CLI - это Common Type System - Общая Система Типов (CTS). CTS дает полное описание всех типов данных, поддерживаемых виртуальной машиной, включая порядок их взаимодействия и формат представления в области метаданных сборки. Важен тот факт, что не все языки программирования, следующие спецификации CLI, поддерживают полный список типов данных из CTS. Поэтому существует еще Common Language Specification - Спецификация Обобщенного Языка Ппрограммирования (CLS), определяющая минимальный набор типов, которые должны поддерживаться всеми языками программирования, следующими спецификации CLI. Это означает, что если мы создали класс, который использует только те качесва, которые доступны в CLS, то его можно будет использовать в программах на любом другом CLI-совместимом языке программирования. Вы можете написать реализацию класса на Eiffel, наследника на C# и использовать его в пограмме на Visual Basic.NET. Теперь такая совместимость стала реальностью. О преимуществахИспользуя платформу CLI, такую как Mono или .NET, вы приобретаете ряд очень важных преимуществ:
Кроме того, язык программирования C# дает еще ряд важных преимуществ:
Эти и другие проблемы C# я буду затрагивать более подробно в своих последующих публикациях. Ссылки
Copyright (C) 2002, Ariel Ortiz Ramirez.
Copying license http://www.linuxgazette.com/copying.html |
Вернуться на главную страницу |