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

1 2 3 4 5 6 7 8 ... 32

ходит для этого, так как его процедуры повторно входимы и их текст хранится в стеке. С Фортраном дело обстоит сложнее из-за отсутствия свойства повторной входимости.

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

2.2.3. Нисходящее уточнение

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

LJULJ

Рис. 2.12. Схема нисходящего программирования на языке Ада с использованием заглушек.

Вложенный пакет В (только i спецификации)


Отделенное тело пакета В

package body А is package В is end В;

package body В is separate; - -ЗАГЛУ1иКА

end A;

separate (A) package body В is

end Bj



Направление программирован ич

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

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

Чем же все сказанное отличается от возможностей, предоставляемых широко используемыми языками, такими, например, как стандартный Паскаль? В стандартном Паскале имеется механизм предвари-

ТелоР

Л

Заголовок Q

Тело Q, запрограммированное после тела Р

Рис. 2.13. Схема, показывающая ограниченность возможносте?! нисходящего програм1иирования на Паскале.

тельного объявления, позволяющий писать программы, в которых две процедуры вызывают друг друга. Это было бы невозможно, если бы абсолютно все объекты и действия должны были определяться до того как начнут использоваться. Применяемый в данном случае принцип иллюстрируется на рис. 2.13, где процедура R вызывает процедуру Р, которая вызывает процедуру Q, а та в свою очередь вызывает процедуру R. Как показано на рис. 2.13, в Паскале это осуществляется так: сначала программируется только заголовок Q, затем полностью программируется Р, после чего - полностью Q и затем программируется R. Однако какая-либо возможность определения тел процедур Р и Q в тексте программы уже после определения тела R отсутствует.

2.2.4. Пакетный ввод-вывод

Главная отличительная черта языка Ада, влияющая не только на процесс проектирования, но и на другие области его применения, заключается в том, что в нем отсутствуют специаль-



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

package l 0 PACKAGE is

type FILE ID is limited private;

procedure OPEN (F ; in out FILE ID);

procedure CLOSE (F ; in out FILE ID);

procedure READ (F.: in FILE ID; ITEM : out INTEGER);

procedure WRITE (F ; in FILE ID; ITEM : in INTEGER);, private

type FILE ID is record

INTERNAL ID : INTEGER : = 0; end record; end l 0 PACKAGE;

package body l 0 PACKAGE is LIMIT : constant: =200; type FILE DESCRIPTOR is record ... end record; DIRECTORY : array (1.. LIMIT) of FILE DESCRIPTOR;

procedure OPEN (F: in out FILE ID) is... end; procedure CLOSE (F : in out FILE ID) is,., end; procedure READ (F : in FILE ID; ITEM : out INTEGER) is ... end; procedure WRITE (F : in FILE ID; ITEM : in INTEGER) is . end; begin

end l 0 .PACKAGE;

Рис. 2.14. Пакет ввода-вывода файлов (соответственно справочному руководи ству по языку Ада).

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




KB-DONEy У TAKE

Задача-обработчик прерываний от клавиатуры .

(а) Концептуальное представление.

task KB-HANDLER is

entry TAKE (СН; out CHARl; entry KB-DONE; for KB-DONE use at 8#100 #; end KB-HANDUER;

task body KB-HANDLER is

BUF, DBR: CHAR;

for DBRuseat8#177462#;

begin loop

accept KB-DONE do BUF:=DBR, end; accept TAKEICH : out CHAR) do CH:=BUF;end? end loop end

(6) Ада-программа (no Пайлу!. Рис. 2,15. Задачи, реализующие обработку прерываний в языке Ада, Условные обозначения; КВ -DONE ГОТОВО TAKE ПРИНЯТЬ

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

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

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



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

2.2.5. Механизм прерываний

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

2.2.6. Заключительные замечания

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

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

2.3. Критический анализ языка Ада

в заключение рассмотрим полол^ительные и отрицательные стороны применения языка Ада для проектирования и реализации систем.

2.3.1. Ада как язык проектирования систем

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



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

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

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

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



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

2.3.2. Ада как язык реализации систем

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

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

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

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



соответствующим набором указаний, смогут генерировать эффективные коды, ориентированные на конкретную конфигурацию системы.

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

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

2.3.3. Заключение

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



Часть И

Введение в логическое проектирование

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

Глава 3

Проектно-ориентированная методика наглядного описания систем

3.1. Вводные замечания

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

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



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

В разд. 3.4 устанавливается связь между концепциями данной главы и языком Ада. Разд. 3.5 содержит основные выводы по материалу главы.

3.2. Средства наглядного описания архитектуры систем

3.2.1. Графическая нотация

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

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

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

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



1 2 3 4 5 6 7 8 ... 32

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