Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

информатика_книги / Информатика. Теория и практика_Острейковский В.А, Полякова И.В_2008 -608с

.pdf
Скачиваний:
159
Добавлен:
06.06.2015
Размер:
7.43 Mб
Скачать

7.2.5. Жизненный цикл программного обеспечения

Жизненный цикл программного обеспечения включает в себя шесть этапов:

анализ требований;

определение спецификаций;

проектирование;

кодирование;

тестирование;

сопровождение. Рассмотрим эти этапы.

Анализ требований. При разработке программного обеспе-

чения такой анализ исключительно важен. Ошибки, допущенные на этом этапе, даже при условии безупречного выполнения последующих этапов могут привести к тому, что разработанный программный продукт не будет соответствовать требованиям практики, сферы его применения. Для создания конкурентоспособного продукта в процессе анализа требований необходимо получить четкие ответы на следующие вопросы: что должна делать программа? В чем состоят реальные проблемы, разрешению которых она должна способствовать? Что представляют собой входные данные? Какими должны быть выходные данные? Какими ресурсами располагает проектировщик?

Определение спецификаций. Этот этап можно рассматривать как формулировку выводов, следующих из результатов предыдущего этапа. Требования к программе должны быть представлены в виде ряда спецификаций, явно определяющих рабочие характеристики будущей программы. В их число могут входить скорость выполнения, объем потребляемой памяти, гибкость применения и др.

Проектирование. На данном этапе создается общая структура программы, которая должна удовлетворять спецификациям; определяются общие принципы управления и взаимодействия между различными компонентами программы.

Кодирование. Задача этого этапа — перевод на язык программирования конструкций, записанных на языке проектирования.

Тестирование. На этапе тестирования производится всесторонняя проверка программ. Суть тестирования более подробно будет рассмотрена ниже.

571

Сопровождение. Это этап эксплуатации системы. Каким бы изощренным ни было тестирование программ, к сожалению,

âбольших программных комплексах чрезвычайно тяжело устранить абсолютно все ошибки. Устранение обнаруженных при эксплуатации ошибок — первейшая задача этапа сопровождения. Однако это далеко не все. Проводимый в ходе сопровождения анализ опыта эксплуатации программы позволяет обнаруживать узкие места или неудачные проектные решения

âтех или иных частях программного комплекса. В результате может быть принято решение о проведении работ по совершенствованию разработанной системы. Сопровождение может также включать в себя проведение консультаций, обучение пользователей системы, оперативное снабжение их информацией о новых версиях системы и т. п. Качественное проведение этапа сопровождения в большой степени определяет коммер- ческий успех программного продукта.

Рассмотрим этап тестирования программы более подробно. Существуют три аспекта проверки программы:

направильность;

навычислительную сложность;

наэффективность реализации.

Проверка правильности удостоверяет, что программа делает в точности то, для чего она была предназначена. Математиче- ская безупречность алгоритма не гарантирует правильности его перевода в программу. Аналогично ни отсутствие диагностиче- ских сообщений компилятора, ни разумный вид получаемых результатов не дают достаточной гарантии правильности программы. Обычно проверка на правильность заключается в разработке и проведении набора тестов. Кроме того, для расчета программ иногда можно сверить получаемые решения с уже известными. В общем случае нельзя дать общего решения для проведения проверки программы на правильность.

Проверка вычислительной сложности заключается в экспериментальном анализе сложности алгоритма или экспериментальном сравнении двух и более алгоритмов, решающих одну и ту же задачу.

Проверка эффективности реализации имеет целью отыскание способа «заставить» правильную программу работать быстрее или расходовать меньше памяти. Чтобы улучшить программу,

572

пересматриваются результаты реализации в процессе построения алгоритма. Не рассматривая всех возможных вариантов

èнаправлений оптимизации программ, приведем здесь некоторые полезные способы увеличения скорости выполнения программ.

Ïе р в ы й способ основан на следующем правиле: сложение

èвычитание выполняются быстрее, чем умножение и деление; целочисленная арифметика быстрее арифметики вещественных чисел. Таким образом, Õ + Õ лучше, чем 2X, à i + 0,5 õóæå, ÷åì (2i + j)0,5 èëè (i + i + j)0,5. При выполнении операций над целыми числами следует помнить, что, благодаря применению двоичной системы счисления, умножение на числа, кратные двум, можно заменить соответствующим количеством сдвигов влево. Поэтому 10А выполняется дольше, чем Ashl 3 + Ashll.

В т о р о й способ заключается в удалении избыточных вы- числений.

Пример.

