Управляемые расширения для C ++

редактировать
В этой статье рассказывается о расширениях языка C ++ от Microsoft, объявленных устаревшими в 2004 году. О его преемнике см. C ++ / CLI.

Управляемые расширения для C ++ или Managed C ++ - это устаревший набор языковых расширений для C ++, включая грамматические и синтаксические расширения, ключевые слова и атрибуты, для переноса синтаксиса и языка C ++ в .NET Framework. Эти расширения были созданы Microsoft, чтобы позволить коду C ++ быть нацеленным на Common Language Runtime (CLR) в форме управляемого кода, а также продолжить взаимодействие с машинным кодом.

В 2004 году расширения Managed C ++ были значительно переработаны, чтобы прояснить и упростить синтаксис и расширить функциональные возможности за счет включения управляемых универсальных типов. Эти новые расширения получили обозначение C ++ / CLI и включены в Microsoft Visual Studio 2005. Таким образом, термин Managed C ++ и расширения, на которые он ссылается, не рекомендуются и заменяются новыми расширениями.

Содержание
  • 1 История
  • 2 Дизайн
  • 3 Функциональность
    • 3.1 Преимущества перед нативным кодом
    • 3.2 Недостатки по сравнению с неуправляемым кодом
    • 3.3 Недостатки по сравнению с полностью управляемым кодом
  • 4 Примеры
  • 5 Сравнение с другими языками
    • 5.1 Стандартный C ++
    • 5.2 Java
    • 5.3 C #
  • 6 См. Также
  • 7 ссылки
  • 8 Внешние ссылки
История

Microsoft представила управляемые расширения для C ++ в Microsoft Visual C ++ 2002 (MSVC ++). Microsoft попыталась минимизировать отклонения между стандартным C ++ и управляемыми расширениями для C ++, в результате чего основные различия между ними были синтаксически скрыты. MSVC ++ 2003 и 2005 также обеспечивали поддержку написания программ на управляемом C ++. В 2004 году Managed Extensions для C ++ были устаревшими в пользу C ++ / CLI, второй попытки Microsoft поддержать программирование для Common Language Infrastructure с использованием C ++.

Дизайн

Управляемый относится к управляемому коду, который запускается или управляется виртуальной машиной. NET, которая функционирует как песочница для повышенной безопасности в форме дополнительных проверок времени выполнения, таких как проверки переполнения буфера. Кроме того, приложения, написанные на управляемом C ++, компилируются в CIL - общий промежуточный язык - а не напрямую в собственные инструкции ЦП, как это делают стандартные приложения C ++.

Управляемый код C ++ может взаимодействовать с любым другим языком, также предназначенным для CLR, таким как C # и Visual Basic.NET, а также использовать функции, предоставляемые CLR, такие как сборка мусора. Это означает, что Managed C ++ занимает уникальное положение в галерее языков.NET. Это единственный язык, который может напрямую взаимодействовать с языками.NET (такими как C #, VB.NET), а также с собственным C ++. Другие языки.NET могут взаимодействовать с кодом C ++ только через PInvoke или COM. Но поскольку Managed C ++ может взаимодействовать напрямую как в управляемом, так и в стандартном контексте C ++, он часто используется как «мост».

Функциональность

Программы, написанные на Managed C ++, предоставляют дополнительные функции.NET Framework и CLR. Наиболее заметным из них является сборка мусора, которая избавляет программиста от ручного управления памятью. Сборщик мусора (GC) обрабатывается CLR. Управление памятью выполняется довольно быстро, но для приложений с более высокой производительностью, скорее всего, предпочтительным вариантом будет собственный неуправляемый код.

Управляемый C ++ ориентирован на объектно-ориентированное программирование. Основное различие между стандартным C ++ и Managed C ++ заключается в том, что множественное наследование не поддерживается, а класс, управляемый сборщиком мусора CLR, не может наследовать более одного класса. Это связано с ограничением среды CLR.

