1. ПРОГРАММА

    1. Строение программных модулей. Программный модуль сос­тоит из заголовка модуля и тела модуля.

(Измененная редакция, Изм. № 1).

  1. Раздел операторов. Раздел операторов должен содер­жать хотя бы один оператор. В самом его начале могут (но не обя­заны) находиться в произвольном порядке и количестве объявле­ния внутренних функций, начальных данных и (или) форматов. Затем должна следовать непустая совокупность операторов, среди которых могут (но не обязаны) содержаться объявления форма­тов и (или) начальных данных.

  2. Тело модуля. Тело модуля состоит из (возможно, пус­той) совокупности объявлений спецификаций и (или) объявле­ний форматов, за которой следует раздел операторов с заключи­тельной строкой после него.

Таким образом, все объявления спецификаций должны быть расположены до объявлений внутренних функций, а эти послед­ние — до первого оператора. Объявления форматов могут распо­лагаться в теле модуля где угодно.

(Измененная редакция. Изм. № 1).

  1. Программный модуль. Программный модуль является либо головным модулем (п. 9.1.4), либо модулем-блоком данных (п. 9.1.5), либо модулем-процедурой (п. 9.1.6).

  2. Головной модуль. Головной модуль состоит только из тела модуля.

  3. Модуль-блок данных. Модуль-блок данных представляет собой последовательность, образованную заголовком специфика­ции блока данных, набором соответствующих (п. 8.5) объявлений на­чальных данных и заключительной строкой, расположенными в ука­занном порядке.

  4. Модуль-процедура. Модуль-процедура состоит из заго­ловка функции или заголовка подпрограммы, за которым следу­ет тело модуля.

  5. Выполнимая программа. Выполнимая программа включа­ет в себя головной модуль, а также произвольное количество дру­гих программных модулей и (или) внешних процедур (разд. 2).

(Измененная редакция, Изм. № 1).

Нормальный порядок выполнения. Выполнение любой вы­полнимой программы начинается с первого по порядку операто­ра головного модуля. При обращении к программному модулю его выполнение начинается с первого по порядку оператора этого моду­ля. Если очередной оператор не является оператором перехода, условным арифметическим оператором, оператором возврата, опера­тором останова или закрывающим оператором тела цикла, то по завершении выполнения этого оператора начинается выполне­ние непосредственно следующего за ним оператора. Порядок выпол­нения, определяемый каждым из перечисленных выше операторов, описан в разд. 7. В разделе операторов не может содержаться оператор, который никогда не может быть выполнен.

  1. ВНУТРИ- И МЕЖМОДУЛЬНЫЕ СООТНОШЕНИЯ

    1. Символические имена. Символическое имя было опреде­лено (п. 3.5) как последовательность, содержащая от одной до шести буквенно-цифровых символов, первый из которых должен быть буквой. Последовательности символов, образующие описатели полей в объявлениях формата или начальные ключевые слова кон­кретных типов предложений, например GOTO, READ, FORMAT, не являются символическими именами в этих позициях и не образу­ют начала символических имен. В любом программном модуле сим­волическое имя (возможно, дополненное индексом) должно обоз­начать элемент одного (и, как правило, только одного) из следую­щих классов:

  1. — массив и элементы этого массива;

  2. — переменная;

  3. — внутренняя функция;

  4. — встроенная функция;

  5. — внешняя функция;

  6. — подпрограмма;

  7. — внешняя процедура, которая на основании информации, содержащейся в данном программном модуле, не может быть от­несена ни к подпрограммам, ни к внешним функциям;

  8. — общий блок.

(Измененная редакция, Изм. № 1).

  1. Соотношения между классами. Символическое имя из класса VIII некоторого программного модуля может принадлежать также к одному из классов I, II или III того же программного модуля.

Если в программном модуле символическое имя из класса V встречается непосредственно после слова FUNCTION в заголов­ке функции, то оно обязано принадлежать также классу II того же программного модуля.

Символическое имя, будучи использовано однажды в любом программном модуле выполнимой программы в классе V, VI, VII или VIII, не может употребляться ни в каком другом программном модуле этой выполнимой программы для обозначения другого объек­та из этих классов. В совокупности программных модулей, образую­щей выполнимую программу, имя из класса VII должно быть свя­зано с именем из класса V или VI. Класс VII имеет смысл только по отношению к отдельным программным модулям.

