Основы программирования — Осенний семестр; Михалкович С.С.; 2008; V

Материал из Вики ИТ мехмата ЮФУ
Версия от 12:40, 4 июня 2009; Juliet (обсуждение | вклад) (Новая: Категория:Конспекты Категория:Основы программирования ==Модули== === Введение === '''Модуль''' — это с...)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Модули

Введение

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

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

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

Пример.

Модуль MyLib
unit MyLib;

interface       // раздел интерфейса
const
  MyPi = 3.14;
var
  size: integer := 10;

function AddSquares(a, b: real): real;
procedure InvertPrint(a, b: integer);

implementation  // раздел реализации
var i: integer;

function MySqr(a: real): real;
begin
  result := a * a;
end;

function AddSquares(a, b: real): real;
begin
  result := MySqr(a) + MySqr(b);
end;

procedure InvertPrint(a, b: integer);
begin
  write(b, ' ', a);
end;

end.            // конец модуля
Программа, подключающая модуль MyLib
uses MyLib;

var
  n: integer;

begin
  writeln(size);
  writeln(AddSquares(3, 4));
  InvertPrint(3,4);
end.


Модуль в языке Object Pascal состоит из двух разделов:

  • раздел интерфейса
  • раздел реализации

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

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

Данный принцип получил название принципа сокрытия информации.
Его преимущества:

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

Лекция 14

Синтаксис модуля

unit <имя модуля>;

interface
[uses <список модулей>;]
<раздел описаний модуля: для п/п — только заголовки>

implementation
[uses <список модулей>;]
<раздел описаний, где даны реализации п/п из раздела interface>


[initialization
  <операторы>]                 begin
                       |         <операторы>
[finalization                  end.
  <операторы>]

Семантические ограничения

  • Модули, перечисленные в секции uses в разделах интерфейса и реализации не должны пересекаться;
  • циклическая зависимость между модулями в разделе интерфейса запрещена:
unit A;        unit B;
interface      interface
uses B;        uses A;
тем не менее, если A ссылается на B в разделе интерфейса, а B ссылается на A в разделе реализации, то это допустимо:
unit A;        unit B;
interface      interface
uses B;        implementation
               uses A;
потому что модули компилируются в два этапа:
  • интерфейс
  • реализация

Разделы инициализации и финализации модуля

unit A;                       основная программа
...
initialization                uses A;
  <операторы1>                
finalization                  begin
  <операторы2>                  <операторы3>
end.                          end.

Операторы в разделе initialization модуля выполняются раньше тела основной программы,
а операторы в разделе finalization выполняютсяпосле основной программы.

Т.е. последовательность выполнения будет такой:

<операторы1> 
<операторы3>
<операторы2> 

Примечание. В разделе инициализации обычно инициализируются глобальные переменные из раздела интерфейса.

Пример.

unit A;

interface
var
  RandomNumber: integer;

implementation
...
initialization
  RandomNumber := Random(100);
end.

Схема компиляции программы с модулями

<Здесь будет рисунок>

1. Компилируется файл основной программы.
2. Если в нем встречена секция uses, то компилируются модули из этой секции слева направо.
3. Каждый модуль компилируется так же, как и основная программа по пунктам 1-2:

Если в модуле подключаются другие модули, то компилируются они,
и так происходит до тех пор, пока компилятор не дойдет до модулей, не содержащих подключения других модулей.

4. По окончании компиляции модуля его откомпилированный вариант (.pcu в PascalABC.NET) записывается на диск.
5. После записи откомпилированного модуля на диск компилятор возвращается к основному модулю (вызывающему) или программе, и докомпилирует его до конца. Основная программа после компиляции хранится в оперативной памяти.
6. Первый этап компиляции закончен. Начинается заключительный этап компиляции — линковка (компоновка). Специальная программа — линковщик — собирает из откомпилированных модулей единый исполняемый файл (.exe в Windows).

Замечание 1. Ошибки могут происходить как на этапе компиляции, так и на этапе, собственно, линковки.
Замечание 2. Наличие откомпилированного файла модуля существенно ускоряет процесс компиляции (сводя его к процессу линковки).
Замечание 3. Если есть откомпилированные файлы модулей, то исходные тексты модулей можно удалить. При этом компилятор проанализирует, что данный модуль откомпилирован, и продолжит компиляцию дальше.
Замечание 4. Если файл модуля .pas создан после откомпилированного файла модуля (.pcu), то произойдет его перекомпиляция.
Замечание 5. При работе в интегрированной среде компилятор в первую очередь берет тексты модулей из открытых файлов и только затем смотрит файлы на диске.

Примечание 1. Файлы модулей могут храниться в другом каталоге относительно файла исходной программы. Тогда надо вместе с именем модуля указывать, в каком каталоге он хранится (тогда имя модуля и имя файла модуля могут не совпадать):

— Main ——————————— MyPr.pas
    |
    |— Modules | — a.pas
               | — b. pas
MyPr.pas
program MyPr;
uses
  A in 'Modules\a.pas';
  B in 'Modules\b.pas';

Примечание 2. Откомпилированные файлы модулей по умолчанию создаются:

  • в каталоге основной программы
  • если установлен специальный путь в среде программирования для выходных файлов, то по этому пути

Кроме этого, стандартные откомпилированные модули хранятся в специальной папке, например, в PascalABC.NET — в папке \LIB. Если модуль претендует на звание стандартного, его можно туда поместить.

Упрощенная структура модуля

В PascalABC.NET можно использовать упрощенную структуру модуля:

unit <имя модуля>;
<раздел описаний>
[begin
  <операторы>]
end.

В <разделе описаний> описываются типы, константы, переменные и подпрограммы.
Раздел begin + <операторы> соответствует разделу инициализации.

Алгоритм поиска имен в модулях

В разных модулях могут находиться объекты с одинаковыми именами, т.к. модуль является пространством имен.
Как же осуществляется поиск имен в модулях?

Правило 1. Имя вначале ищется в текущем модуле. Если не найдено, то в подключенных модулях секции uses справа налево.
Правило 2. Если нужно явно указать переменную из какого-то модуля, то перед ней ставится <имя модуля>.

Пример.

unit A;
uses B;
var n, m: integer;
...
end.
unit B;
var n, k, m: integer;
...
end.
program MyPr;
uses A, B;

var n: integer;
begin
  n := 5;    // из основной программы
  k := 6;    // из B
  m := 7;    // из B
  A.n := 8;  // из A
  B.n := 9;  // из B
  A.m := 10; // из A
end.

Стандартный системный модуль PABCSystem

<xh4></xh4>

Лекция 15

Документирующие комментарии ///

Библиотеки. Отличие библиотек от модулей. Подключение библиотек в PascalABC.NET.

Перечислимый и диапазонный типы. Стандартные функции Ord Pred Succ. Стандартные процедуры Inc Dec.

Использование перечислимого типа в for и case.