В этой статье рассказывается о расширениях языка 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, создает гораздо более зрелый набор инструкций в своей результирующей сборке, тем самым повышая производительность.
Смотрите также
Рекомендации
внешняя ссылка