Наука — Школе |
Суть данного раздела сводится к объяснению простого практического правила:
Для выполнения процедур из новой версии модуля нужно кликать по коммандеру при нажатой клавише Ctrl. |
Подробнее: Предположим, что мы выполнили процедуру из нашего модуля, а потом модифицировали его, успешно скомпилировали и пытаемся снова выполнить ту же (или новую) процедуру из него посредством простого клика по коммандеру. В этой ситуации Блэкбокс будет вызывать (или пытаться вызвать) процедуру из старой версии модуля, а не из новой. Чтобы произошло обращение к новой версии модуля, нужно делать клик с нажатой клавишей Ctrl.
Вспоминать об этом правиле обычно приходится в следующих ситуациях:
(Еще одна причина, порождающая ситуацию 2 — имя процедуры после коммандера задано с ошибкой.)
Если вышеприведенное правило твердо усвоено, и если программист работает (т.е. вносит изменения и т.п.) с единственным модулем, то объяснения, данные ниже, читать не обязательно: достаточно просмотреть только последний раздел.
Для дальнейшего будем предполагать, что мы создали, выполнили и сохранили модуль Привет как это описано ранее.
Запустив Блэкбокс, откроем модуль Привет (Ctrl+O или Файлы --> Открыть ...). Поскольку скомпилированный модуль хранится на диске в определенном месте (о котором знает Блэкбокс), можно немедленно выполнить процедуру Привет.Сделать, нажав на коммандер. Получится примерно следующее:
Теперь исправим текст модуля так, чтобы после печати слова "Привет!" происходил перевод строки (вспомним, что при повторных вызовах процедуры кликами по коммандеру, "Привет!" печатался подряд на одной строке — см. картинку).
Для этого поставим курсор после закрывающей скобки и напечатаем следующую последовательность литер:
; StdLog.Ln
Это означает, что после вызова процедуры StdLog.String с фактическим параметром "Привет!" должна быть вызвана процедура StdLog.Ln (т.е. процедура Ln, находящаяся в модуле StdLog), не имеющая параметров. Эта процедура выполняет перевод строки в конце рабочего журнала, так что любая дальнейшая печать туда будет идти в новую строку.
После этого модуль выглядит как в окошке справа:
Сразу скомпилируем его (Ctrl+K). Рабочий журнал будет выглядеть примерно как в окошке слева.
Если теперь просто кликать по коммандеру, то будет вызываться старая версия нашего модуля — поскольку модуль остается в памяти, пока его не выгрузят, и именно версия в памяти вызывается в первую очередь. После пары кликов рабочий журнал будет выглядеть так:
Видно, что никакого перевода строки после восклицательного знака нет — вызывается старый вариант модуля (переход на новую строку после нуля произошел потому, что строчка оказалась слишком длинная; достаточно растянуть окошко в ширину, чтобы весь текст встал в одну строку).
Чтобы выгрузить старую версию модуля из памяти и вызвать новую, достаточно в момент клика по коммандеру нажимать на клавишу Ctrl. Сделаем это. Потом, отпустив Ctrl, кликнем по коммандеру еще раз. Рабочий журнал будет выглядеть примерно так:
Видим, что, во-первых, в последней строке журнала непосредственно после восклицательного знака (см. предыдущую картинку) произошла печать системного сообщения Блэкбокса 'Привет выгружен'. Сообщение означает, что та (старая) версия модуля Привет, которая находилась в памяти, была выгружена. Заметим, что после сообщения Блэкбокс делает перевод строки, так что
После этого Блэкбокс действовал как при простом клике по
коммандеру, т.е.
(1) попытался вызвать процедуру Сделать в Привет, для этого он
(2) проверил, есть ли в памяти модуль Привет;
(3) не обнаружив его, Блэкбокс стал искать его на диске;
(4) найдя его там, загрузил в память и после этого
(5) вызвал процедуру Сделать.
Естественно, что на диске хранилась уже новая версия скомпилированного модуля Привет (с переводом строки), и именно эта новая версия была загружена и выполнена — т.е. была напечатана цепочка литер "Привет!", а затем переведена строка (это видно из того, что следующая печать идет с новой строки).
При втором клике Блэкбокс действовал по тому же алгоритму: сначала нашел в памяти модуль Привет (уже новый), а в нем — процедуру Сделать, и выполнил ее. Процедура напечатала "Привет!" уже с новой строки (перевод строки был выполнен в предыдущем вызове процедуры).
Чтобы убедиться в том, что после последнего восклицательного знака был сделан перевод строки, достаточно заставить Блэкбокс написать в рабочий журнал какое-нибудь сообщение, например, скомпилировав модуль еще раз (Ctrl+K). Сообщение о компиляции будет напечатано с новой строки. Это следует сравнить с предыдущей картинкой, где сообщение 'компилируется "Привет" 32 0' напечатано сразу после восклицательного знака, т.к. старая версия процедуры не делала перевод строки.
Все вышесказанное можно суммировать следующим образом:
В простейших случаях (например, в школьных курсах программирования) работают с единственным модулем небольшого объема (скажем, до 500 строк). В нем может быть несколько процедур, одна из которых (а может быть и несколько) будет экспортирована и поэтому доступна для непосредственного исполнения (например, с помощью коммандера).
О запуске простой программы уже говорилось.
Разработка простейшей программы внешне выглядит примерно так:
Подготовительная стадия:
Написать в документе первый вариант модуля. (Первый вариант может и должен быть "скелетом", не содержащим никаких выполняемых операторов или даже объявлений.) Скомпилировать его (Ctrl+K с латинским K, или через меню: Прог --> Компилировать).
Основной цикл разработки:
Сделать очередное (небольшое) уточнение текста модуля.
Эта схема соответствует разработке программы методом пошагового уточнения; см. заповеди грамотного программирования.
Наука — Школе |