Root 1: = (–b + sqrt(sqr(6) – 4àñ))/(2.0à); Root 2: = (–b – sqrt(sqr(6) – 4àñ))/(2.0à).

Лучшим решением является следующее:

DenomA: = à + à; DenomC: = ñ + ñ;

Discrim: = sqrt(bb – DenomA * DenomC); Rootl: = (–b + Discrim)/DenomA;

Root 1: = (–b – Discrim)/DenomA.

Легко увидеть, что в первом случае потребовалось выполнить четыре операции сложения/вычитания, шесть операций умножения, две операции деления, два вызова функции sqr и два вызова функции sqrt; во втором — пять операций сложения/вычитания, две умножения, две деления и одно обращение к функции sqrt.

Т р е т и й способ проверки эффективности реализации основан на способности некоторых компиляторов строить коды для вычисления логических выражений так, что вычисления прекращаются, если результат становится очевидным. Например, в выражении A or В or С, если А имеет значение «истина», то переменные В и С уже не проверяются. Таким образом, можно сэкономить время, разместив переменные А, В, С так, чтобы

573

первой стояла переменная, которая вероятнее всего будет истинной, а последней — та, которая реже всего принимает истинное значение.

Однако следует быть осторожными и в следующем примере: Root (A) or В or С. Root (А), может, и чаще принимает зна- чение «истина», но представляет собой вызов функции, возможно, выполняющей сложные и длительные вычисления. Тогда может оказаться, что запись В or С or Rool {А) является более эффективной.

Ч е т в е р т ы й способ — исключение циклов.

Пример.

Фрагмент:

for i: = 1 to 1000 do A[i]: =0;

for i:= 1 to 1000 do for i: = 1 to 10 do A[i]: =A[i] + Ñ[i,j]

можно переписать так:

for i: = 1 to 1000 do begin Â: = C[i,1 ];

for j = 2 to 10 do

À[i]: = Â B:= B + C[i,j]; End.

В данном примере выигрыш достигается, во-первых, за счет уменьшения количества циклов (два, а не три), а во-вторых — за счет того, что с введением временной переменной В уменьшено количество операций вычисления адресов элементов массива.

П я т ы й способ — развертывание циклов.

Пример.

Запись:

for i:= 1 to 1000 do for j: = 1 to 3 do A[i]:=A[i] + C[i,j]

можно переписать так:

for i: = 1 to 1000 do

A[i]: = A[i] + C[i,1] + C[i,2] + C[i,3].

Выигрыш в скорости вычислений налицо.

574

Это далеко не полный перечень способов оптимизации. Здесь приведены лишь самые очевидные из них. Следует, кроме того, заметить, что не всегда стоит увлекаться погоней за быстродействием, так как при этом чаще всего ухудшается удобочитаемость программ. В том случае, когда выигрыш получа- ется мизерный, вряд ли стоит предпочесть его в ущерб ясности и читабельности программы.

Òåìà 7.3

ОБЗОР И КРАТКАЯ ХАРАКТЕРИСТИКА

СОВРЕМЕННЫХ ЯЗЫКОВ И СРЕДСТВ ПРОГРАММИРОВАНИЯ

Напомним: первые поколения ЭВМ строились на класси- ческих принципах, сформулированных американским математиком Джоном фон Нейманом в 1946 г., когда начались разработки цифровых ЭВМ с программным управлением. Одним из основных принципов фон Неймана является принцип хранимой программы. Под программой вычислительной машины понимается описание алгоритма решения задачи, заданное на языке вычислительной машины. Таким образом, языки программирования — это формальные языки общения человека с ЭВМ, предназначенные для описания совокупности инструкций, выполнение которых обеспечивает правильное решение требуемой задачи, т. е. для описания подлежащих обработке данных (информации) и алгоритмов (программ). Основная роль языков программирования заключается в планировании действий по обработке информации. Любой язык программирования основан на системе понятий, на основе которой человек может выражать свои соображения.

Теоретическую основу языков программирования составляют алгоритмические языки. В настоящее время для ЭВМ разработано значительное количество языков программирования. Они отличаются друг от друга различными свойствами, а значит, и областью применения. Существуют разные подходы к классификации языков программирования. На рис. 7.35 представлена схема, в которой языки программирования систематизированы по возможностям и ориентации на конкретную сферу применения.

575

 

 

 

 

 

 

 

 

 

V

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

)-

 

)-

 

'-

 

-

 

-

 

Y -

 

 

-

 

 

 

 

-

 

-

 

-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

V

 

 

+

 

8/

 

Y

 

 

 

 

 

 

 

 

 

 

'

 

U

 

