Главная страница проекта ИНФОРМАТИКА-21

Наука Школе

 Загрузка и перезагрузка модулей

Минимальные сведения

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


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

Когда происходит загрузка модуля в оперативную память

Откомпилированные модули в Обероне/Компонентном Паскале загружаются в память в следующих случаях (если модуль еще не загружен):

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

  2. Неявная загрузка — осуществляется автоматически, если некоторый модуль импортируется из загружаемого, и если при этом этот некоторый модуль еще не загружен в память. Например, в примере импортируется модуль StdLog. Если StdLog еще не загружен, то перед тем как загрузить модуль Привет, будет загружен модуль StdLog. А если StdLog импортирует какие-то другие модули, то они будут загружены в память еще до StdLog. И так далее.

Загруженный модуль остается в памяти до тех пор, пока он не будет явно выгружен по команде программиста (см. ниже).

Что происходит при загрузке модуля

При загрузке модуля (назовем его Данный) прежде всего происходит проверка и неявная загрузка нужных модулей, как описано выше в п.2.

После загрузки модуля Данный происходит невидимое для программиста редактирование его "внешних связей" (линкование — linking), т.е. запись в соответствующие ячейки памяти адресов импортированных модулей (уже находящихся в памяти), а также соответствующих дескрипторов типов и т.п. Это позволяет в дальнейшем осуществлять вызов процедур из этих модулей без дополнительных накладных расходов по сравнению с технологией статического линкования.

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

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

Как выгрузить старую и загрузить новую версию разрабатываемого модуля

Прежде всего следует помнить, что нельзя выгрузить модуль, если его импортируют другие модули, находящиеся в памяти (т.е. если у него есть клиенты; см. также ниже).

  1. Уже описан способ, когда при вызове новой версии модуля кликом по коммандеру из памяти выгружается старая версия модуля перед загрузкой новой — для этого достаточно при клике нажимать на клавишу Ctrl.
  2. Если открыт документ с исходным текстом данного модуля и этот документ находится в фокусе (является активным; другими словами, нажатие буквенных клавиш вызвало бы печать в текст данного модуля), то этот модуль можно выгрузить из памяти командой меню Прог --> Выгрузить.

  3. Еще одна удобная возможность — команда меню Прог --> Компилировать и выгрузить (Ctrl+Shift+K), которая компилирует новую версию модуля и выгружает из памяти старую.

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

Как проверить, какие модули загружены

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

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

Обычно в окошке 'Загруженные модули' модули, связанные между собой отношениями импорта, группируются. Пример такой группы — первые три модуля в списке (Info21sys...). Такие модули легко выгрузить одновременно следующим образом:

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

Вместо выделения нужных модулей в окошке 'Загруженные модули' можно также создать отдельный документ, в котором записать (в правильном порядке) имена модулей, с которыми ведется работа. Выделяя весь документ (Ctrl+A), а затем выполняя Прог --> Выгрузить модули из списка, можно заставить Блэкбокс выгрузить только требуемые модули.

Главная страница проекта ИНФОРМАТИКА-21

Наука Школе