ПРОГРАММА
Строение программных модулей. Программный модуль состоит из заголовка модуля и тела модуля.
(Измененная редакция, Изм. № 1).
Раздел операторов. Раздел операторов должен содержать хотя бы один оператор. В самом его начале могут (но не обязаны) находиться в произвольном порядке и количестве объявления внутренних функций, начальных данных и (или) форматов. Затем должна следовать непустая совокупность операторов, среди которых могут (но не обязаны) содержаться объявления форматов и (или) начальных данных.
Тело модуля. Тело модуля состоит из (возможно, пустой) совокупности объявлений спецификаций и (или) объявлений форматов, за которой следует раздел операторов с заключительной строкой после него.
Таким образом, все объявления спецификаций должны быть расположены до объявлений внутренних функций, а эти последние — до первого оператора. Объявления форматов могут располагаться в теле модуля где угодно.
(Измененная редакция. Изм. № 1).
Программный модуль. Программный модуль является либо головным модулем (п. 9.1.4), либо модулем-блоком данных (п. 9.1.5), либо модулем-процедурой (п. 9.1.6).
Головной модуль. Головной модуль состоит только из тела модуля.
Модуль-блок данных. Модуль-блок данных представляет собой последовательность, образованную заголовком спецификации блока данных, набором соответствующих (п. 8.5) объявлений начальных данных и заключительной строкой, расположенными в указанном порядке.
Модуль-процедура. Модуль-процедура состоит из заголовка функции или заголовка подпрограммы, за которым следует тело модуля.
Выполнимая программа. Выполнимая программа включает в себя головной модуль, а также произвольное количество других программных модулей и (или) внешних процедур (разд. 2).
(Измененная редакция, Изм. № 1).
Нормальный порядок выполнения. Выполнение любой выполнимой программы начинается с первого по порядку оператора головного модуля. При обращении к программному модулю его выполнение начинается с первого по порядку оператора этого модуля. Если очередной оператор не является оператором перехода, условным арифметическим оператором, оператором возврата, оператором останова или закрывающим оператором тела цикла, то по завершении выполнения этого оператора начинается выполнение непосредственно следующего за ним оператора. Порядок выполнения, определяемый каждым из перечисленных выше операторов, описан в разд. 7. В разделе операторов не может содержаться оператор, который никогда не может быть выполнен.
ВНУТРИ- И МЕЖМОДУЛЬНЫЕ СООТНОШЕНИЯ
Символические имена. Символическое имя было определено (п. 3.5) как последовательность, содержащая от одной до шести буквенно-цифровых символов, первый из которых должен быть буквой. Последовательности символов, образующие описатели полей в объявлениях формата или начальные ключевые слова конкретных типов предложений, например GOTO, READ, FORMAT, не являются символическими именами в этих позициях и не образуют начала символических имен. В любом программном модуле символическое имя (возможно, дополненное индексом) должно обозначать элемент одного (и, как правило, только одного) из следующих классов:
— массив и элементы этого массива;
— переменная;
— внутренняя функция;
— встроенная функция;
— внешняя функция;
— подпрограмма;
— внешняя процедура, которая на основании информации, содержащейся в данном программном модуле, не может быть отнесена ни к подпрограммам, ни к внешним функциям;
— общий блок.
(Измененная редакция, Изм. № 1).
Соотношения между классами. Символическое имя из класса VIII некоторого программного модуля может принадлежать также к одному из классов I, II или III того же программного модуля.
Если в программном модуле символическое имя из класса V встречается непосредственно после слова FUNCTION в заголовке функции, то оно обязано принадлежать также классу II того же программного модуля.
Символическое имя, будучи использовано однажды в любом программном модуле выполнимой программы в классе V, VI, VII или VIII, не может употребляться ни в каком другом программном модуле этой выполнимой программы для обозначения другого объекта из этих классов. В совокупности программных модулей, образующей выполнимую программу, имя из класса VII должно быть связано с именем из класса V или VI. Класс VII имеет смысл только по отношению к отдельным программным модулям.
В любом программном модуле никакое символическое имя не может принадлежать более чем одному классу, за исключением перечисленных выше случаев. На использование символических имен в разных модулях не накладывается никаких дополнительных ограничений.
Эффект употребления символических имен в объявлениях спецификаций и объявлениях начальных данных. Символическое имя принадлежит классу 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) в выполнимой программе начальное значение может придаваться не более одного раза.
Массив и элемент массива. За каждым вхождением символического имени, обозначающего какой-либо массив, должен непосредственно располагаться индекс; исключение составляют следующие вхождения:
в список оператора ввода/вывода;
в список формальных параметров;
в список фактических параметров при ссылке на внешнюю процедуру;
в объявление общих объектов;
в объявление типа;
в оператор ввода/вывода в качестве указателя формата.
Формальный параметр внешней процедуры может быть именем массива только в том случае, когда соответствующий фактический параметр при ссылке на эту внешнюю процедуру является именем массива или именем элемента массива. Если фактический параметр является именем массива, то длина массива-формального параметра должна быть не больше длины массива-фактического параметра. Если фактический параметр является именем элемента массива, то длина массива-формального параметра должна быть не больше увеличенной на единицу разности длины массива-фактического параметра и значения индекса этого элемента массива.
Внешние процедуры. Символическое имя принадлежит классу VII, если в некотором программном модуле оно встречается только в объявлении внешних имен и в качестве фактического параметра внешней процедуры.
Формальный параметр некоторой внешней процедуры может быть именем другой внешней процедуры только в том случае, когда соответствующий фактический параметр используется при ссылке на эту другую внешнюю процедуру в качестве ее имени.
При выполнении любой выполнимой программы не допускаются два таких обращения к одному и тому же модулю-процедуре, между которыми не был бы выполнен оператор возврата из этого модуля.
Подпрограмма. Символическое имя принадлежит классу VI, если оно встречается непосредственно после слова SUBROUTINE в заголовке подпрограммы или непосредственно после слова CALL в операторе вызова подпрограммы.
Внутренняя функция. Символическое имя принадлежит классу III в некотором программном модуле, если оно:
не принадлежит классу I и не встречается в объявлении внешних имен;
за каждым его вхождением, кроме вхождения в объявление типа, непосредственно следует левая скобка;
в рассматриваемом модуле имеется объявление внутренней функции (п. 8.1.1) с этим именем.
Встроенная функция. Символическое имя принадлежит классу IV в некотором программном модуле, если оно:
не принадлежит ни классу 1, ни классу III и не встречается в объявлении внешних имен;
встречается в колонке имен табл. 3;
не встречается в объявлении типа, который отличается от встроенного типа, определяемого этой таблицей;
за каждым его вхождением (кроме разрешенного выше вхождения в объявление типа) непосредственно следует левая скобка.
Употребление встроенной функции в некотором программном модуле не запрещает использования этого же символического имени для обозначения какого-либо другого объекта в другом программном модуле той же выполнимой программы.
Внешняя функция. Символическое имя принадлежит классу V, если оно:
встречается непосредственно после слова FUNCTION в заголовке функции;
не принадлежит ни одному из классов I, III, IV или VI и имеется хотя бы одно его вхождение, непосредственно за которым следует левая скобка. Левая скобка должна непосредственно следовать за каждым его вхождением, кроме вхождений в объявления типа и внешних имен или в качестве фактического параметра.
(Измененная редакция, Изм. № 1).
Переменная. В программном модуле символическое имя принадлежит классу II, если оно:
не принадлежит ни классу VI, ни классу VII, ни классу VIII;
за ним никогда непосредственно не следует левая скобка, если только это имя не следует непосредственно за словом FUNCTION в заголовке функции.
Имя блока. Символическое имя принадлежит классу VIII, если оно используется в качестве имени блока в объявлении общих блоков.
10.2. Понятие определения. Для числовых величин существует два уровня определения — первый и второй. Понятие определения на первом уровне применимо к любым элементам массивов и переменным; понятие определения на втором уровне — только к переменным типа целый. Для объяснения смысла этих понятий необходимо рассмотреть выполнимую программу в процессе ее выполнения.
Необходимо отметить, что существуют два других способа определения. Первый из них осуществляется оператором предписания для переменной типа целый, но определяет значение типа отличного от целого — он рассмотрен в пп. 7.1.1.3 и 7.1.2.1.2; второй способ, позволяющий ссылаться на внешнюю процедуру, будет рассмотрен в п. 10.2.1.
В дальнейшем, говоря об определении и неопределении применительно к переменным и элементам массивов, мы всегда будем подразумевать первый уровень определения.
Определение процедур. Если выполнимая программа содержит информацию, описывающую внешнюю процедуру, то такая внешняя процедура с соответствующим символическим именем определена для использования в этой выполнимой программе. Ссылка на внешнюю функцию или ссылка на подпрограмму (выбирается подходящий случай) с этим символическим именем может встречаться в выполнимой программе, если число параметров в определении и ссылке совпадает. Кроме того, тип внешней функции в определении и ссылке также должен совпадать. Остальные ограничения содержатся в пп. 8.3.1, 8.3.2, 8.4.1, 8.4.2, 10.1.3 и 10.1.4.
Основные внешние функции, перечисленные в п. 8.3.3, определены всегда и на них можно ссылаться при условии выполнения ограничений, указанных выше.
Для указанного использования определено символическое имя из класса III или IV.
Связи, обеспечивающие определение. Объекты могут стать связанными посредством:
связи через общие блоки;
связи через эквивалентность;
подстановки параметров.
В результате упомянутых комбинаций может возникнуть множественная связь с одним или несколькими объектами. Любое определение или неопределение одного из элементов множества связанных элементов вызывает определение или неопределение всех элементов этого множества.
С точки зрения определения в любом программном модуле между двумя объектами, каждый из которых встречается в объявлении общих объектов, не существует никакой связи. Кроме того, для общих и эквивалентных объектов не существует никакой связи, кроме установленной в пп. 7.2.1.3.1 и 7.2.1.4.
Если фактический параметр при ссылке на внешнюю процедуру является именем массива, именем элемента массива, или именем переменной, то в соответствии с пп. 10.1.3 и 10.2.1 связь формальных параметров с фактическими определена лишь на время от начала выполнения первого оператора этой процедуры и до начала выполнения первого встреченного оператора возврата этой процедуры. Заметим особо, что эта связь может передаваться более чем через один уровень ссылок на внешние процедуры.
В дальнейшем переменные и элементы массивов, связанные на основании пп. 7.2.1.3.1 и 7.2.1.4, будут считаться эквивалентными только при условии совпадения типов.