1 | |||||||||||||||||||||||||||||||
Подключаемые модули15.11.2012, 20:57. Просмотров 56597. Ответов 1
Подключаемые модули. 1. Основные положения Подключаемый модуль – файл, содержащий исходный текст на языке Pascal, имеющий определенную структуру, предназначенный для использования как в главной программе, так и в других подключаемых модулях. Использование заключается в подключении модуля в разделе uses, путем указания его имени. 2. Общая структура подключаемого модуля
1) Интерфейсный раздел – interface (должен быть объявлен, может быть пустым) 2) Раздел реализаций – implementation (должен быть объявлен, может быть пустым) 3) Тело модуля – begin-end. (может отсутствовать) 2.1. Интерфейсный раздел. Интерфейсный раздел – область подключаемого модуля, начинающаяся с ключевого слова interface и заканчивающаяся ключевым словом implementation, которая может содержать: - список подключаемых модулей; - константы; - пользовательские типы данных; - переменные; - прототипы процедур и функций, доступные из места подключения данного модуля. Замечание 1: переменные, объявленные в разделе интерфейсов, являются глобальными. То есть существуют в любом месте программы, где подключен данный модуль, в том числе в разделе реализации самого модуля. Замечание 2: как и в программе, вышеперечисленные секции (объявления констант, переменных и др., за исключением секции uses) в данном разделе могут быть расположены в любой последовательности и в любом количестве. Замечание 3: если в данном разделе объявляются прототипы процедур/функций, то их реализации должны гарантированно присутствовать в разделе implementation. Основное назначение: определяет общедоступные данные/функционал для применения из программы или модуля, использующих данный модуль. Пример интерфейсного раздела:
Раздел реализаций – область подключаемого модуля, начинающаяся с ключевого слова implementation и заканчивающаяся телом модуля (если таковое имеется) или ключевым словом end с точкой, означающим конец модуля, в которой располагаются реализации процедур и функций, объявленных в интерфейсном разделе, которая может содержать: - список подключаемых модулей; - константы; - пользовательские типы данных; - переменные; - процедуры и функции, необходимые для реализации процедур/функций, объявленных в интерфейсном разделе. Основное назначение: реализация процедур и функций, описанных в секции interface. Замечание 1: при реализации процедур и функций, описанных в интерфейсной секции, их заголовки могут быть описаны в сокращенной форме. Исключение - PascalABC: при использовании переменных заголовка в тексте реализации возникает ошибка компиляции. Пример 1 (заголовки в сокращенной форме):
Тело модуля – последняя область подключаемого модуля, образуемая парой ключевых слов: «begin» и «end.», в которой можно размещать программный код аналогично главной программе. Тело модуля может отсутствовать. В таком случае ключевое слово «begin» не пишется, а «end.» сигнализирует о конце модуля. Основное назначение: инициализация переменных модуля, выделение ресурсов, необходимых для его работы и т.д. Пример модуля, содержащего тело:
Замечание 1: Программный код, размещенный в теле модуля, выполняется один раз – при загрузке модуля, до начала исполнения кода главной программы. Замечание 2: В случае, когда в секции uses подключено несколько модулей, имеющих разделы инициализации, выполнение кода этих разделов идет в порядке подключения модулей. 2.4. Дополнительные разделы в структуре модуля. Компиляторы Free Pascal, Pascal ABC, Pascal ABC.Net допускают помимо перечисленных выше еще два раздела: - раздел инициализации - раздел финализации. 2.4.1. Раздел инициализации. Раздел инициализации – область подключаемого модуля, размещаемая после по окончании раздела реализаций, начинающаяся с ключевого слова initialization и заканчивающаяся разделом финализации, если таковой имеется, или ключевым словом end с точкой. Назначение аналогично телу модуля. 2.4.2. Раздел финализации. Раздел финализации – область подключаемого модуля, размещаемая по окончании раздела инициализации, если таковой имеется, или по окончании раздела реализаций, и заканчивающаяся ключевым словом end с точкой. Основное назначение: освобождение ресурсов, выделенных для работы модуля. Пример:
Замечание 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 ускорение компиляции достигается только за счет того, что отсутствует необходимость проводить синтаксический и семантический анализ. Вывод: откомпилированные версии исполняемых модулей не совместимы между различными компиляторами.
28
|
|
15.11.2012, 20:57 | |
Модули. Модули Модули |
|
Супер-модератор
![]() ![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18.04.2015, 12:10 | 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Существует еще несколько особенностей работы с модулями.
1. Описание в нескольких модулях одинакового идентификатора 2. Циклическая зависимость модулей (circular unit reference) Первая из них заключается в том, что при описании в нескольких модулях одинакового идентификатора (будь то имя типа, переменной, константы, или подпрограммы) и при подключении этих модулей друг к другу или к основной программе, при обращении к тем самым дублирующимся идентификаторам будет подразумеваться тот, который описан в последнем из подключенных модулей. Например, имеем: Первый модуль:
Для того, чтобы использовать идентификатор из модуля, подключенного НЕ последним, нужно указать, в каком именно модуле он описан:
Решение - точно такое же, как и в предыдущем случае. Либо поменять местами названия модулей в списке uses, либо использовать полное имя типа:
Еще одна особенность - подключение первого модуля ко второму, а второго - к первому. Так называемая циклическая зависимость (circular unit reference). Вот пример (он, правда, синтетический, но основная идея понятна. При работе с теми же VCL/LCL тоже довольно часто встречается подобная ошибка, когда нужно связать две формы между собой) :
Это связано с тем, что для возможности использования модуля компилятор должен откомпилировать его хотя бы частично, только Interface-часть, чтобы знать, какие сущности, объявленные в этом модуле, могут быть использованы извне, и если хотя бы один из модулей частично откомпилирован (в приведенном выше примере это будет u1, в его интерфейсной части теперь нет никаких недомолвок и еще неизвестных модулей), то другой также прекрасно соберется.
2
|
18.04.2015, 12:10 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Модули Модули. КР Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |