ГОСТ 22558-89 сторінка 110 з 116
Особенно затруднительна семантика в ГОСТ 22558, когда в дополнение к вставкам начальная первая запись удаляется между оператором OPEN (ОТКРЫТЬ) и оператором READ NEXT (ЧИТАТЬ СЛЕДУЮЩУЮ).
Указатель позиции файла (2 ИПД). Если дополнительный ключ является ключом ссылки и дополнительный ключ изменяется оператором REWRITE 778
(ОБНОВИТЬ) в значение между текущим значением и следующим значением в ■файле, следующий оператор READ NEXT (ЧИТАТЬ СЛЕДУЮЩУЮ) получит ту же запись.
Обоснование
В ГОСТ 22558 следующий оператор READ (ЧИТАТЬ) получил бы запись со следующим значением для того дополнительного ключа до оператора REWRITE (ОБНОВИТЬ).
Логически согласовано, что последующий оператор READ (ЧИТАТЬ) получает «ту же» запись, поскольку эта запись в тот момент является первой имеющейся записью в файле, значение ключа которой больше значения ключа записи, ставшей доступной посредством последнего оператора READ (ЧИТАТЬ). В сущности это не «та же» запись, которая была доступна последнему оператору READ (ЧИТАТЬ), поскольку значение дополнительного ключа и возможно другие значения уже изменены.
Семантика стандарта Кобола для этой ситуации была предметом требований для разъяснения и приведена в документах интерпретации X3J4.
(39) Зарезервированные слова (1 Я ДР). Добавлены следующие
зарезервированные слова:
ALPHABET
АЛФАВИТ
ALPHABETIC-LOWER
СТРОЧНЫЕ
ALPHABETIC-UPPER
ПРОПИСНЫЕ
ALPHANUMERIC
ВЦ
ALPHANUMERIC EDITED
БЦР
ANY
ЛЮБОЕ
BINARY
ДВОИЧНОЕ
CLASS
КЛАСС
COMMON
ОБЩАЯ
CONTENT
CONTINUE
ПРОДОЛЖИТЬ
CONVERTING
ПРЕВРАЩАЯ
DAY-OF-WEEK
ДЕНЬ-НЕДЕЛИ
END-ADD
КОНЕЦ-СЛОЖИТЬ
END-CALL
КОНЕЦ-ВЫЗВАТЬ
END-COMPUTE
КОНЕЦ-ВЫЧИСЛИТЬ
END-DELETE
КОНЕЦ-УДАЛИТЬ
END-DIVIDE
КОНЕЦ-,РАЗДЕЛИТЬ
END-EVALUATE
КОНЕЦ-ОЦЕНИТЬ
END-IF
КОНЕЦ-ЕСЛИ
END-MULTIPLY
КОНЕЦ-УМНОЖИТЬ
END-PERFORM
КОНЕЦ-ВЫПОЛНИТЬ
END-READ
КОНЕЦ-ЧИТАТЬ
END-RECEIVE
КОНЕЦ-ПОЛ УЧИТЬ
END-RETURN
КОНЕЦ-ВЕРНУТЬ
END-REWRITE
КОНЕЦ-ОБНОВИТЬ
END-SEARCH
КОНЕЦ-ИСКАТЬ
END-START
КОНЕЦ-ПОДВЕСТИ
END-STRING
КОНЕЦ-СОБРАТЬ
END-SUBTRACT
КОНЕЦ-ОТНЯТЬ
END-UNSTRING
КОНЕЦ-РАЗОБРАТЬ
END-WRITE
КОНЕЦ-ПИСАТЬ
EVALUATE
ОЦЕНИТЬ
EXTERNAL
ВНЕШНЕЕ
FALSE
ЛОЖЬ
GLOBAL
ГЛОБАЛЬНОЕ, ГЛОБАЛЬНО
INITIALIZE
ИНИЦИИРОВАТЬ
NUMERIC-EDITED
ЧР
ORDER
O ОЧИСТИТЬ ССЫЛКУ ЗАМЕНИТЬ СТАНДАРТ-М ПРОВЕРКОЙ ЗАТЕМ ИСТИНА
ДЕСЯТИЧНОЕ
THER
PACKED-DECIMAL
PADDING
PURGE REFERENCE REPLACE STANDARD-2
TEST THEN TRUE
Обоснование
В каждом случае предполагается, что польза, получаемая от дополнительных возможностей, обеспечиваемых добавлением каждого зарезервированного слова, перевешивает неудобства, возникающие из переноса этого слова из сферы слов, определенных пользователем. Предполагается, что применение нового оператора REPLACE (ЗАМЕНИТЬ) смягчит неудобства для имеющихся программ, которые могут использовать любое из новых зарезервированных слов как слово пользователя.
Коснемся некоторых вопросов относительно необходимости того или иного зарезервированного слова. Зарезервированные слова облегчают создание эффективных компиляторов, облегчая синтаксический анализ исходной программы. Синтаксическое распознавание Кобола было бы затруднительным без зарезервированных слов. Рассмотрим следующий фрагмент программы:
ADD А ТО В С CONTINUE
СЛОЖИТЬ А С Б Е ПРОДОЛЖИТЬ
Предполагая, что нет зарезервированных слов, невозможно определить, является ли CONTINUE (ПРОДОЛЖИТЬ) принимающим полем для ADD (СЛОЖИТЬ) или оператором CONTINUE (ПРОДОЛЖИТЬ). Также невозможно определить, является ли ТО (С) принимающим полем, и оператор синтаксически неверен.
Если бы в синтаксисе Кобола были ограничители операторов, которые необходимы, приведенный выше пример можно было бы переписать так:
ADD А ТО В С; CONTINUE
СЛОЖИТЬ А С Б Е; ПРОДОЛЖИТЬ
где ясно, что CONTINUE (ПРОДОЛЖИТЬ) не является частью оператора ADD (СЛОЖИТЬ). Тем не менее в синтаксисе Кобола нет ограничителей оператора; требование ограничителей добавило бы значительно большую несовместимость.
Другим возможным решением было бы, чтобы компилятор проверял до синтаксического разбора оператора каждое зарезервированное слово, не использовано ли оно как определенное пользователем. Однако это привело бы к большим потерям в терминах сложности компилятора и скорости компилирования.
Добавление нескольких зарезервированных слов для новых возможностей является значительно менее серьезной несовместимостью, чем несовместимость, вызываемая устранением всех зарезервированных слов из Кобола.
Итак, зарезервированные слова продолжают использоваться в новейших языках. Например, Паскаль и Ада, оба развивающиеся и возникшие после Кобола, также используют зарезервированные слова.
(40) Состояние ввода-вывода (1 ПОД, 1 ОТД, 1 ИПД). Добавлены новые значения состояния ввода-вывода.
Обоснование
В стандарте Кобола определены только несколько кодовых условий состояния ввода-вывода. В результате пользователь не мог установить среди многих различных ошибочных условий те, которые он хотел бы обрабатывать разными способами и/или каждая реализация определяла свое множество кодов состояния, которое покрывало разные ситуации разными способами. Кроме того, ГОСТ 22558 оставлял результаты многих ситуаций ввода-вывода неопределенными; это значит, что ГОСТ 22558 устанавливал, что определенные критерии должны выполняться, но не устанавливал, что произойдет, если они не выполнены; таким образом, выполнение программы становилось неопределенным.
Настоящий стандарт Кобола определяет коды состояния для таких неопределенных ситуаций ввода-вывода. Таким образом, пользователь может проверить по этим условиям ошибки стандартным путем и предпринять корректирующее действие для определенных условий ошибки, где это возможно.
В общем, добавления могут повлиять на программы в следующих случаях: а) если они проверяют специальные значения состояний, определенные реализацией, для выявления условий, определяемых в настоящее время;
если они относятся к состоянию успешного завершения для любого из условий, определяемых в настоящее время. (В случаях новых значений состояния ввода-вывода 04, 05 и 07 это влияет только на программы, которые просматривают обе позиции литеры состояния ввода-вывода для проверки на успешное выполнение;
если они относятся к некоторым действиям, зависящим от реализации, таким как ненормальное завершение программы, когда возникает некоторое из заново определенных условий.
Это изменение может иметь существенное влияние на те программы, которые проверяют специфические значения состояния ввода-вывода.
Нужно отметить, что предыдущий стандарт Кобола не обеспечивал всех кодов состояния.
Отдельные часто употребляемые значения состояния ввода-вывода описаны в следующих пунктах.
Состояние ввода-вывода-04. Оператор READ (ЧИТАТЬ) выполнен успешно, но длина обрабатываемой записи не соответствует фиксированным свойствам этого файла.
Обоснование
ГОСТ 22558 не определял последствия, если оператору READ (ЧИТАТЬ) доступна запись, содержащая соответственно больше или меньше литер, чем максимум или минимум для этого файла. Поэтому результат чтения такой записи не определен. Новое значение 04 состояния ввода-вывода сообщает пользователю о такой ситуации.
Поскольку настоящий стандарт предупреждает попытку занесения или обновления записи слишком большой или слишком малой, эта ситуация не может встретиться для записей, заносимых программой при реализации настоящего стандарта.
Состояние ввода-вывода = 05. Оператор OPEN (ОТКРЫТЬ) выполнен успешно, но необязательного файла, на который ссылаются, нет в наличии во время выполнения оператора OPEN (ОТКРЫТЬ).
Обоснование
Соответственно ГОСТ 22558 об отсутствии необязательного файла программе не сообщается до первого выполнения оператора READ (ЧИТАТЬ) для этого файла. Новое значение состояния ввода-вывода 05 дает определенную и доступную информацию при ссылке на файл в операторе OPEN (ОТКРЫТЬ), позволяя программе предпринимать более конкретные действия соответственно этому условию.
Это может повлиять только на программы, которые используют второй уровень фразы OPTIONAL (НЕОБЯЗАТЕЛЬНОГО) в модуле последовательного ввода-вывода и которые просматривают обе позиции литеры данного состояния ввода-вывода для проверки на успешное завершение оператора OPEN INPUT (©ТКРЫТЬ ВХОДНОЙ).
Состояние ввода-вывода = 07. Оператор ввода-вывода выполнен успешно. Тем не менее файл, на который ссылается оператор CLOSE (ЗАКРЫТЬ) с вариантом WITH NO REWIND (БЕЗ ПЕРЕМОТКИ), REEL/UNIT (КАТУШ-
'КУ/ТОМ) или FOR REMOVAL (С УДАЛЕНИЕМ), или оператор OPEN (ОТКРЫТЬ) с вариантом NO REWING (БЕЗ ПЕРЕМОТКИ), находится на носителе данных, к которому неприменимо понятие катушка (том).
Обоснование
' Соответственно ГОСТ 22558 оператор OPEN (ОТКРЫТЬ) с вариантом NO REWIND (БЕЗ ПЕРЕМОТКИ) может быть использован только для последовательных файлов на одной катушке (томе), и оператор CLOSE (ЗАКРЫТЬ) с вариантом NO REWIND (БЕЗ ПЕРЕМОТКИ), REEL/UNIT (КАТУШКУ/TOM) или FOR REMOVAL (С УДАЛЕНИЕМ) неприемлем для файлов, находящихся на носителе, к которому неприменимы понятия катушки и тома. Поэтому для файлов массовой памяти эти образцы операторов OPEN (ОТКРЫТЬ) и CLOSE (ЗАКРЫТЬ) могут рассматриваться в сущности как успешные, если пересмотрены аномалии фраз NO REWIND (БЕЗ ПЕРЕМОТКИ), REEL/UNIT (КАТУШКУ/ /ТОМ) или FOR REMOVAL (С УДАЛЕНИЕМ). Новое значение 07 состояния ввода-вывода делает возможным успешное завершение, сохраняя в то же время информацию для пользователя, и предоставляя возможность предпринять определенные действия.
Состояние ввода-вывода = 14. Попытка выполнения последовательного оператора READ (ЧИТАТЬ) для относительного файла и число значащих цифр в относительном номере записи больше данного относительный ключ, описанного для этого файла.
Обоснование
ГОСТ 22558 устанавливает, что успешное выполнение оператора READ (ЧИТАТЬ) формата 1 для относительного файла обновляет содержимое данного относительный ключ (если он указан) и оно становится равным относительному номеру записи, доступной в этот момент. ГОСТ 22558 не определяет результат, если номер, определенный значащими цифрами относительного номера записи, больше данного относительный ключ. Новое значение 14 состояния ввода-вывода определяет этот результат.
Состояние ввода-вывода = 24. Производится попытка писать за пределами внешне определенных границ относительного или индексного файла, или сделана попытка последовательного оператора WRITE (ПИСАТЬ) и число значащих цифр в относительном номере записи больше размера данного относительный ключ, описанного для этого файла.
Обоснование
В ГОСТ 22558 значение состояния ввода-вывода 24 означало только попытку писать за пределами внешне определенных границ относительного или индексного файла. В настоящем стандарте Кобола значение 24 состояния ввода-вывода также включает последовательный оператор WRITE (ПИСАТЬ) для относительного файла, когда число значащих цифр в относительном номере записи больше размера данного относительный ключ, описанного для этого файла.
ГОСТ 22558 устанавливает, что при успешном выполнении оператора WRITE (ПИСАТЬ) для относительного файла относительный номер переданной записи будет помещен в данное относительный ключ (если он указан). Результат не определен, если номер, определяемый значащими цифрами относительного номера записи, больше данного относительный ключ.
Это изменение может повлиять только на те программы, которые последовательно записывают больше записей, чем максимальное значение, допускаемое шаблоном данного относительный ключ.
Состояние ввода-вывода = 35. Попытка выполнения оператора OPEN (ОТКРЫТЬ) с вариантом INPUT (ВХОДНОЙ) для файла, не определенного как необязательный, которого нет в наличии.
Обоснование
ГОСТ 22558 требует обязательного указания фразы OPTIONAL (НЕОБЯЗАТЕЛЬНОГО) для входных файлов, которые могут отсутствовать в определен
ные моменты выполнения объектной программы. При этом не определено, что может случиться, когда файл, не объявленный необязательным, отсутствует. Новое значение 35 состояния ввода-вывода позволяет пользователю проверять это условие.
Состояние ввода-вывода = 37. Попытка выполнения оператора OPEN (ОТКРЫТЬ) для файла, который должен быть файлом массовой памяти, но не является таковым.
Обоснование
Это новое значение состояния ввода-вывода сообщает, что: (1) предпринята . попытка выполнения оператора OPEN 1-0 (ОТКРЫТЬ ВХОДНОИ-ВЫХОДНОЙ) для файла не массовой памяти, или (2) предпринята попытка выполнения оператора OPEN (ОТКРЫТЬ) для файла пе-массовой памяти, объявленного в программе как относительный или индексный файл.
ГОСТ 22558 не определяет, что происходит при таких обстоятельствах. Новое значение 37 состояния ввода-вывода позволяет пользователю проверять это условие ошибки.
Некоторые реализации обеспечивают расширение использования операторов OPEN 1-0 (ОТКРЫТЬ ВХОДНОИ-ВЫХОДНОЙ) для доступа к терминалам. Такое расширение может быть устранено новым значением 37 состояния ввода- вывода.
Состояние ввода-вывода = 38. Попытка выполнения оператора OPEN (ОТКРЫТЬ) для файла, предварительно закрытого с замком.
Обоснование
ГОСТ 22558 указывает, что реализация должна обеспечить, чтобы файл, закрытый с замком, не мог быть открыт опять во время текущего выполнения единицы исполнения, но не определяет, что случится, если сделана попытка вновь открыть этот файл. Новое значение 38 состояния ввода-вывода позволяет пользователю проверять это условие.
Состояние ввода-вывода = 39. Оператор OPEN (ОТКРЫТЬ) неуспешен из-за конфликтных свойств файла (несоответствие между фиксированными свойствами файла и свойствами файла, указанными в программе).
Побачили розбіжність з офіційним текстом?