≪
≫

Модули

------------------------------------------ PASCAL-XSC ---

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

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

module Имя,

ПредложениеПзе; ...

global Объявление; ... { global может быть опущено }

begin { может быть опущено вместе с операторной частью } Оператор; ...

end.

После зарезервированного слова module следует идентификатор модуля.

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

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

global type complex = record re, im: real end;

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

global type complex = global record re, im: real end;

экспортирует как идентификатор типа complex, так и идентификаторы компонент записи re, im.

Пример 2.8.1.

Определение простого модуля для работы с комплексными числами может быть таким:

----------------------------------------- PASCAL-XSC ---

module ComplexArithmetic;

global type complex = global record re, im: real end;

global operator + (z, w: complex) res: complex;

begin

res.re := z.re + w.re;

res.im := z.im + w.im;

end;

global operator * (z, w: complex) res: complex;

begin

res.re := z.re * w.re — z.im * w.im;

res.im := z.re * w.im + z.im * w.re;

end;

end.

Программа или другой модуль, используя предложение use, делает «видимыми» объекты, предназначенные для экспорта в используемых модулях (импорт объектов). Если предложение use содержит зарезервированное слово global, то все объекты, импортированные с помощью этого предложения, могут снова быть экспортированы. Предложение use имеет следующий вид:

Iuse global СписокИдентификаторовМодулей

{ global может быть опущено }

Пример 2.8.2.

Нижеприводимый модуль предоставляет дополнительные возможности для работы с комплексными векторами на основе модуля ComplexAri thmetic:

module ComplexVectorArithmetic;

use global ComplexArithmetic;

global type

complexvector = global dynamic array [*] of complex;

global operator + (x, y: complexvector)

res: complexvector [lbound(x)..ubound(x)];

var i: integer;

begin

for i := Ibound(x) to ubound(x) do res[i] := x[i] + y[i];

end;

end.

----------------------------------------- PASCAL-XSC ---

Если другая программа или модуль содержит предложение use

use ComplexVectorArithmetic;

то тип complexvector и соответствующая операция сложения становятся «видимыми». Тип complex и соответствующие операции сложения и умножения также доступны, поскольку модуль, в котором они определены, связан глобально с помощью

use global ComplexArithmetic;

Поэтому в программу или другой модуль не нужно включать модуль ComplexArithmetic для того, чтобы получить доступ к его объектам. Но если бы в модуле ComplexVectorArithmetic стояло

use ComplexArithmetic;

то это же предложение use необходимо было бы включить в модуль или главную программу, которая импортирует модуль ComplexVectorArithmetic.

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

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

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

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

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

 
Посмотреть оригинал