- •Глава 1 История развития языков и технологии программирования.
- •Особенности работы с MicrosoftVisualStudio2008.
- •Среда .NetFramework
- •Общеязыковая исполняющая среда (clr)
- •Описание составных частей Microsoft Visual Studio 2008
- •Использование ide
- •Проекты и решения
- •Глава 2 переменые, константы и типы данных.
Особенности работы с MicrosoftVisualStudio2008.
Как и любая из версий Microsoft Visual Studio версия 2008 заявлена разработчиком как много языковая среда разработки программ. История развития этого ряда продуктов фирмы Microsoft это попытка создать не только многоязыковую среду программирования (что им давно удалось, языки С++, С#, Visual Basic,*/** ) , но и среду позволяющую собирать в одном проекте программы, написанные в различных языках программирования.
Среда .NetFramework
Существуют два принципиально отличающихся вида приложений C++, которые можно разрабатывать в Visual C++ 2008. Можно писать приложения, которые выполняются на компьютере как "родные" (native). Эти программы называются родными программами C++. Такие программы пишутся на версии языка C++, определенной стандартом ISO/ANSI (International Standards Organization/American National Standards Institute). Также можно разрабатывать программы, выполняющиеся под управлением CLR и реализованные с помощью расширенной версии C++, которая носит название C++/CLI. Эти программы называются программами CLR, или программами C++/CLI.
.NET Framework не является частью Visual C++ 2008, а скорее компонентом операционной системы Windows, облегчающим построение приложений и Webслужб. Каркас .NET Framework предоставляет ощутимые преимущества в отношении надежности кода и безопасности, а также возможностей интегрирования кода C++ с кодом, написанным на более чем 20 других языках программирования, ориентированных на .NET Framework. Некоторым недостатком ориентации на .NET Framework является незначительное снижение производительности, которое, правда, в большинстве случаев вообще незаметно.
. Среда .NET Framework состоит из двух элементов: общеязыковой исполняющей среды (Common Language Runtime—CLR), в которой выполняются программы, и набора библиотек, называемых библиотеками классов .NET Framework. Библиотека классов .NET Framework обеспечивает функциональную поддержку, которая необходима коду при выполнении под управлением CLR, независимо от применяемого языка программирования, поэтому программы .NET, написанные на С++,С# или любом другом языке, поддерживающем .NET Framework, используют одни и те же библиотеки .NET.
Общеязыковая исполняющая среда (clr)
CLI— это, по сути, спецификация среды виртуальной машины, которая позволяет приложениям, написанным на разнообразных высокоуровневых языках программирования, выполняться в различных системах без изменения и перекомпиляции оригинального исходного кода. CLI специфицирует стандарт промежуточного языка виртуальной машины, в который компилируется исходный код высокоуровневого языка программирования. В .NET Framework этот промежуточный язык называется Microsoft Intermediate Language (MSIL). Код этого промежуточного языка в конечном итоге при выполнении программы отображается на машинный код с помощью оперативного компилятора (just-in-time — JIT). Конечно, код на промежуточном языке CLI может функционировать только в среде, для которой существует реализация CLI.
CLI также определяет общий набор типов данных, называемый общей системой типов (Common Type System — CTS), который должен использоваться программами, написанными на любом языке, ориентированном на реализацию CLI. CTS специфицирует то, как применяются типы данных внутри CLR, и включает в себя набор предопределенных типов. Можно также определять собственные типы данных, но их определение должно подчиняться ряду правил, чтобы они были согласованными с CLR. Наличие стандартизованной системы типов для представления данных позволяет компонентам, написанным на разных языках, обрабатывать данные унифицированным способом и обеспечивает возможность интеграции компонентов, написанных на разных языках, в одно приложение.
Безопасность данных и надежность программ в значительной степени расширены CLR, отчасти благодаря тому, что динамическое выделение и освобождение памяти полностью автоматизированы, а отчасти потому, что код программ MSIL полностью верифицируется перед выполнением программы. CLR — это только одна из реализаций спецификации CLI, которая функционирует под управлением Microsoft Windows на ПК.
Написание приложений на C++
Visual C++ 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++, к тому же взаимодействие между управляемыми и неуправляемыми компонентами программы влечет за собой определенные накладные расходы. Однако возможность смешения управляемого и неуправляемого кода может оказаться чрезвычайно полезной, когда нужно разработать или расширить существующий неуправляемый код, но при этом в некоторых местах воспользоваться преимуществами CLR. Конечно, при разработке новых приложений нужно в самом начале решить, должен быть его код управляемым или нет.
Естественно новые возможности не могут быть однозначными: некоторые свойства одним экспертом будут оцениваться как достоинства, у другого эксперта они же могут получить негативную оценку. Самые большие нарекания у опытных программистов-системщиков вызывает повышенный уровень безопасности работы с динамически выделяемой памятью, отсутствие указателей и возможности прямой работы с ними, а так же некоторая потеря быстродействия. С точки зрения этих экспертов все эти ограничения выводят язык С из разряда системного языка программирования, и ставят его в ряд прикладных языков. (то есть часть присущих только языку С особенностей просто потеряна из-за сомнительного удовольствия соединять в одном проекте модули на разных языках программирования). Любая точка зрения на проблему, если она высказана корректно, имеет право на существование. Поэтому каким из методов пользоваться и какой точки зрения придерживаться, каждый программист решает для себя сам. Авторы предпочитают традиционный подход, поэтому все примеры в пособии будут написаны на «родном» С++, а приложения под Windows будут использовать MFC библиотеку. Так как ограничить применение тех или иных известных вещей всегда проще, чем изучать что-то новое, такой подход к проблеме кажется достаточно обоснованным
Консольные приложения
Наряду с разработкой приложений для Windows, Visual C++ 2008 также позволяет писать, компилировать и тестировать программы C++, которые не несут с собой весь багаж, необходимый программам Windows — т.е. символьно-ориентированные программы командной строки. Эти программы называются в Visual C++ 2008 консольными приложениями, потому что пользователь взаимодействует с ними через клавиатуру и экран, работающий в символьном режиме. Внешний вид этих приложений соответствует работе с командной строкой. Эти приложения являются приложениями формата ОС DOS.
Написание консольных приложений может показаться отклонением от основной цели программирования Windows, но когда речь идет об изучении C++ (что совершенно необходимо перед тем, как погрузиться в программирование для Windows) — это наилучший способ. Даже в самой простой Windows-программе присутствует слишком много кода, и очень важно, чтобы сложности, связанные с программированием под Windows, не затмили азы C++.
Таким образом, изучая C++ при помощи консольных приложений можно сосредоточить внимание на языковых средствах, не заботясь о среде, в которой они работают. В консольных приложениях, программист имеет дело только с текстовым интерфейсом, но этого вполне достаточно для понимания C++, поскольку в определении языка отсутствует описание каких-либо средств графики. Естественно, вся необходимая информация о программировании графического пользовательского интерфейса будет предоставлена, когда очередь дойдет до написания программ под Windows с применением MFC на "родном" C++.
Microsoft Visual Studio 2008 является достаточной системой для написания программ на языке С++. То есть она содержит всё, что необходимо программисту для создания своего приложения. Такие системы называются интегральными системами (средами) разработки программ. На самом деле это ПО может гораздо больше, чем просто удовлетворить потребности одного программиста, знающего или изучающего язык С. Прежде чем приступить к описанию составных частей Microsoft Visual Studio 2008, необходимо рассмотреть последовательность действий приводящих к готовому программному продукту.
Жизненный цикл любой программы состоит из следующих этапов:
постановка задачи;
анализ исходных данных и выбор методов решения, моделирование;
разработка алгоритма программы;
перевод алгоритма на язык программирования;
компиляция и поиск синтаксических ошибок;
тестирование и поиск логических ошибок;
сдача заказчику и ввод в эксплуатацию;
поддержка функционирования.
Разберём более подробно каждый этап. На примере решения квадратного уравнения.
Постановка задачи выглядит следующим образом: написать программу решающую квадратное уравнение. Даны вещественные a,b,c, необходимо найти все существующие действительные х, удовлетворяющие уравнению
.
Первый этап -- постановка задачи успешно
завершён, обычно постановка вырабатывается
совместно с представителем заказчика
программы и представителя разработчика.
Она должна быть четко, однозначно
сформулирована. И полностью определять
поставленную задачу. Например при
данной формулировке заказчику не важен
внешний вид программы. Поэтому можно
использовать консольные приложения.При анализе исходных данных определяются возможные ограничения на них. В нашем случае это условие
.
Если этот анализ начальных данных не
сделать программа будет не устойчива,
то есть при попадании в такие точки
возможно некорректное завершение
программы. Если формулировка задачи
сделана не в формульном виде, или любом
другом виде пригодном для решения
необходимо переформулировать задачу.
Поиск нужного вида – это процесс
моделирования. Тип модели и методы
решения подбираются под конкретную
задачу. Часто требуется консультация
со специалистом по данной предметной
области. Наша задача уже сформулирована
в терминах математической модели,
необходимо только вспомнить из курса
школьной математики или посмотреть в
справочнике формулы решения. Далее необходимо разработать алгоритм решения. Алгоритм – это однозначно определённый набор действий, приводящий к решению конкретной задачи за конечное число шагов. Задача должна принадлежать кругу рассматриваемых алгоритмом задач. То есть, нельзя найти значения определённого интеграла используя алгоритм решения квадратного уравнения.
Алгоритмы часто представляются в каком-либо наглядном виде, например в виде блок-схем или инструкции. В этом случае можно рассматривать рецепты из кулинарной книги, как алгоритмы для приготовления тех или иных блюд. В нашем случае алгоритм имеет следующий вид: слева описание алгоритма в виде инструкции, справа в виде блок схемы (предполагается, что с графическим представлением алгоритмов читатель ознакомился в школьном курсе «Информатика»).
Начало. Ввести с
клавиатуры три действительных числа,
соответствующих коэффициентам уравнения
a,b,c.
Если
прекратить программу сообщением «а не
должно быть 0», иначе вычислить дискриминант
по форме
.
Если
прекратить программу сообщением
«действительных решений нет», если
дискриминант =
0,
то вычислить один корень по формуле
и прекратить программу сообщением «один
действительный корень х=… » Если
,
то вычислить оба корня по формулам
и прекратить программу сообщением «два
действительных корня х1= … и х2=…» на
месте многоточий должны стоять вычисленные
значения. Конец.
Далее необходимо полученный алгоритм перевести на какой-либо язык программирования, в нашем случае это язык С. Эта часть пока будет пропущена. Результатом этого этапа будет текстовый файл, наиболее удобно набрать его во встроенном редакторе Microsoft Visual Studio 2008, в этом случае файл будет иметь расширение .cpp и называться файлом исходного кода.
Исходный файл компилируется при помощи компилятора. В процессе компилятор обнаружит (если они есть) синтаксические ошибки и предложит программисту их исправить. После внесения исправлений необходимо снова запустить компилятор. И повторять этот процесс до тех пор, пока не будут исправлены все ошибки, то есть компиляция пройдёт успешно. В результате данного процесса появиться файл объектного кода (с расширением .obj). Это машинный файл, соответствующий тексту исходного файла, но он еще не может выполняться, так как в нем не хватает кода стандартных библиотек. Добавлением этого кода, а так же собиранием проекта в единое целое занимается компоновщик. В результате его работы возникает выполняемый файл с расширением .exe.
Процесс тестирования необходим для того, что бы убедится в правильности работы программы, отследить все возможные ветви решений. Тестирование проходит при помощи тестовых значений. Это начальные значения при которых известен результат решения поставленной задачи. Они должны быть подобраны таким образом, что бы отследить все возможные варианты решений. Для нашей задачи такими тестовыми значениями могут быть наборы: 0,2,3 (отслеживается выход если а=0), 2,1,1 (дискриминант <0), 1,2,1 (дискриминант =0, х должно равняться -1) и наконец 1,0,-4 (дискриминант >0 и х1=2, х2=-2). Если ожидаемый результат не совпадает с полученным программой необходимо локализовать логические ошибки. Для этого очень удобна отладка. Если ошибок не выявлено, можно переходить к следующему пункту.
При сдаче программы заказчику возможны две различных ситуации. Первая, если предоставляется выполняемый файл, то это должен быть (в идеале) инсталляционный файл, который правильно установиться на ПК заказчика, будет содержать всё необходимое для работы, и ни в коем случае, не требовать в обязательном порядке наличия Microsoft Visual Studio 2008. Это требует определённых усилий и владением навыков создания независимых приложений и инсталляционных пакетов. Второй вариант, когда предоставляется исходные файлы проще. В этом случае предполагается что, у заказчика есть среда разработки (она указывается в задании) и окончательная компиляция будет проходить на ПК заказчика.
На этапе поддержки функционирования у программиста могут потребовать внести изменения в код программы, провести обновление (если было указано в задании) или устранить выявленные в ходе эксплуатации ошибки. Если заказчику предоставлялся выполняемый файл, то скорее всего, всё вышеперечисленное будет делать разработчик ПО, а если – исходные файлы, то возможно у заказчика есть свой программист.
В предложенной схеме не рассматривалась командная работа и оформление всей документации на работу разработчика и сам программный продукт. Эти сведения содержатся в курсе «Технологии программирования».
