→ Как записывается модуль в паскале. Pascal. Пользовательские модули. Основные графические процедуры и функции

Как записывается модуль в паскале. Pascal. Пользовательские модули. Основные графические процедуры и функции

Модули в Паскале по отношению к основной части программы напоминают подпрограммы (процедуры и функции). Но по определению они являются самостоятельными программами, ресурсы которых могут быть задействованы в других программах. Кроме того описание модулей происходит вне вызывающего приложения, а в отдельном файле, поэтому модуль – это отдельно компилируемая программа. Файл скомпилированного модуля (именно такой нужен для использования) будет иметь расширение предусмотренное средой программирования (например, .tpu, .ppu, .pcu).

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

Структура модуля выглядит так:

Unit <имя модуля>;
Interface
<интерфейсная часть>
Implementation
<исполняемая часть>
Begin
<инициализация>
End.

Имя модуля (Unit)

Имя модуля, следующее после ключевого слова Unit , должно совпадать с названием файла (без.pas), в котором находиться его код. Также с помощью имени, модуль подключается к другому модулю, либо к основной программе. Для этого необходимо указать служебное слово Uses , и перечислить через запятую список подключаемых модулей:

Uses <список имен модулей>;

Интерфейсная часть (Interface)

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

1
2
3
4
5
6

unit Search;
Interface

var s: string ;

Для объявления данного модуля, в программе нужно указать его имя:

После чего станет возможным использование всех описанных в интерфейсной части объектов.

Исполняемая часть (Implementation)

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

Инициирующая часть

Инициирующая часть начинает свою работу до начала выполнения основной программы. В ней (между Begin и End), как правило, описываются операторы, предназначенные для разного рода вспомогательной работы. Данная часть может отсутствовать, либо не иметь в себе никакого кода. В первом случае нужно указать End с точкой, во втором – оставить пустое место внутри Begin и End.

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

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

Turbo Pascal

Итогом компиляции модуля в Turbo Pascal, будет файл с расширением .tpu (Turbo Pascal Unit ), хранящий его код.

Free Pascal

После компиляции модуля в среде Free Pascal, создаются два файла с разными разрешениями: .ppu и .o . Первый содержит интерфейсную часть модуля, а второй (необходим для компоновки программы) – часть реализаций.

Pascal ABC.NET

Pascal ABC.Net во время компиляции модуля не генерирует код на машинном языке. В случае, если компиляция выполнена успешна код сохраняется в файле с разрешением .pcu .

Для сред программирования Turbo Pascal и Free Pascal предусмотрены три режима компиляции: Compile, Make и Build . В режиме Compile все используемые в программе модули должны быть заранее скомпилированы. Приложение в режим Make-компиляции проверяет все подключенные модули на наличие файлов с соответствующим для среды программирования разрешением (.tpu или.o). Если какой-то из них не найден, то происходит поиск файла с названием ненайденного модуля и расширением.pas. Самый надежный из режимов – Build. Поиск и компиляция файлов (с расширением.pas) в данном режиме происходит даже тогда, когда модульные файлы уже имеются.

Пример

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