Ключевая особенность:

  • Расширяемые метаданные: информация, предоставляемая для описания структуры и типов управляемого компонента. Его можно расширять и повторно использовать для создания программных компонентов. Он широко используется в C # и Visual Basic.NET.
  • Сборка мусора: CLR полностью управляется сборщиком мусора для управления памятью, автоматизированного самой CLR, т.е. оператор удаления не нужно вызывать в управляемом коде C ++.
  • Взаимодействие с языками.NET: код, предназначенный для.NET Framework, производит вывод на промежуточном языке Microsoft (MSIL, аналогично байт-коду Java), и, таким образом, скомпилированные модули и компоненты (скорее, сборки) могут повторно использоваться другими программными компонентами, написанными на другом языке, ориентированном на.NET Framework, например JScript.NET, C #, Visual Basic.NET и другие сторонние языки для.NET.
  • Управление версиями: новые методы и элементы данных могут быть введены в существующие управляемые классы без нарушения двоичной совместимости с существующим программным обеспечением на стороне клиента.
  • Двоичные заголовки: позволяет повторно использовать предварительно скомпилированные метаданные; На любой файл.exe,.dll,.obj или.netmodule, скомпилированный в MSIL, можно ссылаться из исходного файла C ++.
  • Защита от переполнения буфера - с введением в C ++ сборки мусора Managed C ++ стал менее подвержен распространенным ошибкам переполнения буфера, вызванным отсутствием проверки типов данных в стандартном C ++. Сборщик мусора помогает снизить (хотя и не полностью) частоту этих ошибок.
  • Библиотека базовых классов. NET framework - управляемый C ++ также может быть менее подробным, чем стандартный неуправляемый код, поскольку все вызовы управляемых функций и унаследованные классы являются производными от библиотеки базовых классов.NET Framework (BCL, иногда называемой FCL или Framework Class Library), чей API обеспечивает сетевые возможности TCP / IP, функции обработки текста, доступ к данным (от ODBC до SQL), XML-сервисы (от XSD до XSL), программирование графического интерфейса пользователя (Windows Forms), почтовые службы (SMTP), криптографию ( Сертификаты X509 и цифровые подписи XML), генерация MSIL (по сути, передача инструкций в MSIL), ввод-вывод файлов, ручное управление сборщиком мусора CLR и управляющая информация для управления консолью WMI.

Преимущества перед собственным кодом

  • Управляемый и неуправляемый код можно легко смешивать в одной сборке CLI. Это позволяет программисту сохранить неуправляемый код, который нельзя перенести на .NET Framework, не переписав его полностью. Тем не менее, некоторые разветвления использования этого гибридного соглашения присутствуют.
  • Управляемый C ++ - единственный язык, который может содержать неуправляемый код и напрямую взаимодействовать со всеми другими языками.NET. Таким образом, управляемый C ++ очень удобен для взаимодействия между программистами, использующими разные языки, в том числе теми, кто работает в театре.NET, и теми, кто использует стандартный C ++.

Недостатки по сравнению с неуправляемым кодом

  • В Managed C ++ вводится множество новых ключевых слов и синтаксических соглашений, которые могут ухудшить читаемость кода, особенно если код C ++ включен напрямую и напрямую взаимодействует с кодом Managed C ++ в той же сборке.
  • Управляемый C ++ заменен C ++ / CLI и поэтому устарел, поскольку C ++ / CLI был стандартизирован.

Недостатки по сравнению с полностью управляемым кодом

  • Для управляемого C ++ требуется немного больше времени на разработку, чем для других языков.NET, которые можно применить к проектам, которые по-прежнему дают те же результаты. Использование указателей может быть или не быть обязательным, поскольку управляемый C ++ имеет как типы значений (структура __value и класс __value), так и ссылочные типы (структура __gc и класс __gc).
  • Управляемый C ++ полностью поддерживает веб-приложения ASP.NET, хотя разработка сложнее, чем с другими языками.NET, включая некоторые другие сторонние языки.
  • Управляемый C ++ включает только поддержку шаблонов (для взаимодействия с собственным C ++), но не поддерживает универсальные шаблоны (для взаимодействия со всеми другими языками.NET). C ++ / CLI поддерживает как шаблоны (во время компиляции), так и универсальные шаблоны (во время выполнения).
Примеры

В следующих примерах показано использование управляемого C ++ по сравнению со стандартным C ++:

  • (Глобальное изменение) К существующему C ++ для переноса через CLR необходимо добавить следующее:
//hello.cpp //new using directive #using lt;mscorlib.dllgt; //another using namespace directive. using namespace System; int main() { Console::WriteLine("Hello, world!"); return 0; }

Новая директива препроцессора

#using lt;mscorlib.dllgt;

необходимо. В дополнение к этому, требуется больше директив #using для импорта большего количества библиотек для использования большего количества пространств имен в библиотеке базовых классов, таких как

#using lt;System.Windows.Forms.dllgt;

и

using namespace System::Windows::Forms;

использовать Windows Forms.

  • Чтобы скомпилировать код для целевой среды CLR, необходимо ввести новый параметр компилятора.
 cl.exe hello.cpp /clr

/ clr позволяет компилировать любой код, ссылающийся на.NET Framework, как CIL.

  • Класс может быть назначен для сбора мусора с помощью __gc ключевого слова extension.
//gc.cpp #using lt;mscorlib.dllgt; __gc class gc { int* i; char* g; float* j; }; int main() { while (true) { gc^ _gc = gcnew gc(); } return 0; }

Приведенный выше код можно скомпилировать и выполнить, не опасаясь утечки памяти. Поскольку класс gc управляется сборщиком мусора, нет необходимости вызывать delete оператора. Чтобы добиться того же с неуправляемым кодом, необходимо delete ключевое слово:

//nogc.cpp class gc { int* i; char* g; float* j; }; int main() { while (true) { gc* _gc = new gc(); delete _gc; } return 0; }

