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

5.3. Сцепление модулей.

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

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

Таблица 5.2.

Сцепление Степень сцепления модулей

Независимое 0 (слабое сцепление)

По данным 1

По образцу 3

По общей области 4

По управлению 5

По внешним ссылкам 7

По кодам 9 (сильное сцепление)

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

Модули сцеплены по общей области, если они разделяют одну и ту же глобальную структуру данных.

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

Говорят, что модуль предсказуем, если его работа обусловлена только одними параметрами.

Модуль сцеплен по внешним ссылкам, если у него есть доступ к данным в другом модуле через внешнюю точку входа.

Модули имеют сцепление по кодам, если коды их команд перемежаются друг с другом.

«Стековое» программирование. Основы языка Forth (Форт).

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

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

Синтаксис языка Форт достаточно необычен по сравнению с большинством других языков. Исходный текст программы представляет собой последовательно обрабатываемый Форт-транслятором набор слов и чисел, разделенных пробелами или переводами строки. Все числа, встречающиеся в тексте программы, в конечном итоге попадают в стек. Слова обрабатываются в зависимости от текущего режима: либо ищутся в словаре и непосредственно выполняются, либо компилируются и «записываются» в словарь. Управление режимом работы транслятора Форта также осуществляется с помощью слов. Они могут рекурсивно вызывать транслятор, подключать другие словари для поиска слов, временно переключать входной поток на другой источник и выделять последующие слова как часть своих параметров. Благодаря этим возможностям в язык вводятся элементы привычных синтаксических конструкций, например ветвления и циклов, которые также представляют собой слова. Если в режиме интерпретации слово не найдено в словаре и не опознано как число, то Форт прерывает трансляцию, выполняет очистку стека и выдает сообщение об ошибке.

Одной из особенностей синтаксиса языка Форт является использование постфиксной или обратной польской нотации. Согласно ей символ операции (оператор) записывается после операндов. Например: a b +. Одним из важных достоинств постфиксной нотации является то, что она не нуждается в скобках, при этом порядок действий определяется порядком следования операторов. Постфиксная нотация тесно связана с использованием стека, куда записываются как исходные данные, так и результаты. Например, для выполнения операции перемножения двух чисел в языке Форт можно использовать следующий синтаксис:

5 2 *

В данном случае «*» представляет собой специальное слово. При выполнении этого примера в стек будут последовательно занесены числа 5 и 2, после чего выполнится слово «*», которое выберет их из стека, перемножит и занесет в стек полученный результат. Для того чтобы вывести полученный результат, необходимо использовать слово «.» (точка), которое выбирает (изымает) число, находящееся на вершине стека, и выводит его на экран. Таким образом, выполнение строки

5 2 * .

приведет к выводу на экран числа 10. При постфиксной нотации возможны операции типа a b с * +. При этом результат будет равен a + (b * c).

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

  • SWAP — меняет местами два верхних элемента стека.

  • DUP — дублирует верхний элемент стека.

  • OVER — копирует 2-й элемент стека и заносит его наверх.

  • ROT — переносит последний элемент стека наверх.

  • DROP — удаляет верхний элемент стека.

  • DEPTH — помещает в вершину стека количество элементов, находившихся в нем до выполнения этого слова.

Например, для того чтобы вычислить (а - b) * с, когда в исходном состоянии стек содержит a, b, с, необходимо изменить порядок элементов на c, а, b. Для получения требуемого порядка элементов в стеке можно выполнить набор слов SWAP ROT SWAP. В результате, чтобы вычислить указанное выражение для исходного состава элементов стека потребуется выполнить следующую последовательность слов:

SWAP ROT SWAP - *

Таким образом, при работе со стеком необходимо учитывать его текущее состояние. При попытке записать в стек слишком большое количество чисел или извлечь что-то из «пустого» стека возникнет сообщение об ошибке.

Для работы со словарем, его модификации и дополнения в Форте предусмотрены специальные слова. Добавление новых и переопределение существующих слов в словаре осуществляется с помощью команды «:» (двоеточие) и имеет следующий синтаксис:

: <ОПРЕДЕЛЯЕМОЕ_СЛОВО> [<СУЩЕСТВУЮЩИЕ СЛОВА>] ;

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

Рассмотрим, например, определение слова, позволяющего возвести в квадрат число, находящееся на вершине стека:

: SQUARE DUP * ;

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

7 SQUARE .

выведет на экран число 49. А следующее определение на базе только что описанного слова SQUARE позволит вычислять уже куб числа:

: CUBE DUP SQUARE * ;

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

Еще одна особенность языка Форт заключается в том, что он дает возможность программисту определить некоторые слова на языке ассемблера, когда требуется максимальное быстродействие. Базовая Форт-система содержит множество слов, которые определены не с помощью других слов, а непосредственно на машинном языке. К числу таких слов относятся, например, +, *, DUP, SWAP.