Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Inf_tekhnologii.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
280.88 Кб
Скачать

Лекция № 4

Язык описания функциональной структуры.

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

SDL является непроцедурным языком в том смысле, что не имеет значение порядок написания предложений. Описание объединенной пары графов на SDL состоит из предложений. Каждое предложение оканчивается точкой..

Граф данных.

Для описания графа данных используется только одно ключевое слово =>. Ясно, что a=>b просто означает, что информация послана из a в противообластьb. Следовательно, описание a=>transfer =>b. означает, что модульtransfer имеет область a и противообласть b. Если у модуля нет области, это описывается как increment => abc. Это полагает, что модуль increment имеет только противообласть abc.

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

Пример:

[a,b,c] => reproduce =>[d,e,f].

abc => decompose => [aa,bb,cc].

[relation 1, relation 2] => join => relation 3.

[database, query] => prolog => answer.

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

Пример:

initialise: [abc = 16, xyz = 64] Это предложение определяет начальные величины областей abc и xyz как 16 и 64 соответственно.

Граф управления.

Чтобы дать возможность пользователю гибко специфицировать свою управляющую логику используются два ключевых слова: > и*. Мы увидим, что пользователь может использовать их для описания графа управления любого вида: x—>y предполагает наличие дуги от модуля x к модулю y и, так как дуга является вектором, x—>y не эквивалентно y—>x. Модуль слева имеет более высокое предшествование, чем правый. То есть, a—>b—>c—>d определяет, что a,b,c и d являются последовательными. Представление x*y означает, что модули x и y параллельны в графе управления. Ясно, что модули x и y коммутативны. Выражение a—>x*y отражает параллельное выполнение x и y после выполнения a. x*y—>b означает, что управление перейдет к b только если оба модуля x и y выполнены.

Скобки ( ) определяют предшествование выполнения для подвыражений управления. Заключенное в скобках подвыражение будет иметь более высокое предшествование, чем член справа.

Пример:

Предложение

start—>aa—>b1 * b2—>c1*c2*c3—>dd—>e*(f — >g) —>end. (1)

показывает цепочку, эквивалентную графу управления на рис.3.

Рис.3. Граф управления для предложения (1)

Очевидно, что модули b1 и b2 параллельны так же, как и модули c1, c2 и c3. После окончания работы модуля ‘аа’ запускается ‘b1’, ‘b2’, а после окончания ‘b1’ и ‘b2’ – ‘с1’, ‘с2’, ‘с3’. Далее следует запуск ‘dd’ (по итогам завершения ‘с1’, ‘с2’, ‘с3’). После ‘dd’ одновременно запускаются ‘e’ и ‘f’, а ‘g’ – только по окончании ‘f’. Как только действие модулей ‘e’ и ‘g’ прекращается, завершается и граф управления.

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

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

Пример:

while cond do start—>a—>b*c—>end.

if cond then start—>a—>b—>end

else start—>c*d—>end.

switch cond case shift: start—>a—>b—>end or

trans: start—>c*d—>end default start—>(a—>b)*c*d—>end

В этом примере cond является областью или противообластью в графе данных или простым сравнением, включающим области и противообласти. В модуле while while do является ключевой фразой. Фрагмент do может быть опущен для достижения эффекта функции wait. В модуле if if then else является ключевой фразой и при желании пользователя фрагмент else может быть опущен. В модуле switch switch case default является ключевой фразой, : и or - ключевыми словами, количество ветвей поor может быть сколь угодно большим, shift и trans являются значениями выбора. default не обязателен. Если он отсутствует и не используется ни один case, то действие не происходит. Проверяющие фрагменты if и while модулей могут быть инвертированы путем установки - перед именем модуля проверки:

if - condition then x else y.

while - condition do x.

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

То есть:

while aaa do sth.

sth: start—>a—>b*c—>d*e—>end & a—>x—>y—>end.

if counter then xx else yy.

xx: start—>b—>c—>end.

yy: start—>x*y—>end.

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

Пример:

start—>a1—>a2*a3—>a4*a5—>a6—>end.

while a3 do start—>b1—>b2—>b3*b4*(b5—>b6)—>end.

if -b1 then c1 else c2.

switch c1 case k1:d1 or k2: d2 or k3: d3 default tem.

tem: start—>d4—>d5*d6—>d7*d8—>end.

while d7.

Рис. 4. Пример графа управления

Подграф – модуль более высокого уровня. Как известно, модуль характеризуется временем задержки, он действует, пока не выполнится условие. Граф управления всегда направлен от ‘start’ к ‘end’. Структура моделируется с точки зрения временных интервалов. Если совершен вход в ‘start’, то время прибытия в модуле может быть сколь угодно долгим, но как только осуществлен выход через ‘end’, то время этого модуля считается завершенным, и можно начинать только следующий модуль, на который передано управление.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]