Разработка приложений на C++
MS VS 2008 обеспечивает чрезвычайную гибкость в части разработки разнообразных типов приложений и программных компонентов. Для приложений Windows, ориентированных на CLR, в качестве базы построения GUI (Graphical User Interface – графический интерфейс пользователя) используется каркас Windows Forms, предоставленный библиотекой базовых классов .NET Framework. Применение Windows Forms обеспечивает быструю разработку GUI, поскольку программист собирает его графически из стандартных компонентов и получает полностью автоматически сгенерированный код. Затем необходимо лишь провести небольшую настройку сгенерированного кода, чтобы добиться необходимой функциональности.
Для получения "родного" исполняемого кода также имеется несколько способов. Один из них – использование библиотеки классов Microsoft Foundation Classes (MFC) для программирования графического интерфейса пользователя Windows-приложения. MFC инкапсулирует программный интерфейс операционной системы Windows (Windows API в части создания и управления GUI) и значительно облегчает процесс разработки программ. Windows API появился до того, как появилась версия языка С++, поэтому он не имеет никаких объектно-ориентированных характеристик. Однако программисту не обязательно применять MFC. Если необходим выигрыш в производительности и разработчик ПО владеет навыками работы с API-библиотекой, то можно непосредственно из своего кода C++ обращаться к Windows API.
Код C++, выполняемый под управлением CLR, называется управляемым C++, потому что данные и код находятся под контролем CLR. В программах CLR освобождение памяти, динамически выделенной для размещения данных, осуществляется автоматически, что позволяет исключить главный источник ошибок "родных" приложений C++. Код C++, который выполняется вне CLR, в документации Microsoft иногда называется неуправляемым C++, поскольку CLR в его выполнении не участвует. В неуправляемом C++ необходимо самостоятельно заботиться о выделении и очистке памяти во время выполнения программы, а также самостоятельно обеспечивать безопасность, которая в CLR уже обеспечена. При этом неуправляемый C++ обычно принято называть «родным» C++, потому что он компилируется непосредственно в «родной» машинный код.
На рис. 1.1 показаны основные варианты выбора, которые существуют при разработке приложений C++. При этом надо понимать, что это не полная картина. Приложение может состоять частично из управляемого C++, а частично – из «родного» кода, то есть программист жестко не привязан к одной или другой среде. Однако при смешивании разнородного кода часть функциональности может быть потеряна, поэтому прибегать к этому стоит только при необходимости, например, когда требуется перенести существующее «родное» приложение C++ под управление CLR. Стоит также помнить, что невозможно получить преимущества, присущие управляемому C++, в «родном» коде C++. К тому же взаимодействие между управляемыми и неуправляемыми компонентами программы влечет за собой определенные накладные расходы. Поэтому, при разработке новых приложений, в первую очередь необходимо решить каким должен быть его код – управляемым или неуправляемым.
Родной С++ |
Родной С++ |
MFC |
Общеязыковая исполняющая среда (CLR) |
Каркасные классы (MSIL) |
Управляемый С++ |
Операционная система |
Аппаратное обеспечение |
Рис. 1. Схема вариантов выбора типа приложения
Естественно новые возможности не могут быть однозначными: некоторые свойства одним экспертом будут оцениваться как достоинства, у другого эксперта они же могут получить негативную оценку. Самые большие нарекания у опытных программистов-системщиков вызывает повышенный уровень безопасности работы с динамически выделяемой памятью, отсутствие указателей и возможности прямой работы с ними, а также некоторая потеря быстродействия. С точки зрения этих экспертов все эти ограничения выводят язык С из разряда системного языка программирования и ставят его в ряд прикладных языков, т. е. часть присущих только языку С особенностей просто теряется взамен на возможность соединять в одном проекте модули на разных языках программирования. Любая точка зрения на проблему, если она высказана корректно, имеет право на существование. Поэтому каким из методов пользоваться и какой точки зрения придерживаться каждый программист решает для себя сам. Авторы же предпочитают традиционный подход, поэтому все примеры в учебном пособии приводятся на «родном» С++, а приложения под Windows будут использовать MFC-библиотеку.