Индексирование
Номера вхождений указываются добавлением одного или нескольких индексов к имени-данного.
Индексом может быть либо целое, либо имя-данного, относящееся к целому числовому элементарному данному, либо имя-ин- декса, связанное с таблицей. За именем-данного или именем-ин- декса может следовать знак операции + или — и целое, используемое соответственно как приращение или уменьшение. Допустимо одновременное использование целых, имен-данных и имен-индексов.
Индексы, заключенные в круглые скобки, записываются непосредственно за уточнением имени элемента таблицы. Количество индексов в такой ссылке должно равняться размерности таблицы, в которую входит данный элемент. Таким образом, каждой фразе OCCURS (ПОВТОРЯЕТСЯ) в иерархии, содержащей имя-дан- ного, включая и само имя-данного, должен быть соотнесен индекс.
Когда требуется более одного индекса, они записываются в порядке последовательного снижения уровня вложенности размерностей организации данных. Если многомерную таблицу рассматривать как последовательность вложенных таблиц и наиболее объемлющую или внешнюю таблицу рассматривать как старший уровень, а самую внутреннюю или наименее объемлющую таблицу — как младший уровень, индексы записываются слева направо в порядке: старший уровень, промежуточный, младший.
В ссылке на данное нельзя использовать индексирование, если данное не является табличным элементом или данным или име- нем-условия в табличном элементе.
Наименьший допустимый номер вхождения равняется единице. Наибольший допустимый номер вхождения в каждом отдельном случае равняется максимальному числу вхождений данного, определяемому фразой OCCURS (ПОВТОРЯЕТСЯ).
Индексирование с помощью целого или имен и-д энного
Если для представления индекса используется целое или имя- данного, они могут использоваться для ссылки на данные в разных таблицах. Элементы таблиц не обязательно должны быть одного и того же размера для всех таблиц. Одно и то же целое или имя- данного может появляться как единственный индекс одного данного и как один из двух и более индексов другого данного.
Индексирование с помощью имени-индекса
Для облегчения операций поиска в таблице и манипулирования отдельными данными допускается индексирование с помощью имени-индекса. Чтобы использовать это средство, программист соотносит одно или несколько имен-индексов данному, в статье описания которого имеется фраза OCCURS (ПОВТОРЯЕТСЯ). Значение имени-индекса соответствует номеру вхождения для данного, с которым связано имя-индекса.
Фраза INDEXED BY (ИНДЕКСИРУЕТСЯ), посредством которой идентифицируется имя-индекса и соотносится определенной таблице, является необязательной частью фразы OCCURS (ПОВТОРЯЕТСЯ). В Коболе нет отдельной статьи для описания имени- индекса, поскольку его определение полностью зависит от оборудования. Во время выполнения значение имени-индекса будет соответствовать номеру вхождения для той конкретной размерности таблицы, с которой было связано имя-индекса; способ соответствия определяется реализацией. Начальное значение имени-индекса во время выполнения не определено, то есть начальное значение нужно установить перед использованием.
Начальное значение имени-индекса присваивается оператором' PERFORM (ВЫПОЛНИТЬ) с фразой VARYING (МЕНЯЯ), оператором SEARCH ALL (ИСКАТЬ ОСОБО) или оператором SET (УСТАНОВИТЬ).
Использование целого или имени-данного в качестве индекса для ссылки на табличный элемент или данное в табличном элементе не вызывает изменений значения имени-индекса, связанного с этой таблицей.
Имя-индекса может быть использовано для ссылки только на ту таблицу, которой оно соотнесено фразой INDEXED BY (ИНДЕКСИРУЕТСЯ).
Операции поиска данных, организованных в таблицы, обеспечиваются в Коболе оператором SEARCH (ИСКАТЬ), позволяющим осуществлять последовательный или непоследовательный (например, бинарный) поиск. Оператор используется для поиска в таблице элемента, удовлетворяющего определенному условию, и для установки значения соответствующего имени-индекса для указания этого табличного элемента
.Относительное индексирование является дополнительным вариантом для ссылок на табличные элементы или на данное в табличном элементе. Когда за именем табличного элемента следует индекс в виде (имя-индекса + или — целое), номер вхождения, требуемый для завершенной (полной) ссылки, такой же, как если бы перед ссылкой имя-индекса было увеличено или уменьшено на целое посредством оператора SET (УСТАНОВИТЬ). Использование относительного индексирования не изменяет значения имени-индекса.
Значение имени-индекса может быть сделано доступным объектной программе путем его запоминания в индексном данном. Индексные данные описываются в программе статьей описания данного, содержащей фразу USAGE IS INDEX (ДЛЯ ИНДЕКСА). Значение имени-индекса помещается в индексное данное выполнением оператора SET (УСТАНОВИТЬ).
П р и м е р ы индексирования
Предполагая следующее описание данных:
02 ANK ...
02 Al OCCURS 20 TIMES INDEXED BY Al-INDEX ...
03 Bl ...
03 B2 OCCURS 5 TIMES . . .
04 Cl ...
88 MAX VALUE IS ...
04 C2 ...
05 DI OCCURS 10 TIMES...
06 El . . .
06 E2 ...
02 AHK ...
02 Al ПОВТОРЯЕТСЯ 20 РАЗ ИНДЕКСИРУЕТСЯ AI-ИНДЕКС...
03 Bl ...
03 B2 ПОВТОРЯЕТСЯ 5 РАЗ . ..
04 Cl ...
88 МАХ ЗНАЧЕНИЕ . . .
04 С2...
05 D1 ПОВТОРЯЕТСЯ 10 РАЗ ...
06 Е1 ...
06 Е2 ...
в ссылках на А1 и В1 требуется только один индекс, в ссылках на В2, Cl, МАХ и С2 требуются два индекса, и в ссылках на D1, Е1 и Е2 требуются три индекса.
Проиллюстрируем требования указания индексов в порядке от старшего к младшим:
Е1 (18, 2, 7) значит Е1 в седьмом D1, во втором В2 и в восемнадцатом А1.
Возможность одновременного использования целых, имен-дан- ных и имен-индексов проиллюстрирована на следующем примере:
EI (A1-INDEX, 4, ANK+5).
(ЕІ (АІ-ИНДЕКС, 4, АНК+5)).
ОБЩАЯ ОБЛАСТЬ ПАМЯТИ
Это средство в основном ориентировано на экономию памяти в объектной программе, так как позволяет нескольким файлам иметь одну и ту же область файла и области ввода-вывода.
Если использована фраза SAME RECORD (ОБЩАЯ ОБЛАСТЬ ЗАПИСИ), общей является только область записи, а области ввода-вывода для каждого файла остаются независимыми. В этом случае любое количество файлов, имеющих общей одну и ту же область записи, могут быть активными одновременно. Этот фактор может дать экономию времени при выполнении объектной программы.
Проиллюстрируем это. Если программист назначил одну и ту же область записи и старому, и новому файлам, он не только сэкономил память в объектной программе, но поскольку эта техника исключает пересылку каждой записи из области ввода в область вывода, получит в результате экономию и во времени. Кроме того, при использовании этой техники программисту нет необходимости определять в деталях запись и старого, и нового файлов. Вместо этого он полностью определяет запись в одном случае, и просто включает статью с номером уровня 01 в другом. Поскольку эти области записей фактически являются одной и той же областью, один набор имен достаточен для всех потребностей обработки без необходимости уточнения.
Если используется фраза SAME (ОБЩАЯ ОБЛАСТЬ) без варианта RECORD (ЗАПИСИ), общими являются не только области файла, но и области ввода-вывода.
В результате только один из файлов, разделяющих один и тот же набор общих областей, может быть активным в определенное время. Эта форма фразы предназначена для применения, когда ряд файлов используется на разных фазах объектной программы. В этих случаях фраза SAME (ОБЩАЯ ОБЛАСТЬ) позволяет программисту экономить память.
ОРГАНИЗАЦИЯ ПРОГРАММ И ПРОГРАММНЫХ СВЯЗЕЙ
Довольно часто полные проблемы обработки данных решаются разработкой отдельно компилируемых, но логически скоординированных программ, которые на некотором этапе до выполнения можно компилировать отдельно и затем собрать для полного решения проблемы. Организация программ на Коболе и единицы исполнения поддерживает такой подход разделения решения больших проблем на малые, более управляемые порции, которые можно программировать и тестировать независимо.
Понятие программы и единицы исполнения
Имеются два уровня компьютерных программ в Коболе: исходный уровень и объектный уровень.
На исходном уровне наиболее объемлющей единицей компьютерной программы является исходная программа. Исходная программа может содержать другие исходные программы. Исходная программа — синтаксически правильный набор операторов Кобола, по определению настоящего документа состоящий из раздела идентификации, за которым необязательно следуют раздел оборудования и (или) раздел данных, и (или) раздел процедур. Исходная программа, не содержащаяся в другой исходной программе, может быть преобразована компилятором в объектную программу, которая может быть выполнена либо одна, либо вместе с другими объектными программами.
В общем случае программа, содержащаяся в другой программе, не может быть преобразована компилятором в объектную программу, так как по определениям этого документа в содержащейся программе явно разрешается ссылаться на данные, описанные в содержащей ее исходной программе.
Раздел процедур исходной программы организован как последовательность процедур двух типов. Декларативные процедуры, обычно именуемые декларативами, — это процедуры, которые будут выполняться только при появлении специальных условий во время выполнения программы. Недекларативные процедуры — процедуры, выполняемые соответственно нормальному ходу управления в программе. Декларативні могут содержать недекларативные процедуры, но последние будут выполняться только во время выполнения декларатив, в которых они содержатся. Недекларативные процедуры могут содержать другие недекларативные процедуры, но не должны содержать декларативы. Ни декларативы, ни недекларативные процедуры не могут содержать в себе программы. Другими словами, в Коболе термины «процедура» и «программа» не являются синонимами.
На объектном уровне наиболее объемлющей единицей организации компьютерных программ является единица исполнения. Единица исполнения — это полное решение проблемы, состоящее из объектной программы или из нескольких взаимосвязанных объектных программ. Единица исполнения — это независимая единица, которая может выполняться без связей или координирования с другой единицей исполнения, за исключением того, что может обрабатывать файлы данных и сообщения и устанавливать :или проверять переключатели, которые записаны или будут считываться другими единицами исполнения.
При вызове программы параметры, которыми она должна оперировать, могут быть переданы ей вызывающей ее программой. '.Поскольку любая компилируемая программа может быть первой программой, выполняемой в единице исполнения, первая выполняемая программа единицы исполнения может получать параметры.
Единица исполнения может также содержать объектный код .и области памяти для данных, получаемые в результате компиляции программы, записанной на языке, отличном от Кобола; в этом случае требования к организации связей между Кобол-программой и программой, записанной не на Коболе, определяются реализацией.
Доступные данные и файлы
Некоторые данные имеют связанную с ними концепцию памяти, ■определяющую, где представляются значения и другие свойства данных относительно программ единицы исполнения. Подобно этому, определители файла тоже имеют связанную с ними концепцию памяти, определяющую, где представляется информация о позиционировании и состоянии файла, а также о других свойствах обработки файла, относительно программ единицы исполнения.
Имена
Имя-данного именует данное. Имя-файла именует определитель файла. Эти имена классифицируются как глобальные или локальные.
Глобальное имя используется для ссылки на объект, которому оно соотнесено, либо из программы, в которой глобальное имя объявлено, либо из любой другой программы, содержащейся в программе, объявляющей это глобальное имя.
Локальное имя можно использовать для ссылки на объект, которому оно соотнесено, только из программы, в которой локальное имя объявлено. Некоторые имена всегда глобальны, некоторые — всегда локальны, а некоторые являются либо локальными, либо глобальными в зависимости от спецификаций программы, в которой имена объявлены.
Имя-записи глобально, если указана фраза GLOBAL (ГЛОБАЛЬНОЕ) в статье описания записи, объявляющей это имя, или в случае статьи описания записи в секции файлов, если фраза GLOBAL (ГЛОБАЛЬНОЕ) указана в описании файла для имени- файла, связанного с описанием записи. Имя-данного глобально, если фраза GLOBAL (ГЛОБАЛЬНОЕ) указана либо в статье описания данного, объявляющей это имя-данного, либо в другой статье, которой подчинена упомянутая статья описания данного. Имя- условия, объявленное в статье описания данного, глобально, если эта статья подчинена другой статье, в которой указана фраза GLOBAL (ГЛОБАЛЬНОЕ). Однако иногда особые правила запрещают указание фразы GLOBAL (ГЛОБАЛЬНОЕ) для определенных статей описания данных, описания файла или описания записи.
Имя-файла глобально, если фраза GLOBAL (ГЛОБАЛЬНОЕ) указана в соответствующей ему статье описания файла.
Если имя-данного, имя-файла или имя-условия, объявленное в описании данного, не глобально, имя является локальным.
Глобальные имена транзитивны в программах, содержащихся в других программах.