12. UniPascal в деталях
81
SendChar(ch);
until OK;
exit:
SendBuff;
end { some_proc };
В конкретном случае возможно включение ассемблерской подпрограммы в
оверлейной процедуре. В общем случае это возможно, только если после окончания
работы подпрограммы на UniPascal-е ассемблерские подпрограммы не нуждаются в
никакой промежуточной информации, которую нужно было сохранять до их
следующей активизации. При следующей своей активизации ассемблерские
подпрограммы будут загружены (вместе с UniPascal-ской) с диска и, следовательно,
они будут в начальном состоянии (как будто они вообще не были активизированными).
12.6. Модули и их версии
При использвании модулей их реализационная часть скрыта (или по крайней мере
должна быть) для пользовательских модулей или программы. Если это так (программы
или модули, использующие данный модуль, не предполагают конкретную реализацию
и зависят только от описательной части), реализацию можно заменить полностью
(например алгоритмическим изменениям). Эти изменения ведут к перекомпиляции
реализационной части модуля, но программы и модули, использующие этот модуль,
не должны быть перекомпилированы. Пользователи не должны знать об изменениях
того рода. Если, однако, наступят изменения в описательной части модуля, его
пользователи должны узнать об этом, чтобы сделать необходимые изменения своих
программ. Например, если у некоторой процедуры появился новый параметр или ее
уничтожили, использующий ее модуль не смог бы продолжить работать без изменения.
Иногда новое описание модуля почти совпадает с старым и различия состоят
только в добавлении новых возможностей (константы, типы, переменные, процедуры
или функции). В таком случае модули, которые использовали его в его старом виде,
могут продолжить использовать его в его новом виде (новой версии), так как описание
старой части не изменилось и, следовательно, она совместима с старой. Например,
пусть модуль для работы с магнитной лентой описан следующим образом:
interface unit Tape;
procedure rewind(tape_no: shortcard);
{- перемотка ленты }
procedure write_TM(tape_no: shortcard);
{- запись лентового маркера }
procedure write_buff(tape_no: shortcard; const buff; size: natiral);
{ запись буфера (buff) длиной size }
procedure read_buff(tape_no: shortcard; var buff; var size: natural);
{- чтение блока с ленты в buff, длина получается в size }
end { Tape };
После того как модуль вошел в употреблении и его уже используют несколько
программ, исходный код (текст) которых не известен составителю модуля Tape,
пришлось дополнить и/или изменить модуль возможностью управлять
лентопротяжным устройством другого вида. Пока изменение не выйдет за пределами
реализационной части, другие программы без изменения будут работать с новой
конфигурацией. Но, пусть например, будет дабавлена процедура для чтения блока в
обратном направлении:
<<  <  GO  >  >>

Вернуться к началу сайта