Введение

Расширения языка C++ от Microsoft, устаревшие в 2004 году

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

История

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

Дизайн

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

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

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

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

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

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

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

Сравнение с другими языками

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