+

 

 

Y

 

 

 

 

 

 

 

 

)-5

 

ZW[[

 

 

 

+% 8 Y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

WX*5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ðèñ 7.35. Классификация языков программирования

Первыми используемыми языками программирования были машинные языки, задаваемые системами команд ЭВМ. Класс машинно-зависимых языков представлен Ассемблером. Язык Ассемблера делает доступными все программно-управ- ляемые компоненты ЭВМ, поэтому он применяется для написания программ, явно использующих специфику конкретной аппаратуры. Ассемблер наиболее трудоемкий язык программирования, из-за его низкого уровня не удается построить средства отладки, которые существенно снизили бы эту трудоемкость. Программирование на языке Ассемблера оперирует терминами команд аппаратной части машины и поэтому требует от программиста детального знания технических компонентов компьютера.

Каждый компьютер имеет такую систему программирования. Как правило, она разрабатывается и поставляется фирмой — изготовителем ЭВМ. Применение машинных языков требует излишней детализации пути решения задачи, поскольку даже наиболее современные ЭВМ способны понимать лишь относительно простые инструкции, тогда как человек способен концентрировать детали в выражениях более общего характера.

Использование языка Ассемблера ограничивается областью системного программирования: он применяется для программирования микропроцессоров, разработки операционных систем или их отдельных компонентов, программ обмена меж-

576

ду системным блоком и периферийным устройством (драйвером) и т. д. Поэтому с развитием программирования появились языки, ориентированные на определенные проблемные области, соответствующие более высокому уровню абстракции. Эти языки получили название алгоритмических языков высокого уровня (ÀßÂÓ). Их отличительной чертой является способность выразить задачу лаконично и сжато, обеспечивая программиста возможностью более четко представлять свои задачи и разрабатывать эффективные методы их решения. Преобразование описания задачи на АЯВУ в описании на машинном языке осуществляется специальной программой, называемой транслятором. Уже имеется целый ряд языков программирования, ориентированных на те или иные области применения. Наиболее близкими к машинным языкам являются машинно-ориенти- рованные языки, позволяющие использовать особенности ЭВМ для повышения эффективности программ.

К классу машинно-ориентированных языков можно отнести язык Ñè. Он является результатом попытки объединить достоинства низкоуровневых возможностей АЯВУ. Язык Си часто называют языком Ассемблера со встроенными структурами данных. Использование структур данных позволяет более систематично подходить к реализации задачи на языке Си и сокращает объем текстов разрабатываемых программ. Особенность данного языка заключается в максимальном использовании возможностей конкретной вычислительной архитектуры на основе битовых операций, функций и назначений. Благодаря этому программы на языке Си компактны и работают очень быстро. Однако синтаксис этого языка достаточно сложен, поэтому чтение текстов программ на нем требует определенного навыка. Язык Си первоначально был ориентирован прежде всего на разработку системных программ. Он, в частности, послужил главным инструментом для создания операционных систем MS DOS и UNIX. В настоящее время язык Си применяется главным образом для создания системных и прикладных программ, в которых скорость работы и объем памяти служат основными параметрами.

Большинство языков программирования являются машин- но-независимыми, что позволяет использовать однажды записанную на таких языках программу на различных ЭВМ. В зави-

577

симости от подхода к описанию задачи языки программирования подразделяют на процедурно-ориентированные и про- блемно-ориентированные. П р о ц е д у р н о - о р и е н т и р о- в а н н ы е языки предоставляют программисту средства задания и детального определения последовательности действий, которые ЭВМ должна выполнить для решения задачи, т. е. средства, определяющие, как должна действовать машина. П р о- б л е м н о - о р и е н т и р о в а н н ы е (или ф у н к ц и о н а л ь- н ы е) языки определяют задачу в терминах функции, которую надо выполнить машине, т. е. определяют, что должно быть сделано.

Процедурно-ориентированные языки программирования обычно имеют операторную структуру и содержат средства выражения характерных алгоритмических действий, таких, как вычисление выражений, проверка условий, циклические вы- числения, включения программ и др. Проблемно-ориентиро- ванные языки предоставляют пользователям средства определения более или менее широкого набора функций, подлежащих исполнению. Следует заметить, что четкой границы между этими категориями языков нет, и в пределах одного языка могут сочетаться средства языков обеих категорий.

Большинство современных языков программирования ориентировано на тот или иной круг задач. Так, наиболее широко используемыми в мировой практике вычислений являются языки:

Кобол и PL/1 — для обработки экономической информа-

öèè;

Фортран (исторически первый язык высокого уровня) — для решения инженерных и научных задач;

Бейсик, Паскаль, Лого — для обучения программирова-

íèþ;

Пролог, Лисп — для решения задач искусственного интеллекта;

Симула-1, Смолток — для описания задач моделирования дискретных событий;

Модула-2, Ада — для управления реальными объектами;

Снобол, Комит и др. — для манипуляции с текстами. Наиболее широко представлен класс универсальных язы-

ков программирования. Среди них можно выделить такие популярные языки высокого уровня, как Бейсик, Паскаль, Фортран, Кобол, Модула-2, PL/1 и др.

578

Исторически одним из самых распространенных языков стал Бейсик. Это объясняется прежде всего тем, что Бейсик прост в освоении и использовании. Написать на нем небольшую программу в 20—30 строк и тут же получить результат ее работы можно буквально за несколько минут. В язык Бейсик, как правило, встраиваются удобные функции для работы с экраном дисплея, клавиатурой, магнитными накопителями, принтером, коммуникационными каналами, что позволяет относиться к нему как к продолжению аппаратуры ПЭВМ. Чтобы освоить какую-нибудь особенность или режим работы аппаратных средств, проще всего написать и выполнить соответствующую программу на этом языке.

Для различных типов ПЭВМ, которые существенно отли- чаются друг от друга, были разработаны соответствующие версии языка Бейсик. Для ПЭВМ типа IBM PC и совместимых

ñними ПЭВМ наиболее удачной считается версия фирмы Microsoft. Она обеспечивает использование языка Бейсик для решения задач обработки больших массивов данных (работа

ñфайлами), инженерно-технических и научных расчетов (с помощью большого набора математических функций), обработки текстов (благодаря эффективной работе со знаковыми последовательностями), а также для решения комплексных задач (за счет создания оверлейных программных структур). Появление мощных компиляторов, таких, как, например, Quik Basic и Visual Basic фирмы Microsoft, поставило Бейсик в ряд с другими языками высокого уровня и придало ему дополнительную популярность.

ßçûê Паскаль можно считать одним из самых распространенных, хотя он и создавался как учебный. Со временем Паскаль зарекомендовал себя в качестве отличного инструмента для решения серьезных задач, так как его разработчик специально конструировал язык, позволяющий создавать хорошо структурированные программы. Широкое применение языка Паскаль пользователями IBM PC и совместимых с ними ПЭВМ обусловлено появлением его оригинальной версии — Турбо Паскаль фирмы Borland International. Турбо Паскаль характеризуется такими важными особенностями, как полноэкранное редактирование и убавление, графика, звуковое сопровождение и связи с дисковой ОС. Система программирования

579

на языке Турбо Паскаль сама является резидентной программой. Она позволяет пользователю вводить его программы и выполнять их немедленно, не тратя времени на компилирование. Вместе с тем Турбо Паскаль создан как средство быстрой разработки не очень больших программ (с числом строк до 500). Более длинные программы приходится сегментировать и использовать оверлейные структуры.

Стремление к созданию подлинно универсального и эффективного инструмента программирования привело к разработке нового языка — Модула-2. Он предложен автором языка Паскаль Н. Виртом. Основная цель, поставленная при его создании, — обеспечить высокоуровневыми языковыми средствами коллективную разработку надежных, эффективных инструментов программирования и использовать возможности аппаратуры. Таким образом, язык Модула-2 призван заполнить нишу между языками Паскаль и Си. В него целиком вошли все удачные средства и конструкции языка Паскаль, высокоуровневое представление низкоуровневых возможностей (например, оставаясь на уровне АЯВУ, можно оперировать машинно-не- зависимыми регистрами и отдельными командами).

Фортран — первый язык программирования высокого уровня — активно используется и на современных ПК. Близость его конструкции к традиционной архитектуре ЭВМ (имеется в виду традиционная фоннеймановская архитектура) сделала Фортран очень популярным. Применяется этот язык главным образом при разработке прикладных систем, ориентированных на научные исследования, инженерные задачи, автоматизацию проектирования и другие области, где накоплены обширные библиотеки стандартных программ.

ßçûê Кобол был разработан специально для решения экономических задач. В отличие от языка Фортран, Кобол дает возможность составлять более удобочитаемые программы, которые могут быть понятны и непрограммисту. В программах на этом языке особенно проявляется самодокументируемость, что облегчает их исправление и усовершенствование, а при обработке данных сложной структуры он бывает эффективнее языка Паскаль. Кобол широко распространен на больших и средних машинах, а на ПЭВМ используется мало, хотя фирмой

580

Соседние файлы в папке информатика_книги