Заголовок раздела процедур (1 МПС). Данное, появляющееся во фразе USING (ИСПОЛЬЗУЯ) заголовка раздела процедур, не может иметь фразу REDEFINES (ПЕРЕОПРЕДЕЛЯЕТ) в своей статье описания данного.
Обоснование
Согласно ГОСТ 22558 во фразе USING (ИСПОЛЬЗУЯ) заголовка раздела ■процедур могло быть указано данное, описанное фразой REDEFINES (ПЕРЕОПРЕДЕЛЯЕТ). Таким образом, следующий пример был верен:
LINKAGE SECTION.
01 А РІС Х(ІО).
01 В REDEFINES А РІС 9(10).
PROCEDURE DIVISION USING A, B.
СЕКЦИЯ СВЯЗИ.
01 А Ш X(10).
01 Б ПЕРЕОПРЕДЕЛЯЕТ А Ш 9(10).
РАЗДЕЛ ПРОЦЕДУР ИСПОЛЬЗУЯ А, Б.
Если в вызывающей программе указаны два различных параметра, результаты не определены. Разрешение указывать во фразе USING (ИСПОЛЬЗУЯ) заголовка раздела процедур данное со статьей REDEFINES (ІІЕРЕОПРЕДЕ-ЛЯЕТ) могло бы привести к программистским ошибкам, остающимся невыявлен- ными, приводящим к неверным результатам, и не обеспечивает никаких дополнительных функций. В большинстве случаев программы, в заголовке раздела процедур которых во фразе USING (ИСПОЛЬЗУЯ) указаны переопределяющие данные, могут быть преобразованы подстановкой переопределяемых данных.
Возведение в степень (2 Я ДР). В настоящем стандарте определены следующие специальные случаи возведения в степень:
если значение, меньшее или равное нулю, возводится в нулевую степень, возникает условие переполнения;
если возведение в степень дает положительное или отрицательное действительное число, возвращается положительное число;
если результатом вычисления является не действительное число, возникает условие переполнения.
Обоснование
Поскольку ГОСТ 22558 не устанавливал, что может произойти в этих специальных случаях возведения в степень, выбор обработки предоставлялся реализации. Это изменение приводит к устранению неопределенной ситуации и поможет обеспечению переносимости программ. Поскольку в двух из этих случаев вырабатывается условие ошибки и третий случай совпадает с большинством реализаций, эти изменения затронут немногие программы.
Порядок выполнения условных выражений (2 Я ДР). Два или больше условий, связанных только знаком логической операции AND (И) или только знаком логической операции OR (ИЛИ) на одном иерархическом уровне, вычисляются в порядке слева направо и вычисление этого иерархического уровня заканчивается, как только определено значение истинности, независимо от того, вычислялись ли все составные части связанных условий на этом иерархическом уровне.
Обоснование
Поскольку согласно ГОСТ 22558 порядок вычисления условных выражений определяется реализацией, одни и те же программы, использующие одни и те же данные для ввода, приводят к получению определенных результатов на одних реализациях и неопределенных — на других реализациях. Определение порядка вычисления усиливает переносимость программ.
Это изменение позволит программам проверить, принадлежит ли индекс интервалу, непосредственно до использования его как индекса в операторе; например:
IF INDEX-A IS LESS THAN 5 AND TABLE-A (INDEX-A) IS EQUAL TO 25.
ЕСЛИ ИНДЕКС-А МЕНЬШЕ 5 И ТАБЛИЦА-А (ИНДЕКС-А) РАВНО 25.
Изменение может повлиять на выполнение декларатив для фразы ALL REFERENCES (ПРИ ВСЕХ ССЫЛКАХ) в некоторых компиляторах. Изменение не оказывает никакого другого эффекта на имеющиеся программы.
Условие класса (1 ЯДР). Проверка на ALPHABETIC (БУКВЕННОЕ) дает значение истины для прописных букв, строчных букв и литеры пробела. Проверка ALPHABETIC-UPPER (ПРОПИСНЫЕ) дает значение истины для прописных букв и литеры пробела. Проверка ALPHABETIC-LOWER (СТРОЧНЫЕ) дает значение истины для строчных букв и литеры пробела.
Обоснование
В старых реализациях Кобола буквенные литеры, принятые в большинстве наборов литер, были только прописными. Поэтому в ГОСТ 22558 проверка ALPHABETIC (БУКВЕННОЕ) давала значение истины для прописных литер и литеры пробела. В настоящее время наборы литер включают и прописные и строчные литеры. Согласно изменению в технологии проверка ALPHABETIC (БУКВЕННОЕ) сейчас следует логическому значению термина и воспринимает все буквенные литеры ■— и прописные, и строчные.
Обеспечиваются две дополнительные проверки для подклассов буквенных литер. В частности, изменение ALPHABETIC (БУКВЕННОЕ) в новую проверку 768' ALPHABETIC-UPPER (ПРОПИСНЫЕ) в соответствующих ГОСТ 22558 исходных программах даст возможность программам выполняться в соответствии с правилами ГОСТ 22558.
і Некоторые реализации уже сделали эти изменения. Поэтому это изменение I касается некоторых программ, использующих проверку класса ALPHABETIC
(БУКВЕННОЕ) в двух случаях: (1) на реализациях, допускающих только про- ; писные буквы и пробел, или (2) там, где исходные программы не могут разре- , шать восприятие строчных букв. Многие исходные программы используют проверку класса на ALPHABETIC (БУКВЕННОЕ), поэтому изменение из ALPHA- ; BETIC (БУКВЕННОЕ) в ALPHABETIC-UPPER (ПРОПИСНЫЕ) должно быть I выполнено программой автоматического преобразования кода.
! (14) Оператор CANCEL (ОСВОБОДИТЬ) (2 МПС).
і Оператор CANCEL (ОСВОБОДИТЬ) закрывает все открытые файлы. Обоснование
В ГОСТ 22558 не определено состояние файлов, остающихся в режиме открытия, когда освобождается программа. Изменение в настоящем стандарте вырабатывает предсказуемый результат при выполнении этого оператора. Это повлияет только на те программы, которые освобождены и предполагают, что файлы освобожденной программы должны остаться открытыми после выполнения оператора CANCEL (ОСВОБОДИТЬ).
Оператор CLOSE (ЗАКРЫТЬ) (2 ПОД). Вариант NO REWIND (БЕЗ ПЕРЕМОТКИ) не может быть указан в операторе CLOSE (ЗАКРЫТЬ), имеющем фразу REEL/UNIT (КАТУШКУ/ТОМ).
Обоснование
В ГОСТ 22558 правила для вариантов NO REWIND (БЕЗ ПЕРЕМОТКИ) и REEL/UNIT (КАТУШКУ/ТОМ) иногда были противоречивы. Противоречие заключалось в том, что правила для варианта NO REWIND (БЕЗ ПЕРЕМОТКИ) указывают, что катушка/том остаются в текущем положении, в то время как правила варианта REEL/UNIT (КАТУШКУ/ТОМ) указывают, что должна иметь место перемотка катушки/тома.
Изменение в настоящем стандарте повлияет на очень немногие программы, поскольку оператор CLOSE (ЗАКРЫТЬ) с обоими вариантами NO REWIND (БЕЗ ПЕРЕМОТКИ) и REEL/UNIT (КАТУШКУ/ТОМ) не мог быть правильно обработан.
Оператор COPY (КОПИРОВАТЬ) (1 ОИТ). Если слово COPY (КОПИРОВАТЬ) появляется в статье-комментарии или месте, где может появиться статья-комментарий, оно рассматривается как часть статьи-комментария.
Обоснование
В стандарте Кобола появление слова COPY (КОПИРОВАТЬ) в статье-комментарии являлось неопределенной ситуацией. Определение этой ситуации в настоящем стандарте улучшит программную переносимость.
Оператор COPY (КОПИРОВАТЬ) (1 ОИТ). Если в параграфе SOURCE-COMPUTER (ИСХОДНАЯ-МАШИНА) не указана фраза WITH DEBUGGING MODE (В РЕЖИМЕ ОТЛАДКИ), после обработки всех операторов COPY (КОПИРОВАТЬ) отладочная строка будет рассматриваться как имеющая все характеристики строки-комментария.
Обоснование
В ГОСТ 22558 не рассматривалась ситуация оператора COPY (КОПИРОВАТЬ) или части оператора COPY (КОПИРОВАТЬ), появляющегося в строке отладки. Рассмотрим следующий оператор COPY (КОПИРОВАТЬ):
COPY XYZ
D REPLACING 1 BY 2.
КОПИРОВАТЬ АБВ
Т ЗАМЕНЯЯ 1 НА 2.
Если программа компилируется без фразы WITH DEBUGGING MODE (В- РЕЖИМЕ ОТЛАДКИ), ГОСТ 22558 не определяет, будет ли выполняться вариант REPLACING (ЗАМЕНЯЯ). Ио правилам настоящего стандарта вариант REPLACING (ЗАМЕНЯЯ) выполняется.
Имеет место несовместимость, если при реализации ГОСТ 22558 оговорено, что отладочная строка рассматривается как строка комментария. Если же при реализации предполагается, что отладочная строка не рассматривается как строка комментария, несоответствие не имеет места.
Изменение в настоящем стандарте определяет, как обрабатывать такую ситуацию, усиливая тем самым степень программной совместимости. Это изменение поели,чет на очень небольшое количество имеющихся программ.
Оператор COPY (КОПИРОВАТЬ) (2 ОИТ). Псевдотекст-1 не может состоять полностью из разделителя запятая или разделителя точки с запятой.
Обоснование
В ГОСТ 22558 допускалось, чтобы псевдотекст ! в операторе COPY (КОПИРОВАТЬ) состоял полностью из разделителя запятая или разделителя точка с запятой, но не определял, при каких условиях происходит замена. Любая попытка определить семантику в этой ситуации привела бы к потенциальной несовместимости.
Поскольку нет явной пользы от замены одинойной запятой или точки с запятой, это средство удалено из настоящего стандарта.
Оператор DISPLAY (ВЫДАТЬ) (1 ЯДР). После выдачи последнего операнда на устройство, устройство будет установлено в самую левую позицию следующей строки устройства.
Обоснование
В ГОСТ 22558 позиционирование устройства после последнего операнда не- определено. Новое правило в настоящем стандарте необходимо для полного определения варианта NO ADVANCING (БЕЗ ПРОДВИЖЕНИЯ). Большинство реализаций уже функционируют соответственно новому правилу.
Оператор DIVIDE (РАЗДЕЛИТЬ) (2 ЯДР).
Любые индексы для идентификатора-4 варианта REMAINDER (ОСТАТОК} вычисляются после запоминания результата операции DIVIDE (РАЗДЕЛИТЬ) в идентификаторе-3 варианта GIVING (ПОЛУЧАЯ).
Обоснование
В ГОСТ 22558 не определена точка, в которой определяется любой индекс в- варианте REMAINDER (ОСТАТОК) во время обработки оператора DIVIDE (РАЗДЕЛИТЬ).
Это изменение может повлиять на имеющиеся программы, если:
частное используется как индекс для остатка, и
вычисление индекса в реализации Кобола еще не вычисляет индекс по- методике, определенной настоящим стандартом. Например:
01 DD РІС 99 VALUE IS 50.
ОТ DR РІС 99 VALUE IS 2.
01- QU PIC 99.
01' REMAIN.
02 RM PIC 99 OCCURS 100' TIMES.
PROCEDURE DIVISION.
DIVIDE DD BY DR GIVING QU REMAINDER RM (QU).
01 ДД Ш 99 ЗНАЧЕНИЕ 50.
01 ДР Ш 99 ЗНАЧЕНИЕ 2.
01 КУ Ш 99.
01 ОСТАТ.
02 ОШ Ш 99 ПОВТОРЯЕТСЯ 100 РАЗ.
РАЗДЕЛ ПРОЦЕДУР.
РАЗДЕЛИТЬ ДД НА ДР ПОЛУЧАЯ КУ ОСТАТОК ОШ (КУ).Это изменение повлияет только на некоторые программы, если таковые имеются.
Оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) (1 МПС). Если в вызываемой программе нет следующего выполнимого оператора, выполняется неявный оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАЛІМЬІ).
Обоснование
В ГОСТ 22558 эта ситуация была не определена. Определение этой ситуации 'в настоящем стандарте обеспечивает большую переносимость программ. Это изменение повлияет только на программы, зависящие от некоторых других действий реализации, когда оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) ■опущен.
Оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) (1 МПС), Для оператора EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) появляется следующее новое правило: «... концы диапазонов всех операторов PERFORM (ВЫПОЛНИТЬ), выполняемых вызываемой программой, считаются достигнутыми». Эта ситуация в ГОСТ 22558 не определена.
Обоснование
В ГОСТ 22558 общее правило 3 оператора CALL (ВЫЗВАТЬ) гласит: «При всех последующих входах в вызываемую программу состояние программы остается неизменным после последнего выхода из нее. Состояние программы включает все ее поля данных, состояние и позиционирование всех файлов и все установки переключателей». Не .ясно, рассматривается или нет активация оператора PERFORM (ВЫПОЛНИТЬ) как часть состояния программы. В настоящем стандарте эта неоднозначность разрешена добавлением правила о том, что состояние программы не изменяется за исключением того, что границы диапазонов всех операторов PERFORM (ВЫПОЛНИТЬ) считаются достигнутыми.
Потенциальная несовместимость остается, если при реализации ГОСТ 22558 было принято решение не считать достигнутыми концы диапазонов оператора PERFORM (ВЫПОЛНИТЬ). Если же при реализации было принято рассматривать концы диапазонов оператора PERFORM (ВЫПОЛНИТЬ) достигнутыми, то никакой несовместимости не возникнет.
Данное изменение определяет путь обработки такой ситуации, что повысит •степень переносимости программ. Изменение повлияет на небольшое количество имеющихся программ.
Оператор INSPECT (ПРОСМОТРЕТЬ) (2 ЯДР). Определяется порядок вычисления индексов в операторе INSPECT (ПРОСМОТРЕТЬ). Индексирование, связанное с любым индикатором, выполняется только один раз как первая операция при выполнении оператора INSPECT (ПРОСМОТРЕТЬ).
Обоснование
Порядок вычисления индексов в операторе INSPECT (ПРОСМОТРЕТЬ) в ГОСТ 22558 не определен. Несовместимость имеет место, если реализация ГОСТ 22558 выполняет вычисление индексов в операторе INSPECT (ПРОСМОТРЕТЬ) ■не первой операцией.
Изменение в настоящем стандарте определяет порядок вычисления индексов в операторе INSPECT (ПРОСМОТРЕТЬ). Таким образом, такой оператор как
INSPECT X TALLYING I FOR ALL A(I)
ПРОСМОТРЕТЬ X СЧИТАЯ В І ВСЕ A (I)
который был неясен по ГОСТ 22558, становится определенным в настоящем стандарте Кобола. Определение этой ситуации в стандарте увеличивает степень переносимости программ.
Оператор MERGE (СЛИТЬ) (1 СРТ).
Два файла оператора MERGE (СЛИТЬ) не могут быть указаны во фразе SAME AREA (ОБЩАЯ ОБЛАСТЬ) или SAME SORT/MERGE AREA (ОБЩАЯ •ОБЛАСТЬ СОРТИРОВКИ-СЛИЯНИЯ). Только те файлы оператора MERGE (СЛИТЬ) могут быть указаны в фразе SAME RECORD AREA (ОБЩАЯ ОБЛАСТЬ), которые связаны с вариантом GIVING (ПОЛУЧАЯ).
Обоснование
Это правило является разъяснением взаимодействия фразы SAME (ОБЩАЯ) и оператора MERGE (СЛИТЬ), которого в ГОСТ 22558 не было. Если это правило, даже не установленное, было нарушено в реализации ГОСТ 22558, оператор MERGE (СЛИТЬ), возможно, не выполнялся должным образом.
Рассмотрим следующее правило оператора MERGE (СЛИТЬ) в настоящем стандарте: «Никакие два имени-файла в операторе MERGE (СЛИТЬ) не могут быть указаны в одной и той же фразе SAME AREA (ОБЩАЯ ОБЛАСТЬ), SAME SORT AREA (ОБЩАЯ ОБЛАСТЬ СОРТИРОВКИ) или SAME SORT-MERGE AREA (ОБЩАЯ ОБЛАСТЬ СОРТИРОВКИ-СЛИЯНИЯ)». Соответственно фразе SAME AREA (ОБЩАЯ ОБЛАСТЬ) оператор MERGE (СЛИТЬ) может потребовать, чтобы оба файла были открыты одновременно, однако, фраза SAME AREA (ОБЩАЯ ОБЛАСТЬ) не разрешает, чтобы два файла, указанные в фразе SAME (ОБЩАЯ), были открыты одновременно. Соответственно фразе SAME SORT-MERGE AREA (ОБЩАЯ ОБЛАСТЬ СОРТИРОВКИ-СЛИЯНИЯ), оператор MERGE (СЛИТЬ) может потребовать область памяти, используемую для одного из файлов, но может потребоваться, чтобы тот файл был открыт; правила фразы SAME SORT-MERGE AREA (ОБЩАЯ ОБЛАСТЬ СОРТИРОВКИ- СЛИЯНИЯ) не разрешили бы открыть тот файл.