Язык программирования Паскаль

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

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

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

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

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

Заголовок модуля составляется из служебного слова unit и следующего за ним идентификатора, являющегося именем модуля. Заголовок завершается символом ';' (точка с запятой). Интерфейсная часть начинается со служебного слова interface, за которым следует совокупность обычных описаний. Часть реализации начинается служебным словом implementation, за которым идут описания скрытых объектов. Завершает модуль, как и программу, служебное слово end и символ '.' (точка).

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

Таким образом, общая структура модуля может быть представлена следующей схемой:

  Unit UnitName;
  Interface
    Описание видимых объектов  
  Implementation
    Описание скрытых объектов  
  Begin
  Операторы инициализации объектов модуля
  End.
Структура модуля на языке Паскаль
     

 

В модулях могут использоваться наравне с другими Pascal-объектами процедуры и функции. Заголовок подпрограммы является ее интерфейсом, а тело - реализацией. В соответствии с этой точкой зрения в интерфейсной части модуля должны быть представлены только заголовки процедур и функций, видимые(доступные) для других программ,( но без служебного слова forward), а их полные описания будут содержаться в разделе реализации. При этом описание подпрограммы может иметь сокращенный заголовок, состоящий только из служебного слова procedure или function, имени подпрограммы и символа ';'. (Разумеется, можно повторить полный заголовок подпрограммы, но тогда он должен быть точно таким же, как и заголовок в интерфейсной части).

Например:

Unit summa;

interface

type

complex = record

Re, Im : real;

End;

Procedure InitC (e:complex; R,I :real);

…..

implementation

procedure initc

begin

with c do begin

Re:=R;

Im:=I;

End;

End;

…..

End.

Компиляция и использование модулей

Модуль компилируется точно таким же образом, как и обычные подпрограммы. Но так как модуль не является непосредственно выполняемой единицей, то в результате его компиляции образуется дисковый файл с расширением .TPU (Turbo Pascal Unit), при этом имя файла берется из имени файла с исходным текстом модуля.

Для доступа к ресурсам модуля используется конструкция, называемая спецификацией модуля:

USES

U1, u2, u3;

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

1. В случае перекрытия идентификаторов интерфейсной части используемого модуля с идентификаторами программы, следует учитывать следующее правило: интерфейсные идентификаторы модуля, указанного первым в uses = списке, образуют самый внешний блок программы, и все остальные на него накладываются, закрывая одноименные идентификаторы. Однако можно обойти и этот нюанс: в модуле объявлена переменная x;

Program p;

Uses A;

Var x: integer;

Begin

….

End.

Для того, чтобы в программе P иметь доступ к интерфейсной переменной x необходимо задать составное имя

A.x :=Round(x);

2. Возможны случаи косвенного использования

Например:

unit A; unit B;

interface interface

....... uses A;

end. .......

end.

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

Например:

 

program P;

uses

B;

.....

end.

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

Так, например, следующие отношения являются ошибочными:

unit A; unit B;

interface interface

uses B; uses B;

..... .....

end. end.

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

5. Можно использовать директиву $U для переопределения имени файла. Эта директива имеет параметр, который трактуется как "настоящее" имя файла с данным модулем. Она должна находиться непосредственно перед именем модуля в спецификации использования. Например, конструкция:

uses {$U MY} MyUnit;

приведет к тому, что компилятор будет искать код модуля MyUnit в дисковом файле MY.TPU.

Компиляция и поиск модулей.

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

1. Компилятор просматривает содержимое системного библиотечного файла модулей TURBO.TPL (TURBO PASCAL LIBRARY).

2. Если искомый модуль не найден в файле TURBO.TPL, то компилятор осуществляет поиск соответствующего TPU-файла в ТЕКУЩЕМ каталоге.

3. Если в текущем каталоге нужный файл не найден, то поиск продолжается в каталогах, заданных в альтернативе Options/Directories/Unit Directories для интегрированной среды или в параметре /U вызова TPC-компилятора.

4. Если на предыдущих шагах файл не найден, то компилятор прекращает работу и выдает диагностическое сообщение об ошибке.

5. Если компилятор активизирован посредством альтернатив Compile/Make или Compile/Build, то вышеуказанные шаги проводятся в поисках ИСХОДНЫХ ТЕКСТОВ используемых модулей, которые будут оттранслированы перед трансляцией самой программы. При этом подразумевается, что имя файла с текстом модуля совпадает с именем модуля и имеет расширение .PAS.

Стандартные модули

Turbo Pascal имеет восемь стандартных модулей, в которых, собственно, и содержатся все упоминаемые системные процедуры функции. Имена этих модулей следующие: SYSTEM, DOS, CRT, PRINTER, OVERLAY, GRAPH, TURBO3, GRAPH3.

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

Модуль DOS содержит средства доступа к операционной системе и по существу является программным представлением системного интерфейса MS-DOS.

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

Модуль Printer содержит единственный интерфейсный элемент - переменную Lst стандартного типа text, системно связанную с логическим устройством PRN (то есть с печатающим устройством, если оно имеется в конфигурации). Использование этой переменной в стандартных процедурах Write и Writeln приводит к выводу информации на печать.

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

Модуль Graph объединяет многочисленные программные средства управления графическим режимом работы дисплея. Данный модуль обеспечивает использование всех возможностей наиболее распространенных типов дисплейных адаптеров - CGA, EGA, VGA, Hercules и т. п. как для монохромных, так и для цветных дисплеев, и позволяет создавать разнообразные и эффективные графические программы.

Модули Turbo3 и Graph3 обеспечивают совместимость с данной версией системы Turbo Pascal тех программ, которые были разработаны для ранней версии 3.0