Управляемые расширения для C ++ - Managed Extensions for C++
Эта статья слишком полагается на Рекомендации к основные источники.Июнь 2018 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Управляемые расширения для C ++ или же Управляемый C ++ это устаревший набор языковых расширений для C ++, включая грамматические и синтаксические расширения, ключевые слова и атрибуты, чтобы сделать синтаксис и язык C ++ .NET Framework. Эти расширения были созданы Microsoft чтобы код C ++ был нацелен на общеязыковая среда выполнения (CLR) в виде управляемый код, а также продолжать взаимодействовать с собственным кодом.
В 2004 году расширения Managed C ++ были значительно переработаны, чтобы уточнить и упростить синтаксис, а также расширить функциональные возможности за счет включения управляемых дженерики. Эти новые расширения были обозначены C ++ / CLI и включен в Microsoft Visual Studio 2005.[1] Период, термин Управляемый C ++ и, таким образом, расширения, на которые он ссылается, устарели и заменяются новыми расширениями.
История
Microsoft представила управляемые расширения для C ++ в Microsoft Visual C ++ 2002 г. (MSVC ++). Microsoft попыталась минимизировать отклонения между стандартным C ++ и управляемыми расширениями для C ++, в результате чего основные различия между ними были синтаксически скрыты. MSVC ++ 2003 и 2005 также обеспечивали поддержку написания программ на управляемом C ++. В 2004 году Managed Extensions для C ++ устарели в пользу C ++ / CLI, вторая попытка Microsoft поддержать программирование для Инфраструктура общего языка с использованием C ++.[2]
Дизайн
Удалось относится к управляемый код что он запущен, или удалось автор: .NET виртуальная машина который функционирует как песочница для повышенной безопасности в виде дополнительных проверок времени выполнения, таких как проверки переполнения буфера. Кроме того, приложения, написанные на Managed 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 ++ управляемый 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// новая директива using# using // другая директива using namespace.с помощью пространство имен Система;int главный(){ Консоль::WriteLine("Привет, мир!"); возвращаться 0;}
Новая директива препроцессора
# using
необходимо. В дополнение к этому, требуется больше директив #using для импорта большего количества библиотек для использования большего количества пространств имен в библиотеке базовых классов, таких как
# using
и
с помощью пространство имен Система::Windows::Формы;
использовать Windows Forms.
- Чтобы скомпилировать код для целевой среды CLR, необходимо ввести новый параметр компилятора.
cl.exe hello.cpp / clr
/ clr позволяет компилировать любой код, ссылающийся на .NET Framework, как CIL.
- Класс может быть назначен для сбора мусора через
__gc
ключевое слово расширения.
//gc.cpp# using __gc учебный класс gc{ int* я; char* грамм; плавать* j;};int главный(){ пока (истинный) { gc^ _gc = gcnew gc(); } возвращаться 0;}
Предыдущий код можно скомпилировать и выполнить, не опасаясь утечки памяти. Потому что класс gc
управляется сборщиком мусора, нет необходимости вызывать Удалить
оператор. Чтобы добиться того же с неуправляемым кодом, Удалить
требуется ключевое слово:
//nogc.cppучебный класс gc{ int* я; char* грамм; плавать* j;};int главный(){ пока (истинный) { gc* _gc = новый gc(); Удалить _gc; } возвращаться 0;}
Примечания:
- У назначенного класса __gc может быть объявлен конструктор.
- У назначенного класса __gc может быть объявлен деструктор.
- Назначенный __gc класс не может наследовать более одного класса. (Это ограничение CLR)
- Обозначенный __gc класс не может наследовать другой класс, не обозначенный __gc.
- Обозначенный класс __gc не может быть унаследован другим классом, не обозначенным __gc.
- Назначенный класс __gc может реализовывать любое количество интерфейсов __gc.
- Назначенный класс __gc не может реализовать неуправляемый интерфейс.
- Назначенный __gc класс по умолчанию не становится видимым за пределами его собственной сборки. Использовать
общественный __gc учебный класс Привет { };
ключевое слово public для изменения доступа назначенного класса a __gc.
Назначенный класс __gc может быть уничтожен вручную с помощью ключевого слова delete, но только если у назначенного класса __gc есть определенный пользователем деструктор.
- Интерфейс может быть объявлен с ключевым словом расширения __gc перед ним. Такие как:
//interface.cpp# using __gc __интерфейс ClassBase{ пустота В этом(); int Общий();}
Приведенный выше код должен быть скомпилирован с помощью / 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 не позволяет классам наследовать другие классы конфиденциально или защищенно, поэтому следующее приведет к ошибке компилятора:
общественный __gc учебный класс один { int я; };общественный __gc учебный класс два: частный один { int час; я = час; }; // ошибкаобщественный __gc учебный класс три: защищенный один { int час; я=час;}; // ошибка
- Управляемые классы C ++ __gc не могут наследовать более чем от одного класса, поэтому следующее приведет к ошибке компилятора:
__gc учебный класс а {};__gc учебный класс б {};__gc учебный класс c: общественный а, общественный б {}; // выдаст ошибку
Преимущества
- Управляемый 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 ++, эта функция по умолчанию отключена.
Недостатки
- Нравиться Ява, 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, создает гораздо более зрелый набор инструкций в своей результирующей сборке, тем самым повышая производительность.
Смотрите также
Рекомендации
- ^ «Руководство по переводу: перенос программ с управляемых расширений для C ++ на C ++ / CLI». Microsoft. Август 2004 г.. Получено 2009-11-11.
- ^ Саттер, Херб. «Обоснование дизайна для C / C ++» (PDF). п. 6. В архиве (PDF) из оригинала на 30.08.2017. Получено 2018-06-12.