Linux и C#

Linux и C#

"Си шарп" (официально C#) является новым объектно-ориентированным языком программирования, разработанным для максимально удобного использования всех возможностей платформы Microsoft.NET. Во многом является схожим с другими популярными объектно-ориентированными языками, такими как C++ и Java, но имеет свои особенности.
Благодаря появлению нового свободного проекта Mono, в Linux появилась возможность разрабатывать приложения на C#. Mono — это свободно распространяемая реализация платформы .NET. Рассмотрим, что же это Mono есть.
В настоящее время в рамках этого проекта реализованы два стандарта: язык программирования C# (Стандарт ECMA-334) и "инфраструктура обобщенного языка программирования" (CLI) (Стандарт ECMA-335). Обе спецификации были разработаны в корпорации Microsoft и представлены ECMA (Европейской Ассоциации Производителей Компьютеров) в октябре 2000 г. Формальное одобрение было получено в декабре 2001 г., и эти предложения, возможно, станут стандартами ISO (благодаря соглашению, существующему между ISO и ECMA) ближе к концу этого года.
Проект Mono спонсируется компанией Ximian — той самой, которая предоставила миру графический рабочий стол GNOME. Лидером проекта является мексиканский программист, главный технический директор компании Ximian — Miguel de Icaza. Специалисты, привлеченные к разработке проекта Mono, в очень короткое время проделали огромный объем работ. Попробуем на примере простой программы разобраться в том, как взаимодействуют между собой различные компоненты Mono и языка C#. Перед тем как приступить к изучению, необходимо установить Mono на компьютер ( http://www.go-mono.com/ ).

.

На диаграмме показан путь, который проходит программа на языке C# от компиляции до исполнения:
Для начала рассмотрим простую программу на языке C# Hello world!. Создайте в любом текстовом редакторе файл со следующим содержимым:

class Hello {
public static void Main() {
System.Console.WriteLine("Hello world!");
}
}
и сохраните его с именем hello.cs.
Программа состоит из класса Hello, который содержит метод Main. Этот метод представляет собой точку входа в программу, фактически то же самое, что и функция main в программах на языке C/C++. В этом примере метод Main выдает на стандартный вывод строку "Hello world".
Теперь скомпилируем программу компилятором C# (называется он mcs), выполнив такую команду:

mcs hello.cs

В результате работы компилятора в текущем каталоге должен появиться файл hello.exe. Не обращайте внимания на расширение файла. Это не исполняемый файл системы Windows, а лишь отметка его как исполняемого кода. В отличие от компиляторов C/C++, компилятор C# не создает машинный код. Создаваемый им двоичный файл — сборка, содержит метаданные и инструкции на промежуточном платформонезависимом языке (intermediate language (IL)). Это означает, что при запуске такой программы она должна пройти этап дополнительной трансляции кода из промежуточного языка в машинные инструкции того процессора, на котором исполняется программа. Эта последняя стадия трансляции выполняется виртуальной машиной, которая определяется инфраструктурой обобщенного языка программирования (Common Language Infrastructure — CLI). CLI определяет объектно-ориентированную среду времени исполнения, поддерживающую базовую библиотеку классов, динамическую подгрузку и связывание классов, многопоточное исполнение, трансляцию на лету и механизмы автоматического управления памятью. В реализации спецификации от Microsoft CLI обычно называется как Common Language Runtime — среда выполнения для обобщенного языка программирования (CLR). Можно смело утверждать, что CLR является надмножеством для CLI, поскольку она содержит некоторые расширения, не являющиеся частью CLI.
Чтобы запустить наш скомпилированный пример, необходимо воспользоваться программой mono, которая представляет собой виртуальную машину Mono. В результате выполнения следующей команды:
mono hello.exe

на окно терминала будет выведена строка:

Hello world!

А теперь давайте посмотрим на внутренности скомпилированного файла. Программа monodis (Mono-дизассемблер) выводит содержимое сборки в текстовом представлении. Наберите следующую команду:

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 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). Здесь можно видеть два метода:
1. Конструктор класса по умолчанию — .ctor, который создается компилятором автоматически.
2. Наш метод — Main.
Как уже говорилось ранее, виртуальная машина использует JIT-компилятор (just-in-time — "на лету") для трансляции кода на промежуточном языке (IL) в машинный код. Трансляция производится только тогда, когда в этом возникает необходимость (отсюда и название "на лету" — just-in time). В нашем случае для метода Main генерируется следующий машинный код (синтаксис языка ассемблера AT&T):

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. Эта программа вместо JIT-компиляции выполняет интерпретацию инструкций промежуточного языка (IL). Если говорить о скорости выполнения, то для нашего конкретного примера интерпретатор mint дает несколько более высокую скорость исполнения, поскольку не тратится время на компиляцию и размещение скомпилированного кода в памяти. Конечно же, машинный код, уже размещенный в памяти, выполняется намного быстрее, чем интерпретация IL. В настоящее время JIT-компилятор Mono существует только для платформы x86. На других платформах следует использовать интерпретатор. Чтобы увидеть результат работы интерпретатора, выполните следующую команду:

mint hello.exe

Если вы хорошо знакомы с Java, то обнаружите, что эти технологии в значительной степени схожи. И это действительно так. Виртуальная машина является ключевым фактором в достижении независимости от аппаратной платформы. Это означает, что я могу написать и скомпилировать программу под Linux, используя Mono, а затем запустить ее под Windows с установленной .NET Framework. И при этом не потребуется переписывать или перекомпилировать исходный код. Однако, в противовес виртуальной машине Java, прочно привязанной к одному языку программирования, спецификация CLI (Инфраструктура Обобщенного Языка Программирования) провозглашает не только независимость от аппаратной платформы, но и независимость от языка программирования! Под Windows имеется целый ряд языков программирования, нацеленных на CLR. Наиболее важные являющиеся частью среды разработки Microsoft Visual Studio.NET: Visual Basic.NET, JScript.NET, Ma-naged 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, вы приобретаете ряд очень важных преимуществ:
• Программы могут быть запущены на любом типе процессора, под управлением любой операционной системы, поддерживающей платформу CLI, без необходимости перекомпиляции.
• Полная интеграция нескольких языков программирования.
• Система поддерживает важные меры безопасности.
• Единая среда исполнения, разделяемая всеми CLI-совместимыми языками программирования.
• Непротиворечивая объектная модель, используемая всеми CLI-языками включая стандартный API, предлагаемый единственной базовой библиотекой классов. Изучив API, вы можете использовать его в любом языке программирования, поддерживаемом платформой.
• Упрощенная модель установки приложений. Отпадает необходимость регистрации модуля в системном реестре.
• Несколько версий одной и той же библиотеки (DLL) могут гармонично сосуществовать на одном компьютере.
Кроме того, язык программирования C# дает еще ряд важных преимуществ:
• Появление новых конструкций, таких как свойства, события и атрибуты, заметно упрощает построение программных компонент.
• Отпадает необходимость в отдельных заголовочных файлах языка описания интерфейсов (IDL).
• Упрощен механизм контроля версий.
• Унифицированная система безопасных типов. Все типы данных (включая простые типы) порождены от единственного базового класса.
• Автоматическое управление памятью с помощью сборщика "мусора".
• Тесная интеграция в CLI.

По материалам Ariel Ortiz Ramirez
Подготовил X-Stranger linux@hitech.by



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

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