Примечания:

  • У назначенного класса __gc может быть объявлен конструктор.
  • У назначенного класса __gc может быть объявлен деструктор.
  • Назначенный __gc класс не может наследовать более одного класса. (Это ограничение CLR)
  • Обозначенный __gc класс не может наследовать другой класс, не обозначенный __gc.
  • Обозначенный класс __gc не может быть унаследован другим классом, не обозначенным __gc.
  • Назначенный класс __gc может реализовывать любое количество интерфейсов __gc.
  • Назначенный класс __gc не может реализовать неуправляемый интерфейс.
  • Назначенный __gc класс по умолчанию не становится видимым вне его собственной сборки. Использовать
public __gc class hey { };

ключевое слово public для изменения доступа назначенного класса a __gc.

Назначенный класс __gc может быть уничтожен вручную с помощью ключевого слова delete, но только если у назначенного класса __gc есть определенный пользователем деструктор.

  • Интерфейс может быть объявлен с ключевым словом расширения __gc перед ним. Такие как:
//interface.cpp #using lt;mscorlib.dllgt; __gc __interface ClassBase { void Init(); int Common(); }

Приведенный выше код должен быть скомпилирован с помощью / clr и / LD для создания простого файла DLL.

Примечания:

  • __Gc __interface не может содержать какие-либо элементы данных, статические члены, объявления вложенных классов и спецификаторы доступа.
  • __Gc __interface может наследовать только от другого интерфейса __gc __interface или System:: Object. Наследование от System:: Object - поведение по умолчанию.
  • __Gc __interface не может содержать какую-либо реализацию (основной код) своих объявленных прототипов функций.
Сравнение с другими языками

Ниже приведены основные положения и стандарты программирования, которые отличаются между управляемым C ++ и другими хорошо известными языками программирования, имеющими схожую концепцию.

Стандартный C ++

Недостатки

  • собственный код C ++ может быть быстрее во время выполнения.
  • C ++ не требует установки связанного компилятора и управляемой среды выполнения в целевой системе.
  • C ++ поддерживает универсальное программирование. Однако до окончательной версии C ++ / CLI программисты Managed C ++ должны искать обходные пути для использования универсальных шаблонов.
  • C ++ поддерживает ключевое слово «const» и корректность const. Управляемый C ++, как и Java и C #, не содержит этой функции. Альтернативой является сделать управляемый класс неизменяемым или ограничить набор средств доступа для общедоступных интерфейсов.
  • Код C ++ не ограничен ограничениями CLR. Например, среда CLR не позволяет классам наследовать другие классы конфиденциально или защищенно, поэтому следующее приведет к ошибке компилятора:
public __gc class one { int i; }; public __gc class two: private one { int h; i = h; }; // error public __gc class three: protected one { int h; i=h;}; // error
  • Управляемые классы C ++ __gc не могут наследовать более чем от одного класса, поэтому следующее приведет к ошибке компилятора:
__gc class a {}; __gc class b {}; __gc class c: public a, public b {}; //will produce an error

Преимущества

  • Управляемый C ++ поддерживает большую степень отражения, чем обычный C ++, что, как правило, намного удобнее в зависимости от функции кода или того, для чего он предназначен.
  • Управляемый C ++ может взаимодействовать со всеми другими языками, поддерживающими.NET, включая языки сторонних разработчиков.
  • Управляемый C ++ - это сборщик мусора. В стандартном C ++ за управление памятью и ее выделение отвечает программист.

Ява

Отличия

  • Для запуска кода Java требуется соответствующая виртуальная машина, а для запуска управляемого кода C ++ требуется соответствующая реализация.NET Framework.

Недостатки

  • Java предоставляет документацию по исходному коду, а Managed C ++ - нет.
  • Java имеет множество других инструментов разработки, доступных Java-программистам, в то время как Managed C ++ доступен только в Visual Studio.NET.

Преимущества

  • Управляемый C ++ может получить доступ к компьютерной системе через интерфейс низкого уровня намного проще, чем Java. Программисты на Java должны использовать JNI (собственный интерфейс Java) для использования низкоуровневых служб операционной системы хоста.

C #

Отличия

  • Хотя C # поддерживает указатели так же, как и в C ++, эта функция по умолчанию отключена.

Недостатки

  • Как и Java, C # синтаксически проще при работе с управляемым кодом.
  • C # может достичь в основном того же результата, что и Managed C ++, поскольку все синтаксические и структурные соглашения остаются поразительно похожими.
  • Управляемый C ++, хотя и является строго типизированным языком из-за его введения в CLR, может быть подвержен ошибкам, если неуправляемый скомпилированный код вводится в той же кодовой базе, а C # - это чистый MSIL.

Преимущества

  • C # должен использовать.NET Framework и предоставленные библиотеки классов для доступа к компьютерной системе на низком уровне.
  • Перенести приложения на.NET Framework с C или C ++ намного проще с помощью Managed C ++.
  • Компилятор Microsoft Visual C ++.NET, который компилирует Managed C ++ для работы с.NET Framework, создает гораздо более зрелый набор инструкций в своей результирующей сборке, тем самым повышая производительность.
Смотрите также
Рекомендации
внешняя ссылка
Последняя правка сделана 2024-01-01 05:07:37
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте