Видение глазами Microsoft
Сегодня мы продолжим начатый в прошлом месяце разговор о компиляторах C/C++. На этот раз речь пойдет о компиляторах для Windows, точнее, об одном из самых известных таких компиляторов - Microsoft Visual C. Предвидя презрительные ухмылки тех, кто недолюбливает Microsoft, сразу же следует сказать, что продукт этот, в отличие от многих других разработок корпорации, можно, не кривя душой, назвать надежным, полезным и интересным. Многие разработчики под Windows отдают предпочтение именно ему, несмотря на богатство выбора других средств разработки, в том числе и визуальных.
Такая популярность вызвана в первую очередь двумя факторами - мощью продукта и эффективностью получающегося кода. Почему по этим двум показателям у Visual C практически нет конкурентов, очень легко понять - такая система, как Windows, при всех своих достоинствах и недостатках является чрезвычайно комплексным продуктом, поэтому по-настоящему полно использовать ее возможности (в том числе и недокументированные) могут только ее разработчики.
В этой статье я постараюсь описать особенности (а, точнее, достоинства) Visual C так, как они представляются Microsoft. Затем несколько критических замечаний по поводу изложенного (следует считать эти замечания лишь моим личным мнением - не более). Итак, приступим.
1. Система разработки
Компоненты системы разработки призваны максимально упростить создание приложения. В первую очередь к ним относится интегрированный в среду Visual C отладчик CodeView. Он позволяет осуществлять полномасштабную отладку кода, то есть трассировку, установку точек останова и просмотр значений переменных.
Другим важным интегрированным компонентом является редактор ресурсов, а точнее - редакторы ресурсов, по одному для каждого их типа (картинки, меню, диалоги и т.п.). Кроме того, среда включает в себя утилиту Spy++, позволяющую в графическом виде представлять системные процессы, окна, сообщения и другие системные ресурсы.
Утилита MFC Tracer позволяет программисту менять флаги управления трассировкой при отладке приложений, использующих MFC (Microsoft Foundation Class). Утилита Test Container позволяет быстро тестировать управляющие элементы интерфейса.
2. Инструменты, не вошедшие в IDE
Следующие два инструмента не вошли в IDE. Утилита Pview (Process View) позволяет быстро устанавливать параметры, необходимые для отслеживания выполняемых процессов, потоков и квантования процессорного времени. Он позволяет определить объемы памяти, необходимые для выполнения различных участков кода, размер swap-файла, распределение процессорного времени между потоками и другие важные сведения, касающиеся выполнения программ.
Утилита WinDiff предназначена для сравнения файлов и каталогов.
3. Особенности компилятора
Самой важной особенностью компилятора Visual C является возможность генерации так называемого P-кода (сокращение от packed code - упакованный код). Использование его нацелено на уменьшение размера приложения. Идея P-кода заключается в том, что инструкции записываются в выполняемый модуль не непосредственно, а в специальном, упакованном, виде. Затем в него добавляется специальный интерпретационный модуль небольшого размера, осуществляющий распаковку и выполнение инструкций во время работы программы. Для каждого отдельного участка кода можно указать, следует ли компилировать его непосредственно или же в P-код. Упаковывая некритичные по времени исполнения участки (например, связанные с построением интерфейса), можно значительно снизить объем приложения.
Другой важной особенностью компилятора является возможность предварительной компиляции заголовочных файлов и участков кода. При грамотной работе можно добиться того, что перекомпилироваться будут только редактируемые в текущий момент участки кода, что ускорит разработку приложения.
4. Библиотека Microsoft Foundation Class
Каждый, кто хоть однажды сталкивался с разработкой для Windows, прекрасно знает, что разработка интерфейса при помощи вызовов API есть тяжелый и неблагодарный труд. К счастью, в этом особой нужды обычно не возникает - любая мало-мальски приличная компания, выпуская средство разработки для Windows, оснащает его необходимой для простого построения интерфейса библиотекой (как правило, объектной). В Visual C для этих (и не только) целей существует библиотека MFC (Microsoft Foundation Class). Она имеет следующие преимущества.
Библиотека полностью инкапсулирует API. При этом она легка для изучения - Microsoft предпринимала целенаправленные усилия, чтобы сделать имена функций и их параметры как можно более схожими с их прототипами API. Такой подход позволяет легко переходить от API к MFC и обратно и имеет своей целью облегчить жизнь программистов, знакомых с одним интерфейсом, но не знакомых с другим.
Использование библиотеки позволяет генерировать исключительно эффективный код, работающий почти так же быстро, как код, написанный на чистом API. При этом он почти не потребует дополнительной памяти по сравнению с аналогом на API.
Библиотека MFC дает возможность автоматической обработки сообщений. Благодаря использованию объектного подхода, цикл обработки сообщений не нужно представлять в исходном модуле в явном виде.
MFC дает возможность самодиагностики - можно собрать содержимое различных объектов в файл, а затем проанализировать состояние внутренних переменных в удобном виде.
MFC имеет надежную архитектуру: она позволяет осуществлять структурированную обработку исключительных ситуаций.
MFC может работать совместно с API в рамках одного и того же приложения. Это не вызовет конфликтов.
Классы MFC, связанные с обработкой строк и файлов, можно использовать в приложениях MS-DOS.
4. От автора
После обозрения вышеизложенного начинает представляться, что Visual C - это мечта любого программиста. Эффективность и простота освоения - чего еще желать? Но на самом деле все обстоит не так хорошо, как представляется Microsoft.
Инструменты, включенные и не включенные в IDE, не представляют из себя по сути ничего особенного. Безусловно, они разработаны безупречно и позволяют облегчить разработку, но точно такие же присутствуют в практически любой реализации Си под Windows. Сама IDE, по моему мнению, является чрезмерно "навороченной". Она разит глаз обилием окошек и невозможностью найти что-либо с первого раза, что отпугивает. Кроме того, разрешения 800*600 для всех этих красот явно мало - окошки выглядят слишком мелкими. Однако следует отметить очень приятный отладчик, практически не уступающий ставшему стандартом качества борландовскому.
Компилятор генерирует не самый лучший код для MS-DOS - с Watcom и GNU ему не тягаться. Но для разработки под Windows он, безусловно, вне конкуренции.
MFC, несмотря на все усилия Microsoft, никак нельзя назвать легкой для освоения. Впрочем, нельзя сказать этого и обо всем продукте в целом - тяжесть "въезда" просто отпугивает. Огромные тома online-документации не столько помогают пользователю, сколько запутывают его. На освоение Visual C потребуется не один месяц.
Возможности скрытия цикла обработки сообщений и структурированной обработки исключений никак нельзя назвать уникальными - подобные присутствуют в практически любой среде разработки для Windows.
Архитектура MFC действительно удивительно продумана и надежна, объектная модель достаточно красива. Но здесь есть одно "но". В результате того, что все классы библиотеки связаны между собой, становится очень трудно модифицировать лишь один из них - такая модификация немедленно воздействует на многие другие классы.
API и MFC действительно могут уживаться в одной программе, вопрос в том, следует ли считать это хорошим стилем. Также вызывает сомнения целесообразность использования MFC в программах MS-DOS постольку, поскольку возникают сомнения в целесообразности самой разработки для MS-DOS на Visual C.
Резюмируя, следует отметить, что хоть Visual C и является одним из самых мощных (если не самым мощным) средств разработки для Windows, он в то же время является и одним из самых тяжелых для освоения. По-видимому, смысл пользования этим продуктом имеется лишь при написании по-настоящему критичных по используемым ресурсам приложений. В других случаях можно обойтись чем-нибудь попроще.
Денис МАРГОЛИН
Горячие темы