Наука — Школе |
Нередко (а в школьном курсе практически всегда) программист работает с единственным модулем. Последовательность действий для такого случая и главный практический рецепт (нажимать Ctrl при клике по коммандеру) уже были описаны (см. о простейшем цикле разработки программы). Информация, данная ниже, нужна лишь в более сложных ситуациях, когда работа идет с несколькими модулями одновременно.
Когда происходит загрузка модуля в оперативную память
Что происходит при загрузке модуля
Как выгрузить старую и загрузить новую версию
разрабатываемого модуля
Как проверить, какие модули загружены, и как выгрузить
группу модулей
Откомпилированные модули в Обероне/Компонентном Паскале загружаются в память в следующих случаях (если модуль еще не загружен):
Явная загрузка — при первом обращении к процедуре, содержащейся в модуле, с помощью коммандера, из диалога или из меню. Именно это имеет место в простейших случаях типичных школьных программ. (Напомним, что вызываемая процедура должна быть экспортирована, т.е. в ее заголовке сразу после идентификатора должна стоять звездочка. См. .)
Неявная загрузка — осуществляется автоматически, если некоторый модуль импортируется из загружаемого, и если при этом этот некоторый модуль еще не загружен в память. Например, в примере импортируется модуль StdLog. Если StdLog еще не загружен, то перед тем как загрузить модуль Привет, будет загружен модуль StdLog. А если StdLog импортирует какие-то другие модули, то они будут загружены в память еще до StdLog. И так далее.
Загруженный модуль остается в памяти до тех пор, пока он не будет явно выгружен по команде программиста (см. ниже).
При загрузке модуля (назовем его Данный) прежде всего происходит проверка и неявная загрузка нужных модулей, как описано выше в п.2.
После загрузки модуля Данный происходит невидимое для программиста редактирование его "внешних связей" (линкование — linking), т.е. запись в соответствующие ячейки памяти адресов импортированных модулей (уже находящихся в памяти), а также соответствующих дескрипторов типов и т.п. Это позволяет в дальнейшем осуществлять вызов процедур из этих модулей без дополнительных накладных расходов по сравнению с технологией статического линкования.
Наконец, в качестве последнего шага происходит выполнение тела модуля (необязательный фрагмент текста, подобный выполняемому телу процедур; см. примеры; в простых случаях этот фрагмент отсутствует). Там обычно происходит инициализация глобальных переменных модуля, сохраняющих свои значения между вызовами процедур модуля пока модуль находится в памяти.
В Компонентном Паскале предусмотрена также возможность включать в модуль аналогичный фрагмент, выполняемый перед выгрузкой модуля из памяти (см. документацию).
Прежде всего следует помнить, что нельзя выгрузить модуль, если его импортируют другие модули, находящиеся в памяти (т.е. если у него есть клиенты; см. также ниже).
Если открыт документ с исходным текстом данного модуля и этот документ находится в фокусе (является активным; другими словами, нажатие буквенных клавиш вызвало бы печать в текст данного модуля), то этот модуль можно выгрузить из памяти командой меню Прог --> Выгрузить.
Еще одна удобная возможность — команда меню Прог --> Компилировать и выгрузить (Ctrl+Shift+K), которая компилирует новую версию модуля и выгружает из памяти старую.
Наконец, в любом окне, где в тексте есть имя модуля, который требуется выгрузить (часто это рабочий журнал, где имя модуля появляется в сообщениях Блэкбокса, например, после компиляции), можно дважды кликнуть по имени и выполнить программу меню Прог --> Выгрузить модули из списка.
Команда меню Инфо --> Загруженные модули заставляет Блэкбокс сгенерировать и открыть в новом окошке документ, содержащий список всех модулей, находящихся в данный момент в памяти. Начало списка выглядит примерно так (состав списка и порядок модулей в нем может меняться):
Первые две колонки — имена загруженных модулей и их размеры в байтах (включая память, занятую под их глобальные переменные). Важная третья колонка указывает, сколько модулей импортирует данный (другими словами, сколько у данного модуля модулей-"клиентов", использующих содержащиеся в нем средства — процедуры и т.п.). Дальше указаны дата и время последней компиляции и загрузки для каждого модуля. Гиперссылка Обновить вверху справа позволяет обновлять информацию в этом окошке одним кликом, не закрывая его.
Обычно в окошке 'Загруженные модули' модули, связанные между собой отношениями импорта, группируются. Пример такой группы — первые три модуля в списке (Info21sys...). Такие модули легко выгрузить одновременно следующим образом:
Блэкбокс будет их выгружать в том порядке, в каком они встречаются в тексте. Поскольку в списке они упорядочены так, что модули-клиенты стоят всегда выше тех модулей, которые они импортируют, то выгрузка модулей будет происходить в правильном порядке.
Вместо выделения нужных модулей в окошке 'Загруженные модули' можно также создать отдельный документ, в котором записать (в правильном порядке) имена модулей, с которыми ведется работа. Выделяя весь документ (Ctrl+A), а затем выполняя Прог --> Выгрузить модули из списка, можно заставить Блэкбокс выгрузить только требуемые модули.
Наука — Школе |