01 Д Ш XX.
01 Е Ш Х(30).
РАЗДЕЛ ПРОЦЕДУР.
РАЗОБРАТЬ А ОГРАНИЧИВАЯСЬ СІ (ПТР) В ВВ, Е УКАЗАТЕЛЬ ПТР.
Согласно правилам ГОСТ 22558 ограничитель Cl (PTR) (С1 (ПТР)) будет опять рассматриваться перед перемещением второй строки в Е, в то время как по новым правилам в настоящем стандарте Кобола Cl (PTR) (С1 (ПТР)) рассматривается только один раз перед просмотром пересылаемых полей. Таким образом, ограничители никогда не меняются во время всего процесса разбора.
Хотя по ГОСТ 22558 любое индексирование, связанное с ограничителем, вычисляется непосредственно перед пересылкой данного в соответствующее данное, это приводит к ошибке, поскольку ограничитель должен быть определен до просмотра пересылаемого поля, и поэтому не может вычисляться непосредственно перед пересылкой. Таким образом, это изменение в установленных правилах позволяет вычисление ограничителей в соответствующее время так, как это делают некоторые имеющиеся реализации при обработке оператора UNSTRING (РАЗОБРАТЬ).
Для того чтобы эти изменения повлияли на программу, идентификатор в варианте INTO (В) оператора UNSTRING (РАЗОБРАТЬ) должен перекрывать индекс ограничителя. Такое программирование некорректно и это изменение отразится только на немногих программах, если таковые имеются.
Оператор WRITE (ПИСАТЬ) (2 ПОД).
В одном и том же операторе WRITE (ПИСАТЬ) не могут быть одновременно определены фразы ADVANCING PAGE (ДО/ПОСЛЕ ПРОДВИЖЕНИЯ СТРАНИЦЫ) и END-OF-PAGE (В КОНЦЕ СТРАНИЦЫ).
Обоснование
В ГОСТ 22558 допускается указание обеих фраз в одном и том же операторе WRITE (ПИСАТЬ). Тем не менее нет правил, определяющих порядок их обработки. Следовательно, обработка определяется реализацией.
Обе фразы ADVANCING PAGE (ДО/ПОСЛЕ ПРОДВИЖЕНИЯ СТРАНИЦЫ) и END-OF-PAGE (В КОНЦЕ СТРАНИЦЫ) позволяют управлять вертикальным позиционированием печатаемой страницы. Продвижение страницы средствами фразы ADVANCING PAGE (ДО/ПОСЛЕ ПРОДВИЖЕНИЯ СТРАНИЦЫ) осуществляется в соответствии с техникой, определяемой реализацией. В то же время продвижение страницы средствами фразы END-OF-PAGE (В КОНЦЕ СТРАНИЦЫ) является техникой, определяемой пользователем. Поэтому было решено разделить эти разные техники.
Хотя допускалось одновременное использование этих вариантов соответственно ГОСТ 22558, этим пользовались мало реализаций. Поэтому на имеющиеся программы это изменение повлияет в минимальной степени.
Указатель позиции файла (1 ПОД, 1 ОТД, 1 ИПД). Понятие указателя текущей записи в ГОСТ 22558 изменено на указатель позиции файла.
Обоснование
В настоящем стандарте Кобола правила, основанные на указателе позиции файла, усилены и облегчены для понимания. Кроме того, для сочетания обновления и операторов READ NEXT (ЧИТАТЬ СЛЕДУЮЩУЮ) указатель текущей записи в ГОСТ 22558 сложен и не всегда приводил к интуитивно ожидаемому результату. Правила указателя текущей записи также недостаточно определены в отдельных случаях, когда указываемая запись становится недоступной.
Это изменение в понятиях может повлиять на программы только в двух случаях, описанных в пунктах (37 и 38). Они могут встретиться только в очень необычной последовательности операций над файлами при динамическом доступе.
Указатель позиции файла (2 ОТН, 2 ИПД). Для относительного или индексного файла при динамическом доступе выполнение оператора OPEN 1-0 (ОТКРЫТЬ ВХОДНОЙ-ВЫХОДНОЙ), за которым следуют один или более операторов WRITE (ПИСАТЬ) с последующим оператором READ NEXT (ЧИТАТЬ СЛЕДУЮЩУЮ), приведет к тому, что оператору READ (ЧИТАТЬ) будет доступна первая запись в файле во время выполнения оператора READ (ЧИТАТЬ).
Обоснование
В ГОСТ 22558 эта последовательность приводит к тому, что оператору READ (ЧИТАТЬ) доступна первая запись во время выполнения оператора OPEN (ОТКРЫТЬ). Если один из операторов WRITE (ПИСАТЬ) вставляет запись с ключом или относительным номером записи ниже, чем любые записи, имеющиеся в файле, оператору READ (ЧИТАТЬ) была бы доступна запись, отличная от первой.
Считается более логичным, чтобы при выполнении первого оператора READ NEXT (ЧИТАТЬ СЛЕДУЮЩУЮ) после оператора OPEN (ОТКРЫТЬ) доступной записью была бы первая запись в файле во время выполнения оператора READ (ЧИТАТЬ).
Семантика в настоящем стандарте ставит на один уровень ситуацию, возникающую после оператора OPEN (ОТКРЫТЬ), и ситуацию, возникающую после оператора READ (ЧИТАТЬ). В последнем случае, если оператор WRITE (ПИСАТЬ) вставляет запись с ключом таким, что она следует непосредственно за последней прочитанной записью, следующий оператор READ NEXT (ЧИТАТЬ СЛЕДУЮЩУЮ) получит вставленную запись.
Особенно затруднительна семантика в ГОСТ 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
ОЧИСТИТЬ ССЫЛКУ ЗАМЕНИТЬ СТАНДАРТ-М ПРОВЕРКОЙ ЗАТЕМ ИСТИНА
ДЕСЯТИЧНОЕ
THERPACKED-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 (©ТКРЫТЬ ВХОДНОЙ).