unit Search;
Interface
type arr = array [ 1 ..5 ] of integer ;
var s: string ;
procedure binary_search(x: integer ; Ar: arr; var s: string ) ;
procedure line_search(x: integer ; Ar: arr; var s: string ) ;
Implementation
var a, b, c, i: integer ;
procedure binary_search(x: integer ; Ar: arr; var s: string ) ;
begin
a:= 1 ; b:= 5 ; s:= ‘NO’ ;
while a<= b do
begin
c:= a+ (b— a) div 2 ;
if (x b:= c— 1
else if (x>Ar[ c] ) then
a:= c+ 1
else
begin s:= ‘YES’ ; break ; end ;
end ;
end ;
procedure line_search(x: integer ; Ar: arr; var s: string ) ;
begin
s:= ‘NO’ ;
for i:= 1 to 5 do
begin
if (Ar[ i] = x) then
begin
s:= ‘YES’ ; break ;
end ;
end ;
end ;
end .

Весь этот код должен находиться в отдельном файле. Теперь напишем основную программу, в которую подключим наш модуль Search.

Модуль не представляет собой исполняемой программы, а только содержит набор средств для использования в исполняемой программе: типы данных, переменные, процедуры и функции. Исходный текст модуля имеет расширение.pas. Модуль компилируется отдельно от основной программы, откомпилированный модуль имеет расширение.tpu (Turbo Pascal Unit). Готовый откомпилированный модуль может быть использован в основной программе с помощью предложения uses, которое записывается сразуже после имени программы.

В Турбо Паскале имеются стандартные модули:DOS, CRT (Cathode Ray Tube, электронно-лучевая трубка), Printer, Graph, System и другие. Их не надо описывать, а можно сразу включать в программу предложением uses. Модуль System используется во всех программах, поэтому для него сделано исключение, его можно не включать в предложение uses, он будет подключен автоматически. Остальные модули требуют включения в предложение uses, если в программе используются ресурсы модуля, например, процедуры и функции.

Структура модулей

Модуль имеет следующую структуру:
Unit < имя >;
Interface
< интерфейсная часть >
Implementation
< исполняемая часть >
[ Begin < инициирующая часть > ]
End.

Здесь:
Unit - кодовое слово (англ. модуль); начинающее заголовок модуля;
<имя> - имя модуля (правильный идентификатор);
Interface - кодовое слово, начинающее интерфейсную часть модуля;
Implementation - кодовое слово (англ. реализация); начинает исполняемую часть;
Begin - кодовое слово, начинающее инициирующую часть;
(часть модуля Begin < инициирующая часть > необязательна);
End. - признак конца модуля.

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

Интерфейсная часть открывается кодовым словом Interface . В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными основной программе и/или другим модулям.

Следует учесть, что все константы и переменные, объявленные в интерфейсной части модуля, равно как и глобальные объекты основной программы, помещаются компилятором Турбо-Паскаля в обилии сегмент данных (максимальная длина сегмента 65521 байт).

Порядок появления различных разделов объявлений и их количество могут быть произвольными.

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

Исполняемая часть

Исполняемая часть начинается кодовым словом Implementation и содержит тела процедур и функций, объявленных в интерфейсной части. В этой части могут также объявляться локальные для модуля объекты: вспомогательные типы, константы, переменные и блоки, а также метки, если они используются в инициирующей части. Ранее объявленные в интерфейсной части глобальные процедуры и функции должны описываться в той же последовательности, в какой появляются их заголовки в интерфейсной части. Описанию глобального блока в исполняемой части должен предшествовать заголовок, в котором разрешается опускать список формальных переменных (и тип результата для функции), так как они уже описаны в интерфейсной части.

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

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

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

В среде Турбо-Паскаля имеются средства, управляющие способами компиляции модулей и облегчающие разработку крупных программных проектов. В частности, определены три режима компиляции: Compile, Make и Build, Режимы отличаются только способом связи компилируемого модуля или компилируемой основной программы с другими модулями, объявленными в предложении Uses.

При компиляции модуля или основной программы в режиме Compile все упоминающиеся в предложении Uses модули должны быть предварительно откомпилированы и результаты их компиляции должны быть помещены в одноименные файлы с расширением.TPU. Например, если в программе (в модуле) имеется предложение Uses Global, то на диске в каталоге, объявленном опцией Unit directories, уже должен находиться файл GLOBAL.TPU. Файл с расширением.TPU (от англ. Turbo-Pascal Unit) создается в результате компиляции модуля.

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

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

В режиме Build существующие TPU-файлы игнорируются, и система пытается отыскать (и компилировать) соответствующий PAS-файл для каждого объявленного в Uses модуля. После компиляции в режиме Build программист может быть уверен в том, что учтены все сделанные им изменения в любом из модулей.

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

6 вопрос

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

1). TextMode(режим: integer) - выбирает указанный текстовый режим Режимы CRT:

2).TextBackground (цвет: byte) - Выбирает фоновый цвет.

Параметр "цвет" представляет собой выражение целого типа, например:

  • 0- черный
  • 1-синий
  • 2-зеленый
  • 3-голубой

3). ClrScr - Очистка экрана. Все позиции символов заполняются пробелами. При этом используются текущий фоновый цвет, заданный в процедуре TextBackGround.

4). TextColor (цвет:byte) - Устанавливает цвет символов. { константы для установки цвета}

5). Window(x1,y1,x2,y2) - Определяет на экране текстовое окно. Параметры x1,y1 представляют собой координаты верхнего левого угла окна, параметры x2,y2 - координаты правого нижнего угла.Минимальный размер один столбец на одну строку. Максимальный - Х=80, У=25.Если координаты являются недопустимыми, то обращение к процедуре Window игнорируется. По умолчанию задается окно на весь экран.