В любом программном модуле никакое символическое имя не может принадлежать более чем одному классу, за исключением перечисленных выше случаев. На использование символических имен в разных модулях не накладывается никаких дополнительных ограничений.

  1. Эффект употребления символических имен в объявле­ниях спецификаций и объявлениях начальных данных. Символи­ческое имя принадлежит классу I тогда и только тогда, когда оно употребляется в описании массива в качестве имени описания. Для каждого символического имени в одном модуле допускается только одно такое употребление.

Символическое имя, употребленное в объявлении общих объ­ектов (в позиции, отличной от имени блока), принадлежат либо классу I, либо классу II, но не классу V (п. 8.3.1). Для каждого символического имени в одном модуле допускается только одно такое употребление.

Символическое имя, употребленное в объявлении эквивалент­ности, принадлежит либо классу I, либо классу II, но не классу V (п. 8.3.1).

Символическое имя, употребленное в объявлении типа, не может принадлежать классу VI или VII. Для каждого символического име­ни в одном модуле допускается только одно такое употребление.

Символическое имя, встречающееся в объявлении внешних имен, принадлежит либо классу V, либо классу VI, либо классу VII. Для каждого символического имени в одном модуле допускается толь­ко одно такое употребление.

Символическое имя, встречающееся в объявлении начальных данных, принадлежит либо классу I, либо классу II, но не классу V (п. 8.3.1). Любой единице памяти (п. 7.2.1.3.1) в выполнимой про­грамме начальное значение может придаваться не более одного раза.

  1. Массив и элемент массива. За каждым вхождением сим­волического имени, обозначающего какой-либо массив, должен не­посредственно располагаться индекс; исключение составляют сле­дующие вхождения:

в список оператора ввода/вывода;

в список формальных параметров;

в список фактических параметров при ссылке на внешнюю про­цедуру;

в объявление общих объектов;

в объявление типа;

в оператор ввода/вывода в качестве указателя формата.

Формальный параметр внешней процедуры может быть име­нем массива только в том случае, когда соответствующий факти­ческий параметр при ссылке на эту внешнюю процедуру является именем массива или именем элемента массива. Если фактический па­раметр является именем массива, то длина массива-формального па­раметра должна быть не больше длины массива-фактического пара­метра. Если фактический параметр является именем элемента масси­ва, то длина массива-формального параметра должна быть не боль­ше увеличенной на единицу разности длины массива-фактического параметра и значения индекса этого элемента массива.

  1. Внешние процедуры. Символическое имя принадлежит классу VII, если в некотором программном модуле оно встреча­ется только в объявлении внешних имен и в качестве фактического параметра внешней процедуры.

Формальный параметр некоторой внешней процедуры может быть именем другой внешней процедуры только в том случае, когда соответствующий фактический параметр используется при ссылке на эту другую внешнюю процедуру в качестве ее имени.

При выполнении любой выполнимой программы не допуска­ются два таких обращения к одному и тому же модулю-процеду­ре, между которыми не был бы выполнен оператор возврата из этого модуля.

  1. Подпрограмма. Символическое имя принадлежит клас­су VI, если оно встречается непосредственно после слова SUBROU­TINE в заголовке подпрограммы или непосредственно после слова CALL в операторе вызова подпрограммы.

  2. Внутренняя функция. Символическое имя принадлежит классу III в некотором программном модуле, если оно:

не принадлежит классу I и не встречается в объявлении внеш­них имен;

за каждым его вхождением, кроме вхождения в объявление типа, непосредственно следует левая скобка;

в рассматриваемом модуле имеется объявление внутренней функции (п. 8.1.1) с этим именем.

  1. Встроенная функция. Символическое имя принадлежит классу IV в некотором программном модуле, если оно:

не принадлежит ни классу 1, ни классу III и не встречается в объявлении внешних имен;

встречается в колонке имен табл. 3;

не встречается в объявлении типа, который отличается от встроен­ного типа, определяемого этой таблицей;

