Введение в программирование - Учебное пособие (Корочкин А. В.)

6.1 абстракции

Общие концепции языка Ада являются прекрасной основой для раз­работки больших программных систем. Примером применения языка для разработки таких систем является его успешное использование в целом ряде проектов:

•   системе управления скоростной магистралью TGV (Франция);

•   системах контроля метрополитеном ( Париж, Каир, Калькутта);

•   банковских системах ( Швейцария );

•   управление атомномными электростанциями ( Чехия ) ;

•   авиастроении (Боинг-777, США) и др.

Разработка больших программных систем представляет собой слож­ный процесс, включающий несколько этапов: анализ и описание требо­ваний, проектирование, реализация, модификация, сопровождение [ 5 ].

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

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

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

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

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

52

Ада 95. Введение в программирование

Глава 6. Модули

53

 

 

Декомпозиция, базирующаяся на абстракции, при разбиении про­граммы на компоненты предполагает продуманный выбор компонент и осуществляется путем изменения списка детализации.

В простейшем случае все модули могут представлять собой только процедурную абстракцию, то есть программа будет состоять из проце­дур и функций.

Реализация абстракций основывается на двух подходах - абстракции на основе параметризации и абстракции на основе спецификации.

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

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

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

В общем случае абстракция на основе спецификации наделяет про­грамму двумя свойствами: локальностью и модифицируемостью.

Локальность означает, что реализация одной абстракции может быть выполнена без анализа реализации другой абстракции. Для напи­сания программы, использующей абстракции, достаточно только по­нимать её поведение, а не подробности её реализации. Принцип ло­кальности облегчает составление программы и анализ уже созданной абстракции. Он позволяет составлять программу из абстракций, созда­ваемых независимо друг от друга.

Абстракция на основе спецификации позволяет упростить модифи­кацию программы. Если реализация абстракции меняется (через изме­нение тела абстракции), но её спецификация при этом остаётся преж­ней, то эти изменения не повлияют на оставшуюся часть программы. Объём исправлений может быть значительно сокращён путем выделе-

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

Выделим следующие виды абстракций:

• процедурная абстракция

• абстракция данных

• абстракция процесса.

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

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

абстракция_данных : = < объекты, операции >

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

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

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

Абстракция процесса в языках программирования для параллельных вычислительных систем связана с описанием параллельно выполняе­мых модулей. Для процесса определяется состав допустимых состояний и переходов из одного состояния в другое. Характерными состояниями процесса являются:

•   порождение;

•   выполнение (активное);

8   ——   KnnnairnTf   A     R

54

Ада 95. Введение в программирование

55

Глава 6. Модули

 

 

•   готовность;

•   блокирование;

•   окончание.

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

Главной особенностью процессов в параллельных системах, опреде­ляющей организацию вычислительного процесса в ней, является их па­раллельность. То есть в системе одновременно существует и развивает­ся множество процессов.

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