6).GoToXY(x,y: byte) - Позиционирует курсор. Курсор перемещается в ту позицию внутри текущего окна, которая задана координатами x и y (x - задает столбец, y - задает строку).Верхний левый угол задается координатами (1,1) пример: Window(1,10,60,20); GoToXY(1,1); Это приведет к тому, что курсор уйдет в точку с абсолютными координатами (1,10).

7).WhereX и WhereY возвращают для текущей позиции курсора относительно текущего окна координаты X и Y соответственно. Тип результата Byte.

8).Delay(мсек: word) - Выполняет задержку на заданное число миллисекунд. Параметр "мсек" задает число миллисекунд интервала ожидания. Но данная процедура является приблизительной, поэтому период задержки не будет точно равнятся заданному числу миллисекунд.

9).READKey - Считывает символ с клавиатуры.

10).Sound - является процедурой включающей внутренний динамик; Описание: Sound(герц: word); где параметр "герц" задает частоту генерируемого сигнала в герцах.Звук будет звучать до тех пор пока не будет выключен посредством обращения к процедуре NoSound;

11).NoSound - Выключает внутренний динамик.

Пример использования Sound,Delay,NoSound

Sound(220); { включить звук }

Delay(300); { ждать 300 ms }

NoSound; { выключить звук }

7 вопрос.

Модуль Graph

ТР обладает достаточно разнообразными средствами для работы со стандартным VGA экраном.

VGA адаптер имеет разрешение 640х480 пиксел (точка (0,0) в левом верхнем углу экрана), 16 цветов.

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

Общая структура графической программы:

Uses crt, graph;
var Gd, Gm: Integer;
begin
Gd:= Detect;
InitGraph(Gd, Gm, "c:\bp\bgi");
...
{Здесь построение изображения}
...
ReadKey;
CloseGraph;
end.

Путь c:\bp\bgi указывает расположение файла egavga.bgi (драйвер графического адаптера). На разный компьютерах этот путь может быть разным. Если файл egavga.bgi поместить в каталог с программой, то путь можно не указывать.

Основные графические процедуры и функции:

Построение фигур

PutPixel(x,y,c)
- отображает на экране точку с координатами (x,y) и цветом c

Line(x1,y1,x2,y2)
- рисует линию с началом в точке (x1,y1) и концом - (x2,y2)

Rectangle(x1,y1,x2,y2)
- рисует контур прямоугольника с диагональю (x1,y1) - (x2,y2)

Bar(x1,y1,x2,y2)
- рисует закрашенный прямоугольник с диагональю (x1,y1) - (x2,y2)

Circle(x,y,r)
- рисует окружность с центром (x,y) и радиусом r

Ellipse(x,y,ba,ea,xr,yr)
- рисует дугу эллипса с центром в (x,y), горизонтальным и вертикальным радиусом xr и yr, и начальным и конечным углом ba и ea

FillEllipse(x,y,xr,yr)
- рисует закрашенный эллипс с центром в (x,y), горизонтальным и вертикальным радиусом xr и yr

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

Модуль - это самостоятельная программная единица, которая является автономно компилирующей и имеет определенную структуру.

Модуль имеет следующую структуру:

Заголовок модуля на языке Паскаль состоит из служебного слова Unit и следующего за ним именем модуля. К имени модуля предъявляются жесткие требования и это имя должно совпадать с именем дискового файла с расширением.pas, в котором находится текст модуля.

Unit MyType; //файл MyType.pas

Имя модуля служит для связи модуля с программами и другими модулями. Программы и модули устанавливают связь с требуемым модулем в разделе Uses программы или модуля. Модули для своей работы могут вызывать другие модули, если модуль вызывает другой модуль, то раздел Uses должен следовать за служебным словом INTERFACE.

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

Unit Wodmass;

INTERFACE

USES MyType;

[имя_типа]:[тип];

[список_глобальных_переменых]:[тип];

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

Исполняемая часть языка Паскаль начинается служебным словом IMPLEMENTATION и содержит описание подпрограмм, объявленных в интерфейсной части, кроме того в исполняемой части могут быть объявлены локальные для модуля объекты (переменные, константы). Описание подпрограммы в исполняемой части должно начинаться с заголовка подпрограммы, при этом список формальных параметров опускается.

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

Компиляция модулей на языке Pascal