за каждым его вхождением (кроме разрешенного выше вхож­дения в объявление типа) непосредственно следует левая скобка.

Употребление встроенной функции в некотором программном модуле не запрещает использования этого же символического име­ни для обозначения какого-либо другого объекта в другом прог­раммном модуле той же выполнимой программы.

  1. Внешняя функция. Символическое имя принадлежит клас­су V, если оно:

встречается непосредственно после слова FUNCTION в заго­ловке функции;

не принадлежит ни одному из классов I, III, IV или VI и име­ется хотя бы одно его вхождение, непосредственно за которым следует левая скобка. Левая скобка должна непосредственно сле­довать за каждым его вхождением, кроме вхождений в объявле­ния типа и внешних имен или в качестве фактического параметра.

(Измененная редакция, Изм. № 1).

  1. Переменная. В программном модуле символическое имя принадлежит классу II, если оно:

не принадлежит ни классу VI, ни классу VII, ни классу VIII;

за ним никогда непосредственно не следует левая скобка, если только это имя не следует непосредственно за словом FUNCTION в заголовке функции.

  1. Имя блока. Символическое имя принадлежит классу VIII, если оно используется в качестве имени блока в объявлении общих блоков.

10.2. Понятие определения. Для числовых величин существует два уровня определения — первый и второй. Понятие определе­ния на первом уровне применимо к любым элементам массивов и переменным; понятие определения на втором уровне — только к переменным типа целый. Для объяснения смысла этих понятий необходимо рассмотреть выполнимую программу в процессе ее выполнения.

Необходимо отметить, что существуют два других способа определения. Первый из них осуществляется оператором предпи­сания для переменной типа целый, но определяет значение типа отличного от целого — он рассмотрен в пп. 7.1.1.3 и 7.1.2.1.2; вто­рой способ, позволяющий ссылаться на внешнюю процедуру, бу­дет рассмотрен в п. 10.2.1.

В дальнейшем, говоря об определении и неопределении приме­нительно к переменным и элементам массивов, мы всегда будем подразумевать первый уровень определения.

  1. Определение процедур. Если выполнимая программа содержит информацию, описывающую внешнюю процедуру, то такая внешняя процедура с соответствующим символическим име­нем определена для использования в этой выполнимой програм­ме. Ссылка на внешнюю функцию или ссылка на подпрограмму (выбирается подходящий случай) с этим символическим именем может встречаться в выполнимой программе, если число парамет­ров в определении и ссылке совпадает. Кроме того, тип внешней функции в определении и ссылке также должен совпадать. Ос­тальные ограничения содержатся в пп. 8.3.1, 8.3.2, 8.4.1, 8.4.2, 10.1.3 и 10.1.4.

Основные внешние функции, перечисленные в п. 8.3.3, опреде­лены всегда и на них можно ссылаться при условии выполнения ограничений, указанных выше.

Для указанного использования определено символическое имя из класса III или IV.

  1. Связи, обеспечивающие определение. Объекты могут стать связанными посредством:

связи через общие блоки;

связи через эквивалентность;

подстановки параметров.

В результате упомянутых комбинаций может возникнуть мно­жественная связь с одним или несколькими объектами. Любое оп­ределение или неопределение одного из элементов множества свя­занных элементов вызывает определение или неопределение всех элементов этого множества.

С точки зрения определения в любом программном модуле между двумя объектами, каждый из которых встречается в объ­явлении общих объектов, не существует никакой связи. Кроме то­го, для общих и эквивалентных объектов не существует никакой связи, кроме установленной в пп. 7.2.1.3.1 и 7.2.1.4.

Если фактический параметр при ссылке на внешнюю процеду­ру является именем массива, именем элемента массива, или име­нем переменной, то в соответствии с пп. 10.1.3 и 10.2.1 связь фор­мальных параметров с фактическими определена лишь на время от начала выполнения первого оператора этой процедуры и до начала выполнения первого встреченного оператора возврата этой процедуры. Заметим особо, что эта связь может передаваться более чем через один уровень ссылок на внешние процедуры.

В дальнейшем переменные и элементы массивов, связанные на основании пп. 7.2.1.3.1 и 7.2.1.4, будут считаться эквивалент­ными только при условии совпадения типов.