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

Наука Школе

Продолжение работы с примером

Суть данного раздела сводится к объяснению простого практического правила:

Для выполнения процедур из новой версии модуля нужно кликать по коммандеру при нажатой клавише Ctrl.

Подробнее: Предположим, что мы выполнили процедуру из нашего модуля, а потом модифицировали его, успешно скомпилировали и пытаемся снова выполнить ту же (или новую) процедуру из него посредством простого клика по коммандеру. В этой ситуации Блэкбокс будет вызывать (или пытаться вызвать) процедуру из старой версии модуля, а не из новой. Чтобы произошло обращение к новой версии модуля, нужно делать клик с нажатой клавишей Ctrl.

Вспоминать об этом правиле обычно приходится в следующих ситуациях:

  1. Вызываемая процедура ведет себя так, как будто никаких изменений сделано не было, хотя измененный модуль только что был успешно скомпилирован.
  2. Блэкбокс печатает в рабочем журнале сообщение типа:
        ошибка команды: команда Сделать2 не найдена в Привет.
    Это обычно означает, что программист добавил в модуль Привет процедуру Сделать2 ("команда" в терминологии Блэкбокса — это процедура без параметров) и попытался ее вызвать, забыв нажать 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 строк). В нем может быть несколько процедур, одна из которых (а может быть и несколько) будет экспортирована и поэтому доступна для непосредственного исполнения (например, с помощью коммандера).

О запуске простой программы уже говорилось.

Разработка простейшей программы внешне выглядит примерно так:

Подготовительная стадия:

  1. Открыть новый документ. Выбрать для него уникальное имя и сохранить его с этим именем.
  2. Написать в документе первый вариант модуля. (Первый вариант может и должен быть "скелетом", не содержащим никаких выполняемых операторов или даже объявлений.) Скомпилировать его (Ctrl+K с латинским K, или через меню: Прог --> Компилировать).

  3. Устранять опечатки и синтаксические огрехи и нажимать Ctrl+K, пока модуль не скомпилируется.
  4. В конце того же документа после точки, завершающей модуль, на новой строке вставить коммандер (Ctrl+Q или Инстр --> Вставить коммандер) и вслед за ним имя модуля, точка, имя процедуры, которую будем вызывать.
  5. Вызвать процедуру, кликнув мышкой по коммандеру.

Основной цикл разработки:

  1. Сделать очередное (небольшое) уточнение текста модуля.

  2. Компилировать (Ctrl+K) и устранять ошибки, пока новая версия не скомпилируется без ошибок.
  3. Если на данном шаге возможен частичный контроль правильности программы, то выполнить создаваемую процедуру. Для этого кликнуть мышкой по коммандеру, одновременно нажимая клавишу Ctrl, — нажатие на Ctrl заставит систему выгрузить из памяти старую версию модуля прежде чем вызвать новую.
  4. Сохранить документ (Ctrl+S).
  5. Повторять шаги i-iv до тех пор, пока задача не будет решена.

Эта схема соответствует разработке программы методом пошагового уточнения; см. заповеди грамотного программирования.

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

Наука Школе