Главная » Мануалы

1 2 3 4 5 6 ... 32

ничье или строительное дело, которому можно обучиться на практике, если только иметь к этому склонность.

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

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

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

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

].3.5. Программа как черный ящик: новаторская концепция

Данная книга ориентирует читателя на то, чтобы он пред-* ставлял себе программное обеспечение в структурной форме, а не в виде блок-схемы или закодированных строк. В книге



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

1.4. Сущность Предлагаемого подхода

Рассматриваемые в данной книге методы ориентированы на программно-управляемое системное проектирование в соответ-


Рис. 1.4. три опорных элемента книги.

ствии С концепцией жизненного цикла и держатся на трех опорах (рис, 1.4):

1. Структурное проектирование, представляющее собой методологию построения системных структур на основе моделей информационных потоков.

2. Объектно-ориентированная графическая нотация и концептуальная модель, служащие для представления системных компонент, их интерфейсов и взаимосвязей и образующие основу структурных графов, известных из структурного проектиро-, вания] язык Ада наполняет их семантическим содержанием^



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

В начале книги каждый из трех опорных элементов, изображенных на рис. 1.4, исследуется настолько подробно, чтобы можно было начать обсуждение примеров. Затем все три элемента используются как основа для рассмотрения нескольких примеров проектирования, иллюстрирующих как сам процесс проектирования, так и его технические аспекты. Ведущую роль в книге играют примеры: результаты и принципы выводятся большей частью из них. Три опоры, изображенные на рис. 1.4, рассматриваются в остальных главах части I и части П. Так, гл. 2 представляет собой введение в язык Ада, построенное по нисходящему принципу. Для читателя, знакомого с Паскалем или любым подобным языком и обладающего достаточной компьютерной грамотностью , чтобы не испугаться концепции мультизадачного режима, не потребуется дополнительно ничего кроме этого введения.



Глава 2

Ада - язык системного проектирования 2.1. Введение

Как отмечалось в гл. 1, язык Ада имеет ряд новых свойств, позволяющих проводить идеи модульности и параллельности, двойственные аппаратному обеспечению. В частности, с помощью языка Ада можно представить систему в виде набора черных ящиков, закоммутированных кабелями, которые включают-6я в гнезда. Черные ящики - это пакеты и задачи или их комбинации. Гнезда - это спецификации (описания) пакетов или задач, задаваемые независимо от их тела. Параллельность реализуется через организацию задач. Интерфейсы пакетов и задач с внешним окружением выглядят аналогично. Конфигурация систем может быть задана статистически путем установления связей между предварительно оттранслированными черными ящиками через их спецификации.

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

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



Жизненный цикл

Структурное проектирование


Технические аспекты

Рис. 2.1. Классификация новых важных отличительных особенностей языка Ада,

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

Особенности языка Ада, имеющие непосредственное отношение к жизненному циклу,- это наличие средств конструировав



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

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

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

2.2. Нисходящий обзор характерных особенностей языка Ада, важных для разработчика систем

Данный раздел посвящен в основном тем свойствам языка Ада, которые, согласно рис. 2.1, ориентированы на процедуры структурного проектирования. Ниже эти свойства перечислены в порядке их последующего рассмотрения:

организация пакетов,

отделение спецификаций от тел пакетов и задач,

механизм рандеву для межзадачных связей,

уточнение сверху вниз,

пакетный ввод-вывод,

организация прерываний.

2.2.1. Организация пакетов и разделение тел и спецификаций

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



кета). Спецификация пакета и тело пакета - совершенно раз-: личные компоненты текста Ада-программы, которые можно при желании компилировать раздельно. Тело пакета скрыто от пользователя, который может использовать пакет только так, как определено в спецификации. Спецификация представляет

Спецификация пакета; Пользователи внешнее-представление - пакета-

. внутренние детали.

Данные \ недоступные пользователю


Доступ к пакету: через обращения к процедурам сопряжения

Рис. 2.2. Логическая огранизация пакетов.

Процедуры сопряжения пакетов - часть тела; видимость извне обеспе-Чивается в специфи;<ации

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

На рис. 2.3 приведен характерный пример представления простого пакета STACK (СТЕК) как черного ящика. Это несколько видоизмененный пример аналогичного пакета из справочного руководства по языку Ада. В пакете имеются доступные извне процедуры PUSH (ПРОТОЛКНУТЬ) и POP (ВЫТОЛКНУТЬ) для элементов фиксированных, заранее определенных типов. Эти процедуры инициируют флажки, указывающие

) Фактически речь идет о пакете программ в обычном смысле этого термина. - Яр л1. ред.




Рис. 2.3. Стековый пакет.

Элемент

Состояние Состояние^

Элемент

PUSH

у--у

I SPACE )

у Пакет STACK

Структура пользовательского вызова:

stack, pushielement, status); stack. pop (element .status);

