Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VPKS_v2_UKR_new.doc
Скачиваний:
21
Добавлен:
11.09.2019
Размер:
2.31 Mб
Скачать

6. Конструктор альтернативного процесу

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

Альтернативний конструктор формується за допомогою зарезервованого слова ALT, під яким приводиться список компонентів, що є альтернативами. Кожна альтернатива складається зі сторожа й альтернативного процесу.

Сторож може бути або процесом-примітивом введення, або процесом-примітивом SKIP. Таким сторожам можуть передувати логічні вирази, відділені від процесів-примітивів знаком амперсанта (&).

Логічні вирази виключають додаткові обмеження на виконання того або іншого альтернативного процесу.

Приклад:

PAR

червоний ! вираз.1

зелений ! вираз.2

ALT

обраний.червоний&червоний?Х

вивід ! Х

обрано зелений&зелений?Х

вивід ! Х

NOT (обран.червоний OR обран.зелений)& SKIP

вивід ! значення.по.умовчанню

Тут:

  1. червоний, зелений, вивід - імена каналів

  2. NOT (обран.червоний OR обран.зелений) обран.червоний; обран.зелений - логічні вирази;

  3. обраний.червоний & червоний ? Х; обран.зелений & зелений ? Х; NOT(обран.червоний OR обран.зелений)& SKIP - сторожові процеси;

  4. вивід ! Х; вивід ! значення.по.умовчанню - альтернативні процеси.

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

Це в прикладі вивід у канал “червоний” або у канал “зелений”. Сторож SKIP готовий постійно.

Якщо сторожу передує логічний вираз, то для виконання альтернативного процесу потрібно крім готовності процесу-примітива введення ще й наявність істинності логічного виразу. Якщо одночасно готові декілька сторожів, тоді випадковим образом вибирається для виконання один з них. Виключенням є сторожовий процес, утворений за допомогою SKIP. Він перевіряється в останню чергу.

Після виконання одного з альтернативних процесів, процес-композиція ALT закінчується.

У конструкторі ALT для виконання вибирається не більше однієї альтернативи. Якщо ж один із сторожів не готовий, весь процес, утворений конструктором ALT упадає в дедлок і поводиться подібно процесу-примітиву STOP

7. Описи

Кожне ім'я в Оккам-програмах повинне бути описане до того, як воно буде використано. У мові Оккам є описи, які дозволяють іменувати константи, змінні й канали (а також процеси).

Описи констант не вводять у програму нових об'єктів, а лише дозволяють іменувати особливі для логіки програми значення (бітові зразки). Описи констант мають такий вигляд:

DEF ім'я_константи = константний_вираз:

Описи констант відділяються друг від друга комами. Рядок описів закінчується двокрапкою. Число рядків описів у програмі необмежено. Варто звернути увагу на те, що в правій частині опису констант можна записувати не тільки литерали, але й константні вирази, що дуже зручно при супроводі програмного забезпечення. Наприклад, визначимо ряд констант, які потім будемо використовувати в програмі системи автоматичного регулювання вуличних рухів:

DEF Nsgo = 0, Ewgo = 1, stop = 2, chToStop = 3:

Відзначимо, що константу stop у даному контексті можна визначити так:

DEF stop = NSgo + 1:

або

DEF stop = chToStop -1:

Перебуваючи в оточенні цих символічних констант, можна використати перевірку:

Dir = NSgo

або

current.state = stop

а не

dir = 0

де dir і current.state - деякі змінні.

Остання перевірка може бути незручна при змінах великої програми.

Змінні описуються в списку імен змінних після зарезервованого слова VAR перед процесом, у якому вони будуть використані. Імена змінних відділяються один від одного комами, а закінчується список імен двокрапкою. Наприклад:

VAR dir, current.state, running:

Спочатку змінні не мають певного значення, але після використання їх у лівій частині процесу-примітива присвоювання або як аргументи процесу-примітива введення вони одержують певне значення. Значення - це якась бітова послідовність, що змінні здатні зберігати доти, доки в них не будуть записані деякі нові значення.

Опису об'єктів програми можуть перебувати де завгодно, але до їхнього використання. Область видимості (локальності) об'єкта перебуває всередині процесу, перед яким він описаний, і у всіх його підпроцесах. Приклад взаємного розташування описів і процесів:

DEF Nsgo = 0, Ewgo = 1; stop = 2, chToStop = 3:

VAR dir, current.state, running:

SEQ

running := TRUE

current.state := NSgo

... - інша частина програми

Канали описуються так само, як і змінні, за винятком того, що їхній опис випереджається зарезервованим словом CHAN. Усюди, де зустрічається опис каналу, в області видимості цього опису повинне бути два паралельних процеси, один із яких виводить у канал значення виразу, а інший вводить через нього нове значення змінної. Ми не розглядаємо тут випадок, коли канали описані, але не використовуються. Звичайно канали описуються безпосередньо перед конструктором PAR. Ці зауваження дозволяють користувачеві уникнути багатьох випадків виникнення дедлока. Наприклад:

DEF NSgo = 0, EWgo = 1, stop = 2, chToStop = 3:

VAR dir, current.state, running:

SEQ

running := TRUE

current.state := NSgo

CHAN NSstate, EWstate, change:

PAR

change ? dir

SEQ

IF

dir = NSgo

NSstate ! Nsgo

... - інша частина програми

Область видимості змінних і каналів можна проілюструвати на прикладі:

CHAN input: — оголошення каналу input PAR — область

VAR x: — оголошення х — видимості

— (х - ціла змінна) — SEQ — область видимості— х := х + 1

input ! х

VAR х, а: - оголошення х -

- (х - логічна змінна) -

SEQ - область видимості -

input ? a

х := а<>0

Тут ім'я х позначає дві різні змінні. У першому процесі змінна x використовується для зберігання чисел (цілих значень), а в другому — для булевих значень. У всіх зображених процесах "видний" канал input.

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