Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

3.Управляемый и неуправляемый код и данные

3.1Виртуальная машина языка Java

Популярнейший среди программистов язык С++, позволяя разрабатывать эффективные и компактные программы, обладал рядом существенных недостатков, обусловивших появление виртуальной машины и нового языка Java, позволивших создать более надёжные и безопасные программы. Язык Java сохранил максимум из любимейшего языка программистов С++, удалив или изменив конструкции языка, способствовавшие появлению явного или неявного возможного ошибочного кода. Появление виртуальной машины JVM (Java Virtual Machine), которая интерпретирует программу на промежуточном языке (байт-коде ~ bytecode), позволило не только выявлять ошибки на этапе выполнения и корректировать выполнение программы программистом, но и исполнять программу на любом компьютере, имеющем также виртуальную машину Java. Решена проблема переносимости программ.

Этими основополагающими решениями в языке Java фирмы Sun воспользовалась фирма Microsoft при разработке .NET технологии.

3.2Общеязыковая среда выполнения clr платформы .Net

Одна из причин появления .NET технологии - упростить взаимодействие компонентов, написанных на разных языках программирования, и обеспечить надёжность и безопасность программного кода. Для этого компиляторы языков .NET платформы транслируют исходные программы на язык MSIL.

Промежуточный язык MSIL (Microsoft Intermediate Language) - это язык "виртуальной машины" .NET платформы. Представленные на одном и том же языке MSIL, программные компоненты теряют особенности, присущие разным языкам программирования. Единым образом представлены не только программы и данные, но и дополнительная информация, описывающая классы и интерфейсы для связи с другими компонентами.

Общеязыковая среда выполнения CLR (Common Language Run) управляет выполнением машинного кода виртуальной машины, осуществляя также связь между компонентами и контролируя размещение данных в памяти, обеспечив тем самым безопасность работы каждого компонента и, как следствие, программы из компонентов.

3.3Управляемый и неуправляемый код и данные

Для обеспечения безопасности программного кода и данных на .NET и Java платформах используется управляемый код (managed code) и управляемые данные (managed data). На .NET платформе управляемый код может быть использован на любом языке программирования .NET платформы и оттранслирован соответствующим компилятором на промежуточный язык MSIL.

C# и J#. Языки C# и J# - родные языки .NET платформы, и их исходные программы и данные без специальных указаний естественно компилируются на язык MSIL.

Java. Исходная программа языка Java компилируется на промежуточный язык - байт-код, с которого затем интерпретируется виртуальной машиной Java. Язык Java имеет дело с управляемыми данными и кодом.

С++. Язык С++ не является языком .NET платформы и не создаёт управляемого кода и управляемых данных. Все данные являются неуправляемыми и хранятся в стеке или неуправляемой куче.

C++.NET и C++/CLI. Язык C++.NET (или Managed С++) специально был разработан для .NET платформы посредством включения в язык С++ специальных ключевых слов, составляющих управляемое расширение (managed extension), позволившее интегрироваться в общеязыковую среду выполнения CLR. Например, классы, помеченные ключевым словом gc, считаются управляемыми и их объекты будут помещены посредством оператора new в память, называемую управляемой кучей (managed heap). Специальный сборщик мусора GC (garbage collector) надзирает за управляемой кучей, удаляя из неё данные, необходимость в которых исчезла. Неуправляемые данные (unmanaged data) находятся в стеке или размещаются с помощью оператора new в неуправляемой куче (unmanaged heap или heap С++), из которой обязаны в дальнейшем удаляться с помощью оператора delete.

Достоинством языка C++.NET является то, что программисты на языке C++.NET могут в пределах одного программного кода разделить данные на управляемые и неуправляемые и сделать свою программу более эффективной, поскольку неуправляемые системой данные быстрее обрабатываются и их существование определяется только программистом, а не сборщиком мусора. Для связи управляемых и неуправляемых фрагментов программы используется особый объект прокси (proxy).

Язык C++/CLI является дальнейшим развитием языка C++.NET, внесшим большую ясность при создании управляемого кода. Модификация коснулась не только языка, но и его лучшей реализации применительно к среде CLR. Исчезли введённые в языке C++.NET ключевые слова, начинающиеся с двух подчёркиваний - gc, nogc, delegate, event, value и другие. В языке C++/CLI введены другие слова, связанные с управляемым кодом и убраны в них подчёркивания, так что вместо ключевого слова gc теперь перед управляемым классом ставится ref, вместо двух слов gc new используется одно слово gcnew. Теперь управляемый указатель (дескриптор) начинается с символа Л, а не с символа *, как было в языке C++.NET. Об особенностях языка C++/CLI и используемых в нём операторах и ключевых словах будет изложено в дальнейшем.

Читателям, пожелавшим познакомиться подробнее с языком C++.NET (и C# ) и программированием на этом языке, можно порекомендовать книги автора "Программирование на С++, C++.NET/C# и .NET компоненты" и ".NET компоненты, контейнеры и удалённые объекты ".