на переполнение или недогрузку стека. Тела процедур PUSH и POP и структура стековых данных, общая для обеих процедур, невидимы пользователю. Идея состоит в том, что пользователям стекового пакета не придется изменять порядок обращения к нему, даже если тело пакета будет модифицировано и приспособлено к различным типам структур стековых данных, например массивам или связным спискам.

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

Спецификация стекового пакета включает спецификации процедур PUSH и POP; эти спецификации состоят всего лишь из имени процедуры и следующих за ним спецификаций ее параметров.

Третий раздел - тело стекового пакета, содержащее массив фиксированного размера для стека и две процедуры PUSH и POP, работающие на этом массиве.

Доступ извне к процедурам PUSH и POP обеспечивается вызовом процедур STACK-PUSH и STACK.POP. Указывая имя пакета и уточняя таким способом обращение, можно получить



- ~ КОММЕНТАРИЙ

w- ГЛОБАЛЬНЫЕ ТИПЫ, ИСПОЛЬЗУЕМЫЕ

W - ВЫЗЫВАЮЩЕЙ ПРОГРАММОЙ И ПАКЕТОМ type tLEM is INTEGER;

type STATUS is (OK, UNDERFLOW. OVERFLOW);

--СТЕКОВЫЙ ПАКЕТ ДЛЯ СПЕЦИФИКАЦИИ

ПЕРЕМЕННЫХ ТИПА ELEM СПЕЦИФИКАЦИЯ package STACK is

- procedure PUSH (E:in ELEM; FLAG:out STATUS); procedure POP (E:out ELEM; FLAGiout iiTATUS);

end STACK;

--ТЕПО

package body STACK is SIZE; constant INTEGER : = 10; SPACE: array (1 .. SIZE) of ELEM; INDEX* INTEGER range 0 .. SIZE : = 0;

procedure PUSH IE ; in ELEM, FLAG: out STATUS) \% begin

if INDEX = SIZE then FUG : = OVERFLOW else

INDEX : = INDEX + 1; SPACE (INDEX) : = E; FLAG : = OK; end if; end PUSH;

procedure POP (E : out ELEM, FLAG; out STATUS) [$ begin

if INDEX = 0 then FUG : = UNDERFLOW else

E : = SPACE (INDEX); INDEX : = INDEX - 1; FUG:.= OK; end if; end POP;

end STACK;

--СТРУКТУРА ПОЛЬЗОВАТЕЛЬСКОГО ВЫЗОВА

StACK.PUSH (ELEMENT, STATUS); STACK.POP (ELEMENT, STATUS); :

Рис. 2.4, Ада-программа, реализующая стековый пакет.

2 Зак, 455



доступ К любому программному элементу внутри пакета, если только он сделан видимым в спецификации.

Ниже перечислены некоторые ключевые моменты работы с пакетами.

Установление соответствия с

помощью Комментариев

Основная программа 6

Код операции ПроцедурьГ

Глобальный данные

STACK

Т

SPACE

Оси'овная программа е Код операции Процедуре

Основная программ*

Глобальные данные


Процедур

1а) Процедуры с раздельным Iff) .Процедура с единственный (в) Приватный ТИП даннЫУ доступом методом доступа и кодом операций в (реализованный неверно)

качестве параметра.

Рис, 2.5, Пакеты в языке Паскаль.

Активизация имени пакета обеспечивает доступ ко всем его элементам, поименованным в спецификации.

Спецификация пакета объявляется в программе только один раз, хотя он может быть использован несколькими модулями.

Концепция пакета является почти всеобъемлющей.

Пакеты и их спецификации можно при желании компилировать раздельно.

Чем же отличаются пакеты в языке Ада от средств, которые предоставляют нам более распространенные языки? Возьмем в качестве примера стандартный Паскаль. Многие организации расширяли Паскаль в самых разных направлениях, но на сегодня единственное пакетное средство стандартного Паскаля - это процедура. На рис. 2.5 проиллюстрированы способы моделирования Ада-пакетов с помощью процедур Паскаля. Если стремиться к тому, чтобы PUSH и POP были раздельными процедурами, то, как показано на рис. 2.5, а, их компоновка в единый стековый пакет может быть осуществлена путем включения в текст программы соответствующих комментариев. Область, отведенная для стека, должна быть при этом объявлена как глобальные данные, а PUSH и POP - как отдельные процедуры; связь между ними нельзя установить ни с помощью имени, ни даже поместив их рядом в тексте программы. Если же все-таки желательно иметь стековый пакет с единственным именем, то, как показано на рис. 2,5, б, его следует сконструировать в виде процедуры с кодом операции в качестве параметра, который будет указывать требуемое действие. Структура стековых данных должна быть по-прежнему объявлена как гло-



1 2 3 4 5 6 ... 32

Яндекс.Метрика