82
12.6. Модули и их версии
procedure read_back(tape_no: shortcard; var buff; var size: natural);
{- чтение блока в обратном направлении }
Такое изменение модуля не оставит без изменения его описательную часть. Но,
если описание изменится добавлением этой новой процедуры, необходимо
перекомпилировать все программы, которые используют его (если только не сохранят
специально для них старый вариант и если он сможет работать с новыми
лентопротяжными устройствами).
В UniPascal-е возможно добавление новых возможностей (декларации объектов)
к описательной части модуля (как в примере) без перекомпилирования программ,
которые использовали этого модуля еще до изменения. Это делается указанием
порядкого номера версии модуля, заключенного в скобках после его идентификатора
в описательной части (реализационная часть может перекомпилироваться). Например:
interface unit Tape (2);
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 }
 === добавлено к второй версии ===}
procedure read_back(tape_no: shortcard; var buff; var size: natural);
{- чтение блока в обратном направлении }
end { Tape };
Все версии данного модуля совместимы в строго восходящем порядке, т.е.
версия 2 совместима с версией 3, версия 3 - с 4 и т.д., но версия 7 несовместима с 6 или
с версией того же самого порядкого номера 7, но перекомпилированной. Порядковые
номера версии модуля не обязательно быть последовательными, т.е. после версии 1
может следовать версия 10, потом 50 и т.д. Компилятор не проверяет действительно
ли новая версия совместима с старой. Если в верхнем примере процедура READ_BACK
будет описана первой, модуль станет несовместимым со своей старой версией.
Если новая версия модуля компилирована как совместимая со старой, но в
действительности несовместима, то программы и модули, компилированные с старой
версией будут вести себя непредсказуемо.
Две версии одного модуля являются действительно совместимыми, если все
новые объекты (константы, типы, переменные, процедуры или функции) добавлены
(физически в исходном тексте) в конце описательной части модуля. Если хотя бы один
из объектов поставлен перед последним из дефинированных в старом версии объектов,
то новая версия является действительно несовместимой с старой. Снова повтаряем, что
компилятор не проверяет на действительную совместимость новой версии модуля с
старой и, если новая несовместимая версия будет использована программами,
компилированными с старой, их поведение будет непредсказуемым.
Еще о совместимости. Если новая версия модуля действительно совместима с
старой и компилирована с другим, большим порядковым номером версии,
использующие старую версию программы будут работать правильно и с новой версией.
Программа, использующая модуль, связывается с ним в процессе ее выполнения (при
ее стартировании). При том в программе записаны имя и версия модуля, дата и время
(час), в котором этот модуль был компилирован. Связывание программы с
<<  <  GO  >  >>

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