Диплом. Диплом1. Теоретические основы разработки программного обеспечения
Скачать 125.49 Kb.
|
1 2 Глава 1. Теоретические основы разработки программного обеспечения 1.1. Основные понятия разработки программного обеспечения В наши дни понятие программного обеспечения имеет достаточно широкую трактовку. От него зависит функционирование подавляющего большинства компьютерной техники, электронных приборов и любого другого интеллектуального оборудования. Программное обеспечение функционально совершенствуется, но при этом упрощается в использовании. На данный момент нет чётких терминологических понятий, дающий определение программному обеспечению. Все определения условны и неконкретны. Но всё же общее определение вывести можно. Программное обеспечение – это взаимодействие каждой из частей системы логической цепочки нулей и единиц, работающих по определённому алгоритму обработки и работы с информацией, которые также могут являться программами. Разработка программного обеспечения – это деятельность по созданию нового программного обеспечения. В реальности разработка программного обеспечения обычно определяется требуемым набором функций или сроком сдачи проекта. Приведём основные понятия разработки программного обеспечения. Персонал – те, кто разрабатывают программное обеспечение (т.е. разработчики). Команда разработчиков работает наилучшим образом, если каждый участник имеет определённые обязанности и знает, что он должен делать. Другая сторона аспекта персонала – это лица, заинтересованные в проекте: заказчики, пользователи и инвесторы. В любом производстве результаты определяются используемой технологией. В силу специфичности производства программного обеспечения (практически нулевая стоимость тиражирования, очень быстрое моральное старение и т.д.) технология его создания сильно зависит от качества команды разработчиков, поэтому должна включать в себя организационный и управленческий аспекты. Для оценки возможностей команды разработчиков используется модель зрелости возможностей. Процесс – это способ, которым ведётся разработка программного обеспечения. Выделяют водопадный процесс, итеративный процесс, индивидуальный процесс разработки и командный процесс разработки. Продукт – это не только программное обеспечение, но и все составляющие его артефакты. Под артефактами понимаются объектные модули, исходный код, документация, результаты тестов и измерений продуктивности. Проект – совокупность действий, необходимая для создания артефактов. Проект включает в себя контакт с заказчиком, написание документации, проектирование, написание кода и тестирование продукта. Инструментарий технологии программирования – это совокупность программ и программных комплексов, обеспечивающих технологию разработки, отладки и внедрения создаваемых программных продуктов. На рис. 1 показана структура инструментария технологии программирования. Рис. 1. Инструментарий технологии программирования Средства для создания приложений – это локальные средства, обеспечивающие выполнение отдельных видов работ по созданию программ. Они включают в себя языки и системы программирования, а также инструментальную среду пользователя. Язык программирования – это формализованный язык для описания алгоритма решения задачи на компьютере. Языки программирования делятся на следующие классы: машинные языки – языки программирования, воспринимаемые аппаратной частью компьютера (машинные коды); машинно-ориентированные языки – языки программирования, которые отражают структуру конкретного типа компьютера (ассемблеры); алгоритмические языки – не зависящие от архитектуры компьютера языки программирования для отражения структуры алгоритма (Паскаль, бейсик, Фортран и др.); процедурно–ориентированные языки – языки программирования, где имеется возможность описания программы как совокупности процедур (подпрограмм); проблемно–ориентированные языки – предназначены для решения задач определенного класса (Lisp); Другой классификацией языков является их деление на языки, ориентированные на реализацию основ структурного программирования, основанного на модульной структуре программного продукта и типовых управляющих структурах алгоритмов обработки данных различных программных модулей, и объектно-ориентированные языки, поддерживающие понятие объектов, их свойств и методов обработки. Системы программирования – это комплекс инструментальных программных средств, предназначенных для работы с программами на одном из языков программирования. Системы программирования включают в себя компилятор (транслятор), интегрированную среду разработки программ (не всегда), отладчик, средства оптимизации кода программ, набор библиотек, редактор связей, сервисные средства (утилиты) (для работы с библиотеками, текстовыми и двоичными файлами), справочные системы и систему поддержки и управления продуктами программного комплекса. Инструментальная среда пользователя – это специальные средства, встроенные в пакеты прикладных программ, такие, как: - библиотека функций, процедур, объектов и методов обработки; - макрокоманды; - клавишные макросы; - языковые макросы; - конструкторы экранных форм и объектов; - генераторы приложений; - языки запросов высокого уровня; - конструкторы меню и др. Интегрированные среды разработки программ объединяют набор средств для их комплексного применения на технологических этапах создания программы. CASE-технология – это программный комплекс, автоматизирующий весь технологический процесс анализа, проектирования, разработки и сопровождения сложных программных систем. Средства CASE-технологий делятся на: - встроенные в систему реализации – все решения по проектированию и реализации привязки к выбранной СУБД; - независимые от системы реализации – решения по проектированию, ориентированные на унификацию (определение) начальных этапов жизненного цикла программы и средств их документирования и обеспечивающие большую гибкость в выборе средств реализации. Основное достоинство CASE-технологии – это поддержка коллективной работы над проектом за счёт возможности работы в локальной сети разработчиков, экспорта (импорта) любых фрагментов проекта, организованного управления проектами. В некоторых CASE-системах поддерживается создание каркаса программ и создание полного продукта. 1.2. Алгоритм разработки программного обеспечения Алгоритм разработки программного обеспечения состоит из нескольких этапов. Рассмотрим каждый этап подробнее. 1) Первый этап – постановка задачи. Работа над программным обеспечением начинается с составления документа, называемого "Задание на разработку программного обеспечения (техническое задание)". В нём указывается следующее. а) Название задачи. Даётся краткое определение решаемой задачи, название программного комплекса, указывается система программирования для её реализации и требования к аппаратному обеспечению. б) Описание. Описываются функциональные требования, определяющие функции, которые должно выполнять программное обеспечение, и эксплуатационные требования, определяющие характеристики его функционирования. Описание постановки задачи заканчивается разработкой технического задания с принятием основных проектных решений. Техническое задание в соответствии со стандартом ГОСТ 19.201—78 «Техническое задание. Требования к содержанию и оформлению» имеет следующие основные разделы: • введение: наименование и краткая характеристика программного обеспечения; • основание для разработки; • назначение разработки: описание функционального и эксплуатационного назначения, спецификации функций; • требования к программному изделию: к функциональным характеристикам, к надежности, к техническим средствам; • требования к программной документации; • технологические требования. Технологические требования определяют выбор следующих принципиальных решений, влияющих на процесс проектирования программного обеспечения: • архитектура программного обеспечения; • пользовательский интерфейс; • метод программирования; • язык программирования; • среда программирования. в) Управление режимами работы программы. Формулируются основные требования к способу взаимодействия пользователя с программой (интерфейс пользователь-компьютер). г) Входные данные. Описываются входные данные, указываются пределы, в которых они могут изменяться, значения, которые они не могут принимать, а также источник данных, т.е. устройство, с помощью которого они должны быть переданы в программу. д) Выходные данные. Описываются выходные данные, указывается, в каком виде они должны быть представлены – в числовом, графическом или текстовом, а также указывается устройство отображения этих данных. е) Ошибки. Перечисляются возможные ошибки пользователя при работе с программой (например, ошибки при вводе данных и др.). Указываются способы диагностики (в данном случае под диагностикой понимается обнаружение ошибок при работе программного комплекса) и защиты от этих ошибок на этапе проектирования, а также возможная реакция пользователя при совершении им ошибочных действий и реакция программного комплекса (компьютера) на эти действия. ж) Пример работы программного комплекса. Приводится один или несколько примеров работы программного комплекса, на которых в простейших случаях проводится его отладка и тестирование. 2) Второй этап – выбор метода решения. На этом этапе создаётся математическая или логическая модель исследуемого явления реального мира. Если программируемая задача носит вычислительный характер, то приводится вывод всех используемых формул с подробными комментариями. Если же задача не вычислительная, то приводится словесное описание логической модели, например, в виде плана действий. 3) Третий этап – разработка алгоритма решения задачи. На этом этапе формируется общая структура программного комплекса. В соответствии с рассматриваемой далее технологией нисходящего структурного программирования программный комплекс разбивается на небольшие части – программные модули (блоки). Для каждого программного модуля формулируются требования по реализуемым функциям, и разрабатывается алгоритм, реализующий эти функции. Алгоритм представляет собой точное предписание, последовательность действий, приводящих к решению вычислительной или логической задачи. Определяется схема взаимодействия программных модулей, т.е. схема потоков данных программного комплекса. Результатом выполнения этого этапа является блок-схема алгоритма решения поставленной задачи. 4) Четвёртый этап – кодирование алгоритма. Этап кодирования (программирования) алгоритмов заключается в переводе алгоритмов, разработанных для каждого программного модуля, в программы на конкретном языке программирования. Результатом выполнения этого этапа являются файлы с исходными текстами программ. Эти файлы по своей природе текстовые, только они содержат тексты, написанные на языке программирования. Как и другие текстовые файлы, они могут быть созданы, просмотрены и отредактированы с помощью любых текстовых редакторов. 5) Пятый этап – трансляция и компиляция программы. После того как закончено кодирование (написание программы на языке программирования) и исходный текст программы введён в память компьютера, производят транслирование и компилирование программы. Сначала специальная программа (транслятор) проверяет исходный текст программы на наличие так называемых синтаксических ошибок, т.е. соответствие написанных операторов правилам, предусмотренным в данном языке программирования. Причём трансляция производится до первой встретившейся ошибки. При обнаружении ошибки процесс трансляции прекращается, транслятор выдаёт сообщение о характере и месте ошибки. Необходимо исправить ошибку и повторить трансляцию. Так продолжается до тех пор, пока все ошибки трансляции не будут устранены. Затем происходит сборка программы (компиляция), т.е. к программе подключаются все заказанные ей библиотеки, процедуры, функции и т.д. Если какой-либо компонент не обнаружен, выдаётся соответствующее сообщение и процесс прекращается. Необходимо убедиться в наличии не найденного компонента, в правильности указанного имени его или пути к нему. Затем снова повторить компиляцию. При успешном завершении процесса образуется исполняемый файл программы (файл с расширением EXE). С помощью этого файла запускают программу на выполнение. 6) Шестой этап – тестирование программы. Различаю два вида тестирования: автономное и комплексное. Автономному тестированию подвергаются отдельные программные модули, из которых состоит программный комплекс. Комплексное тестирование заключается в проверке всего программного комплекса. Для тестирования подбираются такие исходные данные, для которых результат выполнения программы заранее известен. После того как при тестировании обнаружена ошибка, начинается процесс отладки тестируемого программного модуля или программного комплекса. Тестирование и отладка чередуются и завершаются после того, как будет принято решение об отсутствии в программном комплексе ошибок. 7) Седьмой этап – создание документации. Документация классифицируется по своему назначению и может быть разбита на несколько групп: - описание применения, - руководство пользователя, - руководство программиста. Описание применения– общая характеристика программного продукта и сферы его применения, требований к базовому программному обеспечению, комплексу технических средств обработки. Руководство пользователя– детальное описание функциональных возможностей и технологии работы с программным продуктом для конечного пользователя. Документы данного вида могут оформляться в печатном виде и (или) "встраиваться" в программный комплекс (в последнем случае помощь в виде подсказки вызывается самим пользователем в процессе работы программного комплекса). Руководство программистапредназначено для разработчиков программного обеспечения и специалистов, которые будут его сопровождать. Это руководство в качестве основных документов включает: 1) задание на разработку программного обеспечения (техническое задание); 2) спецификацию; 3) прокомментированные исходные тексты (листинги) модулей программы и управляющего модуля; 4) схему разбиения программного комплекса на программные модули; 5) схему потоков данных программного комплекса; 6) схему взаимодействия программных модулей; 7) планы и данные для тестирования программного комплекса; 8) другие материалы, иллюстрирующие проект, например: блок-схемы программного комплекса и программных модулей. Отметим, что стоимость разработки хорошей документации достаточно высока и оценивается в 1 человеко-месяц на 1000 команд исходного текста программы. 8) Восьмой этап – сопровождение и эксплуатация. После завершения тестирования программного комплекса программное обеспечение сдаётся в эксплуатацию. В процессе эксплуатации может возникнуть необходимость добавления в программный комплекс новых функций, устранение ошибок, обнаруженных в процессе эксплуатации, и т. д. Данный тип работ с программным комплексом в период его эксплуатации называется сопровождением. Только при решении простейших задач указанные этапы выполняются друг за другом в той последовательности, в которой они были описаны. В общем же случае процесс разработки программного обеспечения требует постоянного возврата к предыдущим этапам и внесения изменений. 1.3. Анализ языков программирования, используемых для разработки программного обеспечения Ассемблер Язык ассемблера – это машинно-ориентированный язык программирования низкого уровня. Его команды прямо соответствуют отдельным командам машины или их последовательностям, также он может предоставлять дополнительные возможности облегчения программирования, такие как макрокоманды, выражения, средства обеспечения модульности программ. Может рассматриваться как автокод, расширенный конструкциями языков программирования высокого уровня. Является существенно платформо-зависимым. Языки ассемблера для различных аппаратных платформ несовместимы, хотя могут быть в целом подобны. Язык ассемблера позволяет программисту пользоваться алфавитными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и даёт возможность помечать строки программы метками с символическими именами с тем, чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, для передачи управления). Перевод программы на языке ассемблера в исполнимый машинный код (вычисление выражений, раскрытие макрокоманд, замена мнемоник собственно машинными кодами и символьных адресов на абсолютные или относительные адреса) производится ассемблером – программой-транслятором, которая и дала языку ассемблера его название. Команды языка ассемблера один к одному соответствуют командам процессора. Фактически, они и представляют собой более удобную для человека символьную форму записи – мнемокоды – команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько вариантов команд процессора. Кроме того, язык ассемблера позволяет использовать символические метки вместо адресов ячеек памяти, которые при ассемблировании заменяются на вычисляемые ассемблером или компоновщиком абсолютные или относительные адреса, а также так называемые директивы (команды ассемблера, не переводимые в машинные команды процессора, а выполняемые самим ассемблером). Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макрокоманды с параметрами. Каждая модель (или семейство) процессоров имеет свой набор – систему команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы языков ассемблера – Intel-синтаксис и AT&T-синтаксис. Бейсик Бейсик – семейство высокоуровневых языков программирования. Язык получил широкое распространение в виде различных диалектов, прежде всего как язык для домашних компьютеров. К настоящему моменту претерпел существенные изменения, значительно отойдя от характерной для первых версий простоты, граничащей с примитивизмом, и превратившись в достаточно ординарный язык высокого уровня с типичным набором возможностей. Используется как самостоятельный язык для разработки прикладных программ, главным образом, работающих под управлением ОС Windows различных версий. Также бейсик широко распространён в качестве встроенного языка прикладных программных систем различного назначения и в качестве языка для программируемых калькуляторов. Одним из наиболее распространённых вариантов языка Бейсик стала реализация интерпретатора QBasic корпорации Microsoft. Долгие годы она включалась как бесплатное приложение, входящее в операционные системы MS-DOS и ранних Windows. В нём имелись довольно мощные графические и звуковые возможности, позволяющие создавать на этом языке даже игры. Бейсик поздних версий (начиная с Turbo Basic и Visual Basic) резко отличается от ранних вариантов. Фактически, это новый язык, который во многом ближе к Фортрану или Паскалю, чем к исходному Бейсику. Основные изменения версий 1990-х годов состоят в следующем. Отказались от представления программы как неструктурированного набора пронумерованных строк. Номера строк превратились в обычные метки, которые стали необязательными и перестали влиять на порядок исполнения программы. Если ранее строка с номером 15 всегда шла в программе раньше строки с номером 20, то теперь порядок исполнения стал определяться порядком расположения строк в исходном коде. Метки перестали быть только числовыми. В языке появились именованные подпрограммы с параметрами, механизм вызова подпрограмм стал обычным: подпрограмма вызывается по имени, с указанием списка фактических параметров. Появилась рекурсия. Были введены структурные управляющие конструкции, в результате для организации обычных ветвлений и циклов перестало быть необходимым использование оператора GOTO и меток строк. Существенно расширилась номенклатура типов данных, появилась возможность явно описывать типы обычных переменных. Стали необязательными типизирующие суффиксы в именах переменных, хотя их использование не запрещалось. В более поздних версиях появилась обработка исключений и поддержка элементов ООП. Были введены механизмы поддержки модульности – появилась возможность без «фокусов» (типа динамической загрузки модулей с помощью явных системных вызовов) разделять программу на несколько файлов исходного кода. Появились средства для работы с цветной графикой и звуковой картой. Visual Basic, ориентированный на разработку Windows-приложений с графическим интерфейсом пользователя, был выполнен интегрированным с графическим дизайнером интерфейса, что позволило быстро писать простые программы под Windows. Появились кроссплатформенные реализации, например, FreeBASIC и PureBasic. Практически все недостатки, присущие ранним версиям языка, были исправлены, и программирование на современных диалектах Бейсика мало отличается от использования других языков и сред (например, таких, как Delphi). Оборотной стороной процесса модификации Бейсик является то, что язык стал гораздо объёмнее и сложнее, его освоение требует больше времени и усилий. Си Си – компилируемый статически типизированный язык программирования общего назначения, разработанный в 1969-1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Первоначально был разработан для реализации операционной системы UNIX, но впоследствии был перенесён на множество других платформ. Согласно дизайну языка, его конструкции близко сопоставляются типичным машинным инструкциям, благодаря чему он нашёл применение в проектах, для которых был свойственен язык ассемблера, как в операционных системах, так и в различном прикладном программном обеспечении для множества устройств – от суперкомпьютеров до встраиваемых систем. Язык программирования Си оказал существенное влияние на развитие индустрии программного обеспечения, а его синтаксис стал основой для таких языков программирования, как C++, C#, Java и Objective-C. Язык программирования Си отличается минимализмом. Авторы языка хотели, чтобы программы на нём легко компилировались с помощью однопроходного компилятора, чтобы каждой элементарной составляющей программы после компиляции соответствовало весьма небольшое число машинных команд, а использование базовых элементов языка не задействовало библиотеку времени выполнения. Однопроходный компилятор компилирует программу, не возвращаясь назад к уже обработанному тексту, поэтому использованию функций и переменных должно предшествовать их объявление. Код на Си можно легко писать на низком уровне абстракции, почти как на ассемблере. Иногда Си называют «универсальным ассемблером» или «ассемблером высокого уровня», что отражает различие языков ассемблера для разных платформ и единство стандарта Си, код которого может быть скомпилирован без изменений практически на любой модели компьютера. Си часто называют языком среднего уровня или даже низкого уровня, учитывая то, как близко он работает к реальным устройствам. Однако в строгой классификации он является языком высокого уровня. Компиляторы Си разрабатываются сравнительно легко благодаря простоте языка и малому размеру стандартной библиотеки. Поэтому данный язык доступен на самых различных платформах (возможно, круг этих платформ шире, чем у любого другого существующего языка). К тому же, несмотря на свою низкоуровневую природу, язык позволяет создавать переносимые программы и поддерживает в этом программиста. Программы, соответствующие стандарту языка, могут компилироваться на самых различных компьютерах. Си (как и операционная система UNIX, с которой он долгое время был связан) создавался программистами и для программистов, круг которых был бы ненамного шире круга разработчиков языка. Несмотря на это, область использования языка значительно шире задач системного программирования. Язык создавался с целью сделать более простым написание больших программ с минимумом ошибок (по сравнению с ассемблером), следуя принципам процедурного программирования, но избегая всего, что приведёт к дополнительным накладным расходам, обычным для языков высокого уровня. Си имеет следующие основные особенности: простую языковую базу, из которой вынесены в библиотеки многие существенные возможности, вроде математических функций или функций управления файлами; ориентацию на процедурное программирование, обеспечивающую удобство применения структурного стиля программирования; систему типов, предохраняющую от бессмысленных операций; использование препроцессора для, например, определения макросов и включения файлов с исходным кодом; непосредственный доступ к памяти компьютера через использование указателей; минимальное число ключевых слов; передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке эмулируется с помощью указателей); указатели на функции и статические переменные; области действия имён; структуры и объединения — определяемые пользователем собирательные типы данных, которыми можно манипулировать как одним целым. В то же время в Си отсутствуют: вложенные функции; сопрограммы; средства автоматического управления памятью; встроенные средства объектно-ориентированного программирования; средства функционального программирования. 1 2 |