При работе с модулями необходимо выполнять компиляцию самих модулей и компиляцию программ, использующих модули. Как известно в среде Borland Pascal имеется три режима компиляции (Compile, Build, Make). При компиляции самого модуля обычно используется режим Compile, хотя можно и другими режимами, в том случае если модуль используется другие модули. При компиляции модуля не создается исполняемая программа, а создается специальный файл откомпилированного модуля с расширением.tpw. Файлы откомпилированных модулей помещаются в каталоги, обычно с именем Units (задается при настройках среды). При компиляции программ, содержащих модули, могут быть использованы все три режима компиляции. Компиляция разными режимами отличаются продолжительностью и надежностью.

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

В режиме Make компилятор проверяет наличие подключаемых модулей и если какой-то модуль не найдем, компилятор ищет текст модуля с расширением.pas, компилирует модуль и после этого компилирует программу. Кроме того компилятор проверяет даты создания модулей.tpw и.pas. Если он обнаруживает, что дата создания файла.pas более поздняя, чем.tpw, он делает вывод, что в тексте модуля были произведены изменения и заново перекомпилирует модули. Тем самым это надежнее.

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

Подключаемые модули.

1. Основные положения

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

2. Общая структура подключаемого модуля

Unit <имя модуля>; Interface Implementation End.

Структурно в подключаемом модуле можно выделить три раздела: 1) Интерфейсный раздел – interface (должен быть объявлен, может быть пустым) 2) Раздел реализаций – implementation (должен быть объявлен, может быть пустым) 3) Тело модуля – begin-end. (может отсутствовать)

2.1. Интерфейсный раздел.

Интерфейсный раздел – область подключаемого модуля, начинающаяся с ключевого слова interface и заканчивающаяся ключевым словом implementation, которая может содержать: - список подключаемых модулей; - константы; - пользовательские типы данных; - переменные; - прототипы процедур и функций, доступные из места подключения данного модуля. Замечание 1: переменные, объявленные в разделе интерфейсов, являются глобальными. То есть существуют в любом месте программы, где подключен данный модуль, в том числе в разделе реализации самого модуля. Замечание 2: как и в программе, вышеперечисленные секции (объявления констант, переменных и др., за исключением секции uses) в данном разделе могут быть расположены в любой последовательности и в любом количестве. Замечание 3: если в данном разделе объявляются прототипы процедур/функций, то их реализации должны гарантированно присутствовать в разделе implementation. Основное назначение: определяет общедоступные данные/функционал для применения из программы или модуля, использующих данный модуль.

Пример интерфейсного раздела:

Interface {подключаемые модули} Uses AnotherUnit; {константы} Const PI=3.14159265; E=2.71828182; {пользовательские типы данных} Type TMyType=array[-3..7] of real; {переменные} Var temp:TMyType; {процедуры и функции} Procedure Fill(var x:TMyType); Function Find(const x:TMyType; const Value:real):Boolean; Implementation

2.2. Раздел реализаций.

Раздел реализаций – область подключаемого модуля, начинающаяся с ключевого слова implementation и заканчивающаяся телом модуля (если таковое имеется) или ключевым словом end с точкой, означающим конец модуля, в которой располагаются реализации процедур и функций, объявленных в интерфейсном разделе, которая может содержать: - список подключаемых модулей; - константы; - пользовательские типы данных; - переменные; - процедуры и функции, необходимые для реализации процедур/функций, объявленных в интерфейсном разделе. Основное назначение: реализация процедур и функций, описанных в секции interface. Замечание 1: при реализации процедур и функций, описанных в интерфейсной секции, их заголовки могут быть описаны в сокращенной форме. Исключение - PascalABC: при использовании переменных заголовка в тексте реализации возникает ошибка компиляции.

Пример 1 (заголовки в сокращенной форме):

Unit DemoUnit; Interface {прототип процедуры} Procedure Swap(var a,b:integer); Implementation {реализация процедуры} Procedure Swap; Var Temp:integer; Begin Temp:=a; a:=b; b:=Temp; end; end.

Пример 2 (заголовки в полной форме):

Unit DemoUnit; interface {прототип функции} Function GetMax(a,b:integer):integer; Implementation {реализация функции} Function GetMax(a,b:integer):integer; Begin If a>b then GetMax:=a Else GetMax:=b; End; End.

2.3. Тело модуля.

Тело модуля – последняя область подключаемого модуля, образуемая парой ключевых слов: «begin» и «end.», в которой можно размещать программный код аналогично главной программе. Тело модуля может отсутствовать. В таком случае ключевое слово «begin» не пишется, а «end.» сигнализирует о конце модуля. Основное назначение: инициализация переменных модуля, выделение ресурсов, необходимых для его работы и т.д.

Пример модуля, содержащего тело:

Unit DemoUnit; Interface Const N=50; Var Roots:array of real; Implementation Uses Math; Var I:integer; {тело модуля} Begin For i:=1 to N do Roots[i]:=sqrt(i); End.

Пример модуля без тела: (см. пример модуля для заголовков в полной форме).

Замечание 1: Программный код, размещенный в теле модуля, выполняется один раз – при загрузке модуля, до начала исполнения кода главной программы. Замечание 2: В случае, когда в секции uses подключено несколько модулей, имеющих разделы инициализации, выполнение кода этих разделов идет в порядке подключения модулей.

2.4. Дополнительные разделы в структуре модуля.

Компиляторы Free Pascal, Pascal ABC, Pascal ABC.Net допускают помимо перечисленных выше еще два раздела: - раздел инициализации - раздел финализации. 2.4.1. Раздел инициализации. Раздел инициализации – область подключаемого модуля, размещаемая после по окончании раздела реализаций, начинающаяся с ключевого слова initialization и заканчивающаяся разделом финализации, если таковой имеется, или ключевым словом end с точкой. Назначение аналогично телу модуля. 2.4.2. Раздел финализации. Раздел финализации – область подключаемого модуля, размещаемая по окончании раздела инициализации, если таковой имеется, или по окончании раздела реализаций, и заканчивающаяся ключевым словом end с точкой. Основное назначение: освобождение ресурсов, выделенных для работы модуля.

unit DemoUnit; interface var a:array of ^integer;{массив указателей} implementation {выделение памяти и инициализация значениями} procedure AllocateArray; var i:integer; begin for i:=1 to 20 do begin New(a[i]); a[i]^:=i; end; end; {освобождение памяти} procedure DeallocateArray; var i:integer; begin for i:=1 to 20 do Dispose(a[i]); end; initialization AllocateArray;{инициализация - начало работы - выделяем память} finalization DeallocateArray;{финализация - конец работы - осовобождаем память} end.

Замечание 1: программный код, размещаемый в перечисленных разделах, исполняется один раз. Код разделов инициализации – до начала исполнения кода главной программы, код разделов финализации – после. Замечание 2: при наличии в модуле любого из данных двух разделов, наличие тела модуля более не допускается.

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

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

3.1. Компиляция в Turbo Pascal.

Результатом компиляции подключаемого модуля в Turbo Pascal-е является *.tpu – файл (Turbo Pascal Compiled Unit), представляющий собой машинное представление данных и кода, размещенных в нем.

3.2. Компиляция в Free Pascal.

Результатом компиляции подключаемого модуля в Free Pascal-е являются два файла: *.ppu – файл, содержащий интерфейсную часть модуля, и файл *.o - объектный файл, содержащий часть реализаций. Причем последний необходим для компоновки приложения.

3.3. Компиляция в Pascal ABC.Net.

В отличие от перечисленных выше сред в Pascal ABC.Net в процессе компиляции модуля не генерируется код на машинном языке. Компилятор данной среды завершает свою работу после выполнения семантического анализа, сохраняя семантическое дерево модуля в промежуточный формат - *.pcu – файл, который в первом приближении можно считать результатом компиляции с обозначенными ограничениями.

3.4. Ускорение компиляции программ.

На этапе компоновки приложения, компоновщик собирает исполняемый модуль, принимая на вход объектные модули. Таким образом, имея уже откомпилированные подключаемые модули, компиляция программ с их использованием ускоряется, так как они уже обработаны. Данное справедливо для Turbo и Free Pascal-ей. Однако, в Pascal ABC.Net ускорение компиляции достигается только за счет того, что отсутствует необходимость проводить синтаксический и семантический анализ. Вывод: откомпилированные версии исполняемых модулей не совместимы между различными компиляторами.

Код к задаче: «Подключаемые модули»

Textual

Листинг программы

Unit u1; interface procedure PrintFirst; procedure PrintFirstSecond; implementation uses u2; { <--- Раньше было в Interface } procedure PrintFirst; begin writeln("Print first"); end; procedure PrintFirstSecond; begin writeln("Print first"); PrintSecond; end; end.

 

 

Это интересно: