Операторы отбора
Существует три формы операторов отбора. Одна форма обеспечивает отбор с ожиданием одной или нескольких альтернатив. Две другие обеспечивают условный и временной вызовы входа.
оператор-отбора ::= отбор-с-ожиданием | условный-вызов-входа | временной-вызов-входа
Ссылки:
временной вызов входа 9.7.3, отбор с ожиданием 9.7.1, условный вызов входа 9.7.2.
9.7.1. ОТБОР С ОЖИДАНИЕМ
Эта форма оператора отбора допускает объединение ожидания и отбор с ожиданием одной или нескольких альтернатив. Отбор может зависеть от условий, связанных с каждой альтернативой отбора с ожиданием.
отбор-с-ожиданием ::= select
альтернатива-отбора {or
альтернатива-отбора) [else
последовательность-операторов] end select;
альтернатива-отбора ::= [when условие = >] альтернатива-отбора-с-ожиданием
альтернатива-отбора-с-ожиданием ::= альтернатива-принятия | альтернатива-задержки | альтернатива-завершения
альтернатива-принятия ::= оператор-принятия [последовательность-операторов]
альтернатива-задержки ::= оператор-задержки [последовательность - операторов]
альтернатива-завершения ::= terminate;
Оператор отбора с ожиданием должен содержать по крайней мере одну альтернативу принятия. В дополнение к этому оператор отбора с ожиданием может содержать либо альтернативу завершения (только одну), либо одну или несколько альтернатив задержки, либо раздел
else;
эти три возможности являются взаимоисключающими.
Альтернатива отбора называется
открытой,
если она, не начинается с зарезервированного слова
when
или если значение условия — TRUE. В противном случае альтернатива называется
закрытой.
При выполнении оператора отбора с ожиданием в произвольном, не определенном в языке порядке вычисляются все условия, заданные после зарезервированного слова
when;
определяются открытые альтернативы. Для открытой альтернативы задержки вычисляется выражение длительности задержки. Для открытой альтернативы принятия входа семейства вычисляется индекс входа. Выполнение отбора с ожиданием заканчивается отбором и вычислением либо одной из открытых альтернатив, либо раздела else; правила такого отбора описываются ниже.
Первыми рассматриваются открытые альтернативы. Отбор одной из таких альтернатив производится немедленно, если возможно соответствующее рандеву, т.е. если другая задача произвела вызов соответствующего входа и ожидает его принятия. Если таким образом могут быть отобраны несколько альтернатив, то одна из них выбирается произвольно (которая именно, в языке не определено). После отбора такой альтернативы выполняются соответствующий оператор принятия и следующая за ним последовательность операторов (если она есть). Если никакое рандеву не может произойти немедленно и отсутствует раздел else, то задача ждет, пока можно будет выбрать открытую альтернативу отбора с ожиданием.
Отбор других форм альтернатив или раздела else осуществляется следующим образом.
' Отбирается открытая альтернатива задержки, если никакая другая альтернатива принятия не может быть выбрана до истечения указанной задержки ожидания (немедленно, если длительность отрицательная или нулевая и при отсутствии очереди вызовов входа); затем выполняются возможные последующие операторы этой альтернативы. Если возможен отбор нескольких альтернатив задержки (т.е. если задержки у них одинаковы), то одна из них выбирается произвольно.
• Отбирается раздел else и выполняется последовательность операторов этого раздела, если нельзя немедленно отобрать альтернативу принятия, в частности если все альтернативы закрыты.
•Отбирается открытая альтернатива завершения, если перечисленные в разд. 9.4 условия удовлетворены. Из других правил следует, что нельзя отобрать альтернативу завершения, пока существует очередь вызовов 'любого входа задачи.
Исключение PROGRAM_ERROR возбуждается, если все альтернативы закрыты и раздел else отсутствует.
Пример оператора отбора:
select
accept DRIVER_AWAKE_SIGNAL; or
delay 30.0*SECONDS; STOP_THE_TRAIN; end select;
Пример тела задачи с оператором отбора:
task body RESOURCE is
BUSY : BOOLEAN := FALSE; begin
loop
select
when not BUSY=> accept SEIZE do
BUSY := TRUE; end:
or
accept RELEASE do
BUSY := FALSE; end;
or
terminate;
end select;
end loop;
end RESOURCE;
Примечание. В
отборе с ожиданием допускаются несколько открытых альтернатив задержки или несколько открытых альтернатив принятия одного и того же входа.
Ссылки:
вход 9.5, вызов входа 9.5, выражение задержки 9.6, длительность 9.6, задача 9, индекс входа 9.5, исключение PROGRAM_ERROR 11.1, оператор задержки 9.6, оператор отбора 9.7, оператор принятия 9.5, описание 3.1, очередь вызовов входа 9.5, последовательность операторов 5.1, рандеву 9.5, условие 5.3.
Пред. | Уровень выше | След. |
9.6. ОПЕРАТОРЫ ЗАДЕРЖКИ, ДЛИТЕЛЬНОСТЬ И ВРЕМЯ |
Содержание | 9.7.2. УСЛОВНЫЕ ВЫЗОВЫ ВХОДОВ |
Операторы перехода
Оператор перехода определяет явную передачу управления на помеченный меткой оператор.
оператор перехода ::= goto имя-метки;
Самая вложенная последовательность .операторов, объемлющая помеченный меткой оператор, должна также охватывать и оператор перехода на эту метку (в частности, оператор перехода может входить в еще более вложенную последовательность операторов). Кроме того, если оператор перехода содержится в операторе принятия или теле программного модуля, то соответствующий помеченный оператор не должен быть вне этой конструкции, и, наоборот (как следует из предыдущего правила), если помеченный оператор содержится в такой конструкции, то оператор перехода не может быть вне ее.
Выполнение оператора перехода заключается в передаче управления на помеченный соответствующей меткой оператор.
Примечание.
Приведенные выше правила допускают передачу управления на оператор из некоторой объемлющей последовательности операторов, но не наоборот. Аналогично они запрещают передачу управления между альтернативами оператора выбора, условного оператора или оператора отбора, между обработчиками исключений или из обработчика исключения некоторого окружения обратно на последовательность операторов этого окружения.
Пример:
<<COMPARE>> if A(l) < ELEMENT then if LEFT(I) /= 0 then
I := LEFT(t); goto COMPARE; end if;
-- некоторые операторы end if;
Ссылки:
метка 5.1, настраиваемое тело 12.1, обработчик исключения 11.2, окружение 11.2, оператор 5.1, оператор блока 5.6, оператор выбора 5.4, оператор отбора 9.7, оператор принятия 9.5, передача управления 5.1, последовательность операторов 5.1, программный модуль 6, составной оператор 5.1, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, условный оператор 5.3.
Пред. | Уровень выше | След. | |
5.8. ОПЕРАТОРЫ ВОЗВРАТА
|
Содержание | Глава 6.
ПОДПРОГРАММЫ |
Операторы прекращения
Оператор прекращения переводит одну или несколько задач в
аварийное
состояние, предотвращая любые дальнейшие рандеву с такими задачами.
оператор-прекращения ::= abort имя-задачи {, имя-задачи};
При определении типа имени каждой задачи используется тот факт, что это задачный тип.
При выполнении оператора прекращения заданные имена задач вычисляются в порядке, который в языке не определен. Затем каждая упомянутая задача становится аварийной, если она еще не завершена; аналогично любая зависящая от упомянутой задача становится также аварийной, если она еще не завершена.
Любая аварийная задача, выполнение которой приостановлено операторами принятия, отбора или задержки, становится законченной. Любая аварийная задача, выполнение которой приостановлено при вызове входа, а соответствующее рандеву еше не началось, становится законченной и удаляется из очереди к входу. Любая аварийная задача, которая не начала свою активизацию, становится законченной (и, следовательно, завершенной). Этим заканчивается выполнение оператора прекращения.
Окончание любой другой аварийной задачи не производится до окончания выполнения оператора прекращения. Оно должно произойти не позднее достижения аварийной задачей точки синхронизации, которой может быть конец ее активизации, начало активизации другой задачи, вызов входа, начало или конец выполнения оператора принятия, оператор отбора, оператор задержки, обработчик исключения или оператор прекращения. Если задача, вызвавшая вход, становится аварийной в ходе рандеву, то ее завершение не производится до окончания рандеву (см. 11.5).
Вызов входа аварийной задачи возбуждает в месте вызова исключение TASKING_ERROR. Аналогично исключение TASKING_ERROR возбуждается в любой задаче, вызвавшей вход аварийной задачи, если вызов входа все еще находится в очереди либо рандеву не окончено (вызовом входа может быть либо оператор вызова входа, либо операторы условного или временного вызова входа); исключение возбуждается не позже окончания аварийной задачи.
Для любой аварийной ( или законченной) задачи значение атрибута CALLABLE есть FALSE.
Если аварийное окончание задачи произошло во время изменения в задаче некоторой переменной, то значение этой переменной не определено.
Пример:
abort USER, TERMINAL.all, POOL(3);
Примечание.
Оператор прекращения следует использовать только в крайних случаях, требующих безусловного завершения. Допускается, что задача может прекратить любую задачу, включая себя самое.
Ссылки:
аварийное состояние при рандеву 11.5, активизация 9.3, атрибут 4.1.4, атрибут CALLABLE 9.9, временной вызов входа 9.7.3, завершенная задача 9.4, зависимая задача 9.4, задача 9, значение логического типа FALSE 3.5.3, имя 4.1, исключение TASKING_ERROR 11.1, обработка имени 4.1, обработчик исключения 11.2, оператор 5, оператор вызова входа 9.5, оператор задержки 9.6, оператор отбора 9.7, оператор принятия 9.5, очередь вызовов входов 9.5, рандеву 9.5, условный вызов входа 9.7.2.
Пред. | Уровень выше | След. |
9.9. АТРИБУТЫ ЗАДАЧ И ВХОДОВ |
Содержание | 9.11. РАЗДЕЛЯЕМЫЕ ПЕРЕМЕННЫЕ |
Операторы присваивания
Оператор присваивания заменяет текущее значение переменной новым значением, задаваемым выражением. Переменная в левой части оператора присваивания и выражение в его правой части должны быть одного и того же типа, однако он не должен быть лимитируемым.
оператор-присваивания ::= имя-переменной := выражение;
При выполнении оператора присваивания вначале вычисляются имя переменной и выражение в порядке, не определенном в языке. Затем, если переменная не является массивом, проверяется принадлежность значения выражения подтипу переменной (если же переменная — массив, то при присваивании производится преобразование подтипа, как описано в разд. 5.2.1). Наконец, значение выражения становится новым значением переменной.
При отрицательном результате упомянутой выше проверки принадлежности подтипу возбуждается исключение CONSTRAINT_ERROR, а текущее значение переменной не изменяется. Выполнение присваивания ошибочно, если переменная является подкомпонентой, зависящей от дискриминантов неограниченной именуемой переменной, и при этом выполнении изменяется значение любого из упомянутых дискриминантов.
Примеры:
VALUE := MAX_VALUE - 1; SHADE := BLUE;
NEXT_FRAME(F)(M, N) := 2.5; --CM. 4.1.1 U := DOT_PRODUCT(V, W); -- CM. 6.5
WRITER := (STATUS => OPEN, UNIT => PRINTER, LINE_COUNT => 60); -- CM. 3.7.3 NEXT_CAR.all := (72074, null); -- CM. 3.8.1
Примеры проверок ограничений:
I,J : INTEGER range 1 ..10; К : INTEGER range 1 ..20;
I := J; --одинаковые диапазоны К := J; -- совместимые диапазоны J := К; -- при К<10 возбудится исключение CONSTRAINT_ERROR
Примечание.
Значения дискриминантов объекта, указанного ссылочным значением, не могут быть изменены (даже присваиванием составного значения всему объекту), поскольку такие объекты, созданные генераторами, всегда являются ограниченными (см. 4.8); подкомпоненты таких объектов могут и не быть ограниченными.
Если выражение в правой части является числовым литералом, именованным числом или атрибутом, вырабатывающим результат типа
универсальный-целый
или
универсальный-вещественный,
то производится неявное преобразование типа, описанное в разд. 4.6.
Определение типа переменной в левой части оператора присваивания может потребовать рассмотрения выражения, если имя переменной может интерпретироваться как имя переменной, указанной ссылочным значением, возвращаемым вызовом функции, а также как компонента или отрезок такой переменной (см. разд. 8.7 о контексте разрешения совмещения).
Ссылки:
вызов функции 6.4, выражение 4.4, вычисление 4.5, генератор 4.8, дискриминант 3.7.1, имя 4.1, исключение CONSTRAINT_ERROR 11.1, компонента 3.6, 3.7, массив 3.6, неявное преобразование типа 4.6, объект 3.2, отрезок 4.1.2, ошибочный 1.6, переменная 3.2.1, подкомпонента 3.3, подтип 3.3, преобразование подтипа 4.6, присваивание массива 5.2.1, совмещение 6.6, 8.7, ссылочный тип 3.8, тип 3.3, указывать 3.8, универсальный-вещественный тип 3.5.6, универсальный-целый тип 3.5.4, числовой литерал 2.4.
5.2.1. ПРИСВАИВАНИЯ МАССИВОВ
Если переменная в левой части оператора присваивания является индексируемой (в частности, отрезком), значение выражения неявно преобразуется в значение подтипа индексируемой переменной, после чего результат преобразования становится новым значением переменной.
Это значит, что новое значение каждой компоненты индексируемой переменной задается сопоставляемой ей компонентой индексируемого значения, полученного при вычислении выражения (см. определение сопоставляемых компонент в 4.5.2). При преобразовании подтипа для каждой компоненты индексируемой переменной проверяется наличие сопоставляемой компоненты индексируемого значения, и наоборот. При отрицательном результате этой проверки возбуждается исключение CONSTRAINT_ERROR, а значение каждой компоненты переменной не изменяется.
Примеры:
А : STRING(1 .. 31); В : STRING(3 .. 33); ... А := B; — одинаковое количество компонент
А(1 .. 9) := "tar sauce"; А(4 .. 12) := A(1 .. 9); -- А(1 .. 12) = "tartar Sauce"
Примечание.
Присваивание массива определено даже в случае перекрывающихся отрезков, поскольку выражение в правой части вычисляется До присваивания компонент. Так, в случае последнего из приведенных примеров реализация, вырабатывающая А(1 .. 12) = = "tartartartar", была бы некорректной^.
Описанное выше явное преобразование подтипа выполняется только на уровне значения всего выражения правой части, но не для его подкомпонент, являющихся индексируемыми значениями.
Ссылки:
исключение CONSTRAINT_ERROR 11.1, массив 3.6, отрезок 4.1.2, переменная 3.2.1, преобразование подтипа 4.6, присваивание 5.2, сопоставляемые индексируемые компоненты 4.5.2, тип 3.3.
1) Покомпонентная пересылка недопустима. —
Прим. ред.
Пред. | Уровень выше | След. |
Глава 5. ОПЕРАТОРЫ |
Содержание | 5.3. УСЛОВНЫЕ ОПЕРАТОРЫ |
Операторы возбуждения
Оператор возбуждения возбуждает исключение.
оператор-возбуждения ::= raise [имя-исключения];
При выполнении оператора возбуждения с именем исключения возбуждается заданное исключение. Оператор возбуждения без имени исключения допустим только внутри обработчика исключения (но не в последовательности операторов подпрограммы, пакета, задачного модуля или настраиваемого модуля, вложенных в данный обработчик); он снова возбуждает то же исключение, которое вызвало переход на обработчик, содержащий данный оператор возбуждения.
Примеры:
raise SINGULAR;
raise NUMERIC_ERROR; -- явно возбуждается предопределенное исключение raise; -— только внутри обработчика исключения
Ссылки: задачный модуль 9, имя 4.1, исключение 11, настраиваемый модуль 12, пакет 7, подпрограмма 5.1, последовательность операторов 5.1.
Пред. | Уровень выше | След. | |
11.2. ОБРАБОТЧИКИ ИСКЛЮЧЕНИЙ
|
Содержание |
11.4. ОБРАБОТКА ИСКЛЮЧЕНИЙ |
Операторы возврата
Оператор возврата используется для окончания выполнения самой внутренней объемлющей конструкции, которая может быть функцией, процедурой или оператором принятия.
оператор-возврата ::=
return
[выражение];
Оператор возврата допустим только в теле подпрограммы или настраиваемой подпрограммы или в операторе принятия и применяется к самой внутренней (объемлющей его) такой конструкции; оператор возврата недопустим в теле модуля-задачи, пакета или настраиваемого пакета, объемлемого одной из указанных конструкций (с другой стороны, он допустим в составном операторе, вложенном в такую конструкцию, и в частности в операторе блока).
Оператор возврата в операторе принятия, в теле процедуры или настраиваемой процедуры не должен содержать выражения. Оператор возврата в теле функции или настраиваемой функции должен содержать выражение.
Значение выражения определяет результат, возвращаемый функцией. Тип этого выражения должен быть базовым для обозначения типа, приводимого после зарезервированного слова
return
в спецификации функции или настраиваемой функции (это обозначение типа определяет подтип результата).
Для выполнения оператора возврата сначала вычисляется выражение (при его наличии) и проверяется принадлежность его значения подтипу результата. При положительном итоге проверки заканчивается вычисление оператора возврата и одновременно подпрограммы или оператора принятия, при отрицательном — в месте оператора возврата возбуждается исключение CONSTRAINT_ERROR.
Примеры:
return; -- в процедуре return KEY_VALUE(LAST_INDEX); -- в функции
Примечание.
Если выражение является числовым литералом, именованным числом или атрибутом, который вырабатывает результат типа
универсальный-целый
или
универсальный-вещественный,
то выполняется неявное преобразование результата, как описано в разд. 4.6.
Ссыпки:
атрибут А, вызов функции 6.4, выражение 4.4, именованное число 3.2, зарезервированное слово 2.9, исключение CONSTRAINT_ERROR 11.1, модуль-задача 9.1, настраиваемое тело 12.1, неявное преобразование типа 4.6, обозначение типа 3.3.2, оператор блока 5.6, оператор принятия 9.5, подтип 3.3, подтип результата 6.1, спецификация подпрограммы 6.1, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, тело процедуры 6.3, тело функции 6.3, универсальный вещественный тип 3.5.6, универсальный целый тип 3.5.4, числовой литерал 2.4.
Пред. | Уровень выше | След. | |
5.7. ОПЕРАТОРЫ ВЫХОДА
|
Содержание |
5.9. ОПЕРАТОРЫ ПЕРЕХОДА |
Операторы выбора
Оператор выбора выбирает для выполнения одну из нескольких альтернативных последовательностей операторов; выбор альтернативы осуществляется в зависимости от значения выражения.
оператор-выбора ::= case выражение is
альтернатива-оператора-выбора {альтернатива - оператора - выбора} end case;
альтернатива-оператора-выбора :: = when выбор { | выбор } => последовательность-операторов
Выражение должно быть дискретного типа, который должен быть определимым независимо от контекста выражения, но с учетом того факта, что тип выражения должен быть дискретным. Более того, тип этого выражения не должен быть настраиваемым формальным ти-
пом. Каждый выбор в альтернативе оператора выбора должен быть того же типа, что и выражение; перечень выборов определяет, для каких значений выражения выбирается соответствующая альтернатива.
Если выражение является именем объекта статического подтипа, то каждое значение этого подтипа должно быть представлено один и только один раз в наборе выборов оператора выбора и никакие другие значения недопустимы; это правило применяется также, если выражение является квалифицированным выражением или преобразованием типа, обозначение типа которого указывает статический подтип. В остальных случаях, для других форм выражения, каждое значение (базового) типа выражения должно быть представлено только один раз в наборе выборов и никакие другие значения недопустимы.
Используемые в качестве выборов в операторе выбора простые выражения и дискретные диапазоны должны быть статическими. Выбор, являющийся дискретным диапазоном, задает все значения из этого диапазона (ни одного значения в случае пустого диапазона). Выбор
others
допустим только в качестве единственного выбора для последней альтернативы и задает все значения (возможно, и ни одного), не приведенные в выборах предыдущих альтернатив. В качестве выбора в альтернативе оператора выбора не допускается использование простого имени компоненты.
Выполнение оператора выбора заключается в вычислении выражения, в выборе последовательности операторов и в выполнении выбранной последовательности операторов.
Примеры:
case SENSOR is when ELEVATION => RECORDELEVATION (SENSOR-VALUE); when AZIMUTH => RECORD.AZIMUTH (SENSOR-VALUE); when DISTANCE => RECORD-DISTANCE (SENSOR-VALUE); when others => null; end case;
case TODAY is when MON => COMPUTE-INITIAL-BALANCE;
when FRI => COMPUTE-CLOSING-BALANCE;
when TUE .. THU => GENERATEREPORT(T-ODAY);
when SAT .. SUN => null; end case;
case BIN_NUMBER(COUNT) is when 1 => UPDATE_BIN(1);
when 2 => UPDATE_BIN(2);
when 3 | 4 => EMPTY_BIN(1); EMPTY_BIN(2);
when others => raise ERROR;
end case;
Примечание.
При выполнении оператора выбора выбирается одна и только одна альтернатива, так как выборы являются исчерпывающими и взаимно исключающими. Квалификацией выражения в операторе выбора статическим подтипом можно ограничить количество выборов, которые необходимо указать явно.
Выбор
others
обязателен в операторе выбора, если выражение имеет тип
универсальный-целый
(например, выражение является целым литералом), так как это единственный способ учесть все значения типа
универсальный-целый.
Ссылки:
базовый тип 3.3, выбор 3.7.3, вызов функции 6.4, выражение 4.4, дискретный тип 3.5, имя 4.1, квалифицированное выражение 4.7, контекст разрешения совмещения 8.7, литерал перечисления 3.5.1, обозначение типа 3.3.2, объект 3.2.1, последовательность операторов 5.1, преобразование 4.6, преобразование типа 4.6, подтип 3.3, совмещение 6.6, 8.7, статический дискретный диапазон 4.9, статический подтип 4.9, тип 3.3, формальный тип настройки 12.1.
Пред. | Уровень выше | След. |
5.3. УСЛОВНЫЕ ОПЕРАТОРЫ |
Содержание | 5.5. ОПЕРАТОРЫ ЦИКЛА |
Операторы выхода
Оператор выхода используется для окончания выполнения объемлющего оператора цикла (называемого в дальнейшем просто циклом); окончание может быть условным, если оператор выхода содержит условие.
оператор-выхода ::= exit [ имя-цикла][ when условие];
Оператор выхода с именем цикла допустим только в именованном цикле и приманив юя к этому циклу; оператор выхода без имени цикла допускается в некотором цикле и применяется к самому внутреннему объемлющему циклу (именованному или нет). Кроме этого, применяемый к конкретному циклу оператор выхода не должен появляться в теле подпрограммы, теле пакета, теле задачи, в настраиваемом теле или в операторе принятия, если эта конструкция вложена в рассматриваемый цикл.
Для выполнения оператора выхода сначала вычисляется условие, если оно есть. Выход из цикла происходит, если значением условия является TRUE или условие отсутствует.
Примеры:
for N in 1 .. MAXJMUMJTEMS loop
GET_NEW_ITEM(NEW_ITEM); MERGE_ITEM(NEW_ITEM, STORAGE_FILE); exit when NEW_ITEM = TERMINAL_ITEM; end loop;
MAIN_CYCLE: loop
-- начальные операторы
exit MAINCYCLE when FOUND; -- заключительные операторы
end loop MAINCYCLE;
Примечание.
Выход из нескольких вложенных циклов можно осуществить с помощью оператора выхода с именем внешнего цикла.
Ссылки:
вычисление 4.5, имя цикла 5.5, логическое значение 3.5.3, настраиваемое тело 12.1, оператор принятия 9.5, оператор цикла 5.5, тело пакета 7.1, тело подпрограммы 6.3, условие 5.3.
Пред. | Уровень выше | След. | |
5.6. ОПЕРАТОРЫ БЛОКА
|
Содержание |
5.8. ОПЕРАТОРЫ ВОЗВРАТА |
Операторы задержки, длительность и время
Выполнение оператора задержки вычисляет простое выражение и приостанавливает дальнейшее выполнение задачи, содержащей данный оператор задержки, по крайней мере на длительность, заданную вычисленным значением.
оператор-задержки ::= delay простое-выражение;
Простое выражение должно быть предопределенного фиксированного типа DURATION (ДЛИТЕЛЬНОСТЬ); его значение выражается в секундах; оператор задержки с отрицательным значением эквивалентен оператору задержки с нулевым значением.
Все реализации типа DURATION должны допускать представление длительности (положительные и отрицательные) по крайней мере до 86 400 с (одни сутки); минимальная представи-мая длительность, DURATION'SMALL, должна быть не больше 20 мс (по возможности значение не превышает 50 мкс. Заметим, что DURATION'SMALL не обязано соответствовать основному циклу таймера, именованному числу SYSTEM.TICK (см. 13.7).
Определение типа TIME приведено в предопределенном пакете CALENDAR. Функция CLOCK возвращает текущее значение типа TIME. Функции YEAR, MONTH, DAY и SECONDS возвращают соответствующие наименованиям значения для заданного значения аргумента типа TIME, а процедура SPLIT возвращает одновременно все четыре соответствующих значения. Наоборот, функция TIME-OF упаковывает номера года, месяца, числа дня и значение длительности в значение типа TIME. В операции " + " и " -" для сложения и вычитания значений времени и длительности, а также в операции соотношения для значений времени вкладывают традиционный смысл.
Исключение TIME_ERROR возбуждается в функции TIME-OF, если значения фактических параметров не формируют правильную дату. Это исключение возбуждается также операциями "+" и "-", если для заданных операндов они не могут возвратить дату с номером года из диапазона соответствующего подтипа или если операция " -" не может возвратить значение из диапазона типа DURATION.
package CALENDAR is
type TIME is private;
subtype YEAR_NUMBER is INTEGER range 1901 .. 2099; subtype MONTH_NUMBER is INTEGER range 1 .. 12; subtype DAY_NUMBER is INTEGER range 1 .. 31; subtype DAY_DURATION is DURATION range 0.0 .. 86_400.0;
function CLOCK return TIME; function YEAR (DATE : TIME) return YEAR_NUMBER; function MONTH (DATE : TIME) return MONTH_NUMBER; function DAY (DATE : TIME) return DAY_NUMBER; function SECONDS (DATE : TIME) return DAY_DURATION;
procedure SPLIT (DATE : in TIME; YEAR : out YEAR-NUMBER; MONTH : out MONTH-NUMBER; DAY : out DAY-NUMBER; SECONDS : out DAY_DURATION);
function TIME_OF(YEAR : YEAR_NUMBER; MONTH : MONTH_NUMBER; DAY : DAY_NUMBER; SECONDS : DAY_DURATION := 0.0) return TIME;
function "+" (LEFT : TIME; RIGHT : DURATION) return TIME; function "+" (LEFT : DURATION; RIGHT : TIME) return TIME; function "-" (LEFT : TIME; RIGHT : DURATION) return TIME; function "-" (LEFT : TIME; RIGHT : TIME) return DURATION;
function "<" (LEFT, RIGHT TIME) return BOOLEAN; function "<=" (LEFT, RIGHT TIME) return BOOLEAN; function ">" (LEFT, RIGHT TIME) return BOOLEAN; function ">=" (LEFT, RIGHT TIME) return BOOLEAN;
TIME_ERROR : exception; -— может быть возбуждено функцией и операциями "+" и "-"
private
-— зависит от реализации end;
Примеры:
delay 3.0; -— задержка на 3.0 с declare
use CALENDAR; -— INTERVAL глобальная константа типа DURATION NEXT_TIME : TIME := CLOCK + INTERVAL; begin
loop
delay NEXT_TIME - CLOCK; -— некоторые действия NEXT_TIME := NEXT_TIME + INTERVAL; end loop;
end:
Примечание.
Во втором примере цикл повторяется в среднем один раз каждые
INTERVAL
секунд. Этот интервал между двумя последовательными итерациями только приблизителен. Однако здесь не произойдет ошибки по длительности, поскольку длительность каждой итера-ции (существенно) меньше значения INTERVAL.
Ссылки:
библиотечный модуль 10.1, вызов функции 6.4, длительность С, задача 9, личный тип 7.4, оператор 5, операция 4.5, операция отношения 4.5, операция сложения 4.5, пакет 7, простое выражение 4.4, тип 3.3, фиксированный тип 3.5.9.
Пред. | Уровень выше | След. |
9.5. ВХОДЫ, ВЫЗОВЫ ВХОДОВ И ОПЕРАТОРЫ ПРИНЯТИЯ |
Содержание | 9.7. ОПЕРАТОРЫ ОТБОРА |
Описание настройки
Описание настройки задает настраиваемый модуль — настраиваемую подпрограмму или настраиваемый пакет. Описание настройки включает раздел формальных параметров настройки, в котором описываются ее формальные параметры. Формальный параметр настройки может быть объектом; кроме того (в отличие от параметра подпрограммы), он может быть типом или подпрограммой.
описание-настройки ::= спецификация-настройки; спецификация-настройки ::= раздел-формальных-параметров-настройки спецификация-подпрограммы | раздел-формальных-параметров-настройки спецификация-пакета
раздел-формальных-параметров-настройки :: = generic {описание-параметра-настройки}
описание параметра-настройки ::= список-идентификаторов :[in [out]] обозначение-типа [:= выражение]; | type идентификатор is определение-настраиваемого-типа; | описание-личного-типа | with спецификация-подпрограммы [is имя]; [ with спецификация-подпрограммы [is <>];
определение*-настраиваемого-типа ::= (<>) | range <> | digits <> | delta <> | определение-индексируемого-типа | определение-ссылочного-типа
Для ссылки на соответствующие формальные параметры настройки используются такие термины: формальный объект настройки (или, короче,
формальный объект},
формальный тип настройки (или, короче,
формальный тип)
и формальная подпрограмма настройки (или, короче,
формальная подпрограмма}.
В разделе формальных параметров настройки указание подтипа допустимо только в виде обозначения типа (т.е. такое указание подтипа не должно содержать явного ограничения). Обозначение настраиваемой подпрограммы должно быть задано идентификатором.
Имя программного модуля, являющегося настраиваемым модулем, вне его спецификации и тела обозначает этот настраиваемый модуль. В отличие от этого в зоне описания, связанной с настраиваемой подпрограммой, имя такого программного модуля обозначает подпрограмму, полученную при текущей конкретизации настраиваемого модуля. Аналогично в зоне описания, связанной с настраиваемым пакетом, имя программного модуля обозначает пакет, полученный при текущей конкретизации.
Предвыполнение описания настройки не имеет другого эффекта.
Примеры разделов формальных параметров:
generic -- без параметров
generic
SIZE : NATURAL; -— формальный объект
generic
LENGTH : INTEGER := 200; -— формальный объект с выражением по умолчанию AREA : INTEGER := LENGTH*LENGTH; -— формальный объект с выражением по умолчанию
generic
type ITEM is private; -- формальный тип type INDEX is (<>); -— формальный тип type ROW is array (INDEX range <>) of ITEM; -— формальный тип with function "<"(X, Y : ITEM) return BOOLEAN; -— формальная подпрограмма
Примеры описаний настройки с настраиваемыми подпрограммами:
generic
type ELEM is private;
procedure EXCHANGE (U, V : in out ELEM);
generic
type ITEM is private;
with function "*"(U, V : ITEM) return ITEM is <>; function SQUARING(X : ITEM) return ITEM;
Пример описания настройки с настраиваемым пакетом:
generic
type ITEM is private;
type VECTOR is array (POSITIVE range <>) of ITEM; with function SUM(X, Y : ITEM) return ITEM; package ON_VECTORS is
function SUM (А. В : VECTOR) return VECTOR; function SIGMA (A : VECTOR) return ITEM; LENGTH_ERROR : exception;
end;
Примечание.
Внутри тела настраиваемой подпрограммы ее имя рассматривается как имя подпрограммы. Следовательно, это имя может быть совмещено, а также может появиться в рекурсивном вызове текущей конкретизации. По этой же причине его нельзя использовать после зарезервированного слова
new
в (рекурсивной) конкретизации настройки.
Выражение, которое находится в разделе формальных параметров настройки, — это выражение по умолчанию для формального параметра вида
in,
либо составная часть имени входа, заданного как имя по умолчанию для формальной подпрограммы, либо выражение по умолчанию для параметра формальной подпрограммы. В первых двух случаях значение этого выражения вычисляется только в тех конкретизациях, в которых используется соответствующее умолчание.
В третьем случае значение выражения вычисляется только в вызовах формальных подпрограмм, использующих такое умолчание. (К любому имени, используемому в выражении по умолчанию, применяются обычные правила видимости: обозначенные этим именем понятия должны быть видимы в том месте, где стоит выражение.)
Ни формальные параметры настройки, ни их атрибуты в качестве частей статических выражений недопустимы (см. 4.9).
Ссылки:
атрибут 4.1.4, выражение 4.4, зарезервированное слово 2.9, идентификатор 2.3, имя 4.1, конкретизация настройки 12.3, обозначение 6.1, обозначение типа 3.3.2, объект 3.2, ограничение 3.3, описание 3.1, определение индексируемого типа 3.6, определение личного типа 7.4, определение ссылочного типа 3,8, параметр подпрограммы 6.2, подпрограмма 6, понятие 3.1, процедура 6.1, предвыполнение не имеет другого эффекта 3.1, совмещение 6.6, 8.7, спецификация пакета 7.1, спецификация подпрограммы 6.1, список идентификаторов 3.2, статическое выражение 4.9, тип 3.3, указание подтипа 3.3.2, функция 6.5, экземпляр 12.3.
12.1.1. ФОРМАЛЬНЫЕ ОБЪЕКТЫ НАСТРОЙКИ
Первая форма описания формального параметра настройки задает формальные объекты настройки. Тип формального объекта настройки — это базовый тип обозначения типа, данного в описании формального параметра настройки. Описание формального параметра настройки с несколькими идентификаторами эквивалентно последовательности единичных описаний, как поясняется в разд. 3.2.
Формальный объект настройки имеет вид
in
или
in out.
При отсутствии в описании формального параметра настройки явного указания вида подразумевается вид
in.
Если описание формального параметра настройки задано выражением, то оно является
выражением по умолчанию
для этого формального параметра. Выражение по умолчанию допустимо только для параметров вида
in
(указанного либо явно, либо неявно). Тип выражения по умолчанию должен быть таким же, как и у соответствующего формального параметра настройки.
Формальный объект настройки вида
in
— это константа, значение которой является копией значения сопоставленного ему фактического параметра конкретизации настройки, как описано в разд. 12.3. Тип формального объекта настройки вида
in
не должен быть лимитируемым типом; подтип 'такого формального объекта настройки — это подтип в обозначении типа, данного в описании параметра настройки.
Формальный объект настройки вида in
out
— это переменная, обозначающая объект, задаваемый в конкретизации настройки фактическим параметром настройки, как описано в разд. 12.3. Ограничения, применяемые к формальному объекту настройки, те же, что и для соответствующего фактического параметра.
Примечание.
Ограничения, применяемые к формальному объекту настройки вида
in out,
те же, что и для соответствующего фактического параметра (а не те, которые связаны с обозначением типа из описания параметра настройки). Во избежание путаницы рекомендуется, когда это возможно, использовать в описании такого формального объекта имя базового типа. Если, однако, базовый тип анонимный, то рекомендуется использовать имя подтипа, определенного в описании базового типа.
Ссылки:
анонимный тип 3.3.1, базовый тип 3.3, вид 6.1, идентификатор 2.3, имя 4.1, конкретизация настройки 12.3, лимитируемый тип 7.4.4, обозначение типа 3.3.2, объект 3.3, ограничение 3.3, описание 3.1, описание константы 3.2, описание параметра настройки 12.1, описание типа 3.2, переменная 3.2.1, подтип 3.2, присваивание 5.2, простое имя 4.1, сопоставление фактического параметра настройки 12.3, фактический параметр настройки 12.3, формальный объект настройки 12.1, формальный параметр настройки 12.1.
12.1.2. ФОРМАЛЬНЫЕ ТИПЫ НАСТРОЙКИ
Описание параметра настройки, включающее определение настраиваемого типа или описание личного типа, задает формальный тип настройки. Формальный тип настройки обозначает подтип, заданный соответствующим фактическим параметром в конкретизации настройки, как описано в п. г) разд. 12.3. В настраиваемом модуле формальный тип настройки рассматривается как некоторый уникальный тип, отличный от всех остальных (формальных или нет) типов.
Форма ограничения, применимого к формальному типу в указании подтипа, зависит от класса типа, как и для типов, не являющихся формальными.
В описании формального (ограниченного) индексируемого типа настройки в качестве формы дискретного диапазона допустимо только обозначение типа.
Раздел дискриминантов формального личного типа настройки не должен включать выражение по умолчанию для дискриминанта. (Следовательно, переменная, заданная описанием объекта, должна быть ограничена, если ее тип — это формальный тип настройки с дискриминантами.)
В описании и теле настраиваемого модуля операции, которые можно выполнять над значениями формального типа настройки (кроме дополнительных операций, заданных формальными подпрограммами настройки), определяются описанием параметра настройки для этого формального типа.
а) Для описания личного типа разрешены операции, определенные в разд. 7.4.2 (в частнос-|ти, для личного, но нелимитируемого типа — присваивание, равенство и неравенство).
б) Для определения индексируемого типа разрешены операции, определенные в разд. 3.6.2 (например, они включают формирование индексируемых компонент и отрезков).
в) Для определения ссылочного типа разрешены операции, определенные в разд. 3.8.2 (например, могут быть использованы генераторы).
Четыре формы определения настраиваемого типа, в которых содержится
бокс
(т.е. составной ограничитель о), соответствуют следующим основным формам скалярного типа:
г) Для дискретного типа: (о)
Разрешенные операции — общие для перечисленных и целых типов; они определены в разд. 3.5.5.
д) Для целого типа:
range < >
Разрешенные операции над целыми типами определены в разд. 3.5.5.
е) Для плавающего типа:
digits < >
Разрешенные операции определены в разд. 3.5.8.
ж) Для фиксированных типов;
delta < >
Разрешенные операции определены в разд. 3.5.10.
Во всех случаях, пп. а) — е), каждая операция, неявно связанная с формальным типом (т.е.
отличная от операции, заданной формальной подпрограммой), считается неявно описанной в месте описания формального типа. Это же относится и к формальному фиксированному типу, исключая мультипликативные операции, которые возвращают результат
универсального-фиксированного
типа (см. 4.5.5), так как эти специальные операции описаны в пакете STANDARD.
При конкретизации настройки каждая из этих операций — соответствующая базовая операция или предопределенная операция для сопоставленного фактического типа. Для операции это правило сохраняется даже в случае переопределения ее для фактического типа или некоторого его родительского типа.
Примеры формальных типов настройки:
type ITEM is private;
type BUFFER(LENGTH : NATURAL) is limited private;
type ENUM is <>;
type INT is range <>;
type ANGLE is delta <>;
type MASS is digits <>; type TABLE is array (ENUM) of ITEM;
Пример раздела формальных параметров настройки с описанием формального целого типа:
generic
type RANK Is range <>;
FIRST : RANK := RANK'PIRST; SECOND : RANK :== FIRST + 1; — операция «+» для типа RANK
Ссылки:
генератор 4.8, дискретный диапазон 3.6, дискретный тип 3.6, индексируемая компонента 4.1.1, класс типа 3.3, конкретизация 12.3, лимитируемый личный тип 7.4.4, мультипликативная операция 4.5, 4.5.5, неравенство 4.5.2, обозначение типа 3.3.2, ограничение 3.3, операция 4.5, операция типа 3.3, описание 3.1, описание настраиваемого модуля 12.1, описание параметра настройки 12.1, определение индексируемого типа 3.6, определение личного типа 7.4, определение настраиваемого типа 12.1, отрезок 4.1.2, перечислимый тип 3.5.1, плавающий тип 3.5.7, присваивание 5.2, равенство 4.5.2, раздел дискриминантов 3.7.1, раздел формальных параметров настройки 12.1, родительский тип 3.4, скалярный тип 3.5, сопоставление фактических параметров настройки 12.3.2, 12.3.3, 12.3.4, 12.3.5, стандартный пакет 8.6 С, тело настраиваемого модуля 12.2, указание подтипа 3.3.2, универсальный фиксированный тип 3.5.9, фактический тип настройки 12.3, фиксированный тип 3.5.9, формальная подпрограмма настройки 12.1.3, формальный тип настройки 12.1, целый тип 3.5.4.
12.1.3. ФОРМАЛЬНЫЕ ПОДПРОГРАММЫ НАСТРОЙКИ
Описание параметра настройки, включающее спецификацию подпрограммы, описывает формальную подпрограмму настройки.
В описании формальной подпрограммы настройки могут встречаться две формы умолчания. В них после спецификации подпрограммы следует зарезервированное слово
is
и либо бокс, либо имя подпрограммы или входа. Правила сопоставления для таких умолчаний описаны в разд. 12.3,6.
Формальная подпрограмма настройки обозначает подпрограмму, литерал перечисления или вход, заданный соответствующим фактическим параметром настройки в конкретизации настройки, как описано в разд. 12.3.6.
Примеры формальных подпрограмм настройки:
with function INCREASE(X : INTEGER) return INTEGER; with function SUM(X, Y : ITEM) return ITEM;
with function "+"(X, Y : ITEM) return ITEM is <>;
with function IMAGE(X : ENUM) return STRING is ENUM'IMAGE;
with procedure UPDATE is DEFAULT_UPDATE;
Примечание.
Ограничения на параметр формальной подпрограммы те же, что у соответствующего параметра в спецификации сопоставленной фактической подпрограммы (а не те, которые вводятся соответствующим обозначением типа в спецификации формальной подпрограммы). Это же относится и к результату функции. Во избежании путаницы рекомендуется везде, где можно, в описании формальной подпрограммы использовать имя базового типа, а не имя подтипа. Если, однако, базовый тип — анонимный, то рекомендуется использовать имя подтипа, определенное в описании типа.
Тип, заданный для формального параметра формальной подпрограммы настройки, может быть любым видимым типом, включая формальный тип настройки из того же раздела формальных параметров настройки.
Ссылки:
анонимный тип 3.2.1, базовый тип 3.3, бокс 12.1.2, зарезервированное слово 2.9, знак операции 6.1, идентификатор 2.3, конкретизация настройки 12.3, область действия 8.2, обозначение 6.1, обозначение типа 3,2.2, ограничение 3.3, описание параметров настройки 12.1, описание переименования 8.5, описание подпрограммы 6.2, подпрограмма 6, подтип 3.3.2, сопоставление фактических подпрограмм настройки 12.3.6, спецификация подпрограммы 6.1, тип 3.3, фактический параметр настройки 12.3, формальная подпрограмма настройки 12.1, формальная функция настройки 12.1.
Пред. | Уровень выше | След. |
11.7. ПОДАВЛЕНИЕ ПРОВЕРОК |
Содержание | 12.2. НАСТРАИВАЕМЫЕ ТЕЛА |
Описание подпрограммы
Описание подпрограммы объявляет процедуру или функцию в зависимости от указанного начального зарезервированного слова.
описание-подпрограммы ::= спецификация-подпрограммы;
спецификация - подпрограммы ::= procedure идентификатор [раздел-формальных-параметров] | function обозначение [раздел-формальных-параметров] return обозначение-типа
обозначение ::= идентификатор | знак-операции знак-операции ::= строковый-литерал
раздел-формальных-параметров ::= (спецификация-параметра {; спецификация-параметра})
спецификация-параметра ::= список-идентификаторов : вид обозначение-типа [:= выражение]
вид ::= [in] | in out | out
Спецификация процедуры определяет ее идентификатор и ее
формальные параметры
(если они есть). Спецификация функции определяет ее обозначение, ее формальные параметры (если они есть) и подтип возвращаемого значения (
подтип результата).
Обозначение, являющееся знаком операции, используется для совмещения операций. Последовательность символов, представляющая знак операции, должна представлять операцию, принадлежащую одному из шести классов совмещаемых операций, определенных в разд. 4.5 (пробелы недопустимы, а относительно букв ограничений нет).
Спецификация параметра с несколькими идентификаторами эквивалентна последовательности спецификаций с одним параметром, как поясняется в разд. 3.2. Каждая спецификация одного параметра описывает формальный параметр. Если вид явно не задан, то предполагается вид
in.
Если спецификация параметра оканчивается выражением, то оно является
выражением по умолчанию
формального параметра. Выражение по умолчанию допустимо только в спецификации параметра вида
in
(независимо от явного или неявного его указания). Тип выражения по умолчанию должен совпадать с типом соответствующего формального параметра.
Не допускается использование имени, обозначающего формальный параметр, в выражении по умолчанию, если спецификация этого параметра дана в том же разделе формальных параметров.
Предвыполнение описания подпрограммы предвыполняет соответствующий раздел формальных параметров.
Предвыполнение раздела формальных параметров не дает другого эффекта.
Примеры описания подпрограмм:
procedure TRAVERSE_TREE; procedure INCREMENT(X : in out INTEGER); procedure RIGHTINDENT(MARGIN : out LINESIZE); -- CM. 3.5.4 procedure SWITCH(FROM, TO : in out LINK); -- CM. 3.8.1
function RANDOM return PROBABILITY; -- CM. 3.5.7 function MINCELL(X : LINK) return CELL; -- CM. 3.8.1 function NEXTFRAME(K : POSITIVE) return FRAME; -- CM. 3.8 function DOTPRODUCT(LEFT,RIGHT: VECTOR) return REAL; -- CM. 3.6
function"*"(LEFT,RIGHT : MATRIX) return MATRIX; -- CM. 3.6
Примеры параметров с выражениями по умолчанию:
procedure PRINT_HEADER( PAGES : in NATURAL; HEADER : in LINE := (1 .. LINE'LAST => ' '); -- CM. 3.6 CENTER : in BOOLEAN := TRUE);
Примечание.
Вычисление выражений по умолчанию начинается при определенных вызовах подпрограмм, как пояснено в разд. 6.4.2 (выражения по умолчанию не вычисляются при предвыполнении описания подпрограммы).
Все подпрограммы могут быть вызваны рекурсивно и являются реентерабельными.
Ссылки:
вид 6.2, вызов подпрограммы 6.4, выражение 4.4, вычисление 4.5, идентификатор 2.3, имя 4.1, обозначение типа 3.3.2, операция 4.5, описание 3.1, Предвыполнение 3.9, пред-выполнение не имеет другого эффекта 3.9, процедура 6, совмещение 6.6, 8.7, список идентификаторов 3.2, строковый литерал 2.6, формальный параметр 6.2, функция 6.5.
Пред. | Уровень выше | След. |
5.9. ОПЕРАТОРЫ ПЕРЕХОДА |
Содержание | 6.2. ВИДЫ ФОРМАЛЬНЫХ ПАРАМЕТРОВ |
В языке определены понятия, объявляемые
В языке определены понятия, объявляемые явно или неявно описаниями. К таким понятиям относятся, например: числовой литерал, объект, дискриминант, компонента записи, параметр цикла, исключение, тип, подтип, подпрограмма, пакет, задачный модуль, настраиваемый модуль, одиночный вход, семейство входов, формальный параметр (подпрограммы, входа, настраиваемой подпрограммы), формальный параметр настройки, именованный блок или цикл, помеченный оператор, а также операция (в частности, атрибут или литерал перечисления, см. 3.3.3).
Существует, несколько форм описаний. Основное описание — это форма описания, определенная следующим образом:
основное-описание ::= описание-объекта | описание-числа | описание-типа | описание-подтипа | описание-подпрограммы | описание-пакета | описание-задачи | описание-настройки | описание-исключения | конкретизация-настройки | описание-переименования | описание-субконстанты
Некоторые формы описания всегда являются (явно) частью основного описания, а именно:
спецификация дискриминантов, описание компонент, описание входов, спецификация параметров, описание параметров настройки и спецификации литералов перечисления. Спецификация параметра цикла — это конструкция, которая входит только в некоторые формы оператора цикла.
Остальные формы описания являются неявными: имя блока, имя цикла и метка оператора. Некоторые операции описываются неявно (см. 3.3.3).
Для каждой формы описания правила языка определяют некоторый участок текста, называемый
областью действия
описания (см. 8.2). Несколько форм описания связывают идентификатор с описанным понятием. Внутри его области действия, и только в ней, существуют места, где возможно использование идентификатора для связи его с описанным понятием;
эти места определяются правилами видимости (см. 8.3.). В таких местах идентификатор называют
именем
понятия (простым именем); говорят, что имя
обозначает
связанное с ним понятие.
Определенные формы спецификации литерала перечисления связывают символьный литерал с соответствующим описываемым понятием.
Некоторые формы описаний связывают символ операции или другие обозначения с явно или неявно описанной операцией.
Процесс, в результате которого описание вступает в силу, называется
предвыполнением
описания; этот процесс протекает во время выполнения программы.
Говорят, что после своего предвыполнения описание становится
предвыполненным.
До завершения своего предвыполнения (как и до его начала) описание считается еще не предвы-полненным. Предвыполнение любого описания дает всегда по крайней мере один эффект:
описание из еще не предвыполненного становится предвыполненным. Фраза
Предвыполнение не дает другого эффекта
используется тогда, когда происходит только изменение статуса описания. Процесс предвыполнения определяется также для разделов описаний, элементов описания и компилируемых модулей (см. 3.9 и 10.5).
Описания объекта, числа, типа и подтипа даны в этой главе. Остальные основные описания изложены в последующих главах.
Примечание.
Синтаксические правила используют термин
идентификатор
для первого вхождения идентификатора в некоторую форму описания; термин
простое имя
используется для любого вхождения идентификатора, который уже обозначает какое-либо описанное понятие.
Ссылки:
атрибут 4.1.4, видимость 8.3, знак операции 6.1, идентификатор 2.3, имя 4.1, имя блока 5.6, имя цикла 5.5, компонента записи 3.7, конкретизация настройки 12.3, метка 5.1, область действия 8.2, оператор блока 5.6, оператор цикла 5.5, операция типа 3.3, описание входа 9.5, описание задачи 9.1, описание исключения 11.1, описание компоненты 3.7, описание настройки 12.1, описание объекта 3.2.1, описание пакета 7.1, описание параметра настройки 12.1, описание переименования 8.5, описание подпрограммы 6.1, описание подтипа 3.3.2, описание субконстанты 7.4, 3.9, описание типа 3.3.1, описание числа 3.2.2, Предвыполнение 3.9, простое имя 4.1, раздел описаний 3.9, символьный литерал 2.5, спецификатор представления 13.1, спецификация дискриминанта 3.7.1, спецификация литерала перечисления 3.5.1, спецификация параметра 6.1, спецификация параметра цикла 5.5, тело подпрограммы 6.3, числовой литерал 2.4, элемент описания 3.9.
Пред. | Уровень выше | След. |
2.10. ДОПУСТИМЫЕ ЗАМЕНЫ СИМВОЛОВ | Содержание | 3.2. ОБЪЕКТЫ И ИМЕНОВАННЫЕ ЧИСЛА |
Описания исключений
В описании исключения задается его имя. Это имя можно употреблять только в операторах возбуждения, обработчиках исключений и описаниях переименования.
описание-исключения ::= список-идентификаторов: exception;
Описание исключения с несколькими идентификаторами эквивалентно последовательности единичных описаний с одним идентификатором (см. 3.2). Каждое единичное описание исключения задает имя отличного от других исключения. В частности, если настраиваемый модуль содержит описание исключения, то такие описания, неявно сгенерированные различными конкретизациями настройки, ссылаются на разные исключения (но все они имеют один и тот же идентификатор). Конкретное исключение, обозначенное именем, определяется во время компиляции и является одним и тем же независимо от числа предвыполнений его описания. Следовательно, если описание исключения находится в рекурсивной подпрограмме, то имя исключения обозначает одно и то же исключение для всех вызовов рекурсивной подпрограммы.
В языке предопределены следующие исключения. Они возбуждаются при обнаружении описанных ниже ситуаций.
CONSTRAINT_ERROR | Это исключение возбуждается в любой из следующих ситуаций: при попытке нарушить ограничение диапазона, ограничение индекса или ограничение дискриминанта; при попытке использовать компоненту записи, не существующую для текущих значений дискриминанта; при попытке использовать именуемую компоненту, индексируемую компоненту, отрезок или атрибут объекта, обозначенного ссылочным значением, если этот объект не существует, поскольку ссылочное значение
пустое | ||
NUMERIC_ERROR | Это исключение возбуждается при выполнении предопределенной числовой операции, которая не может выработать верный результат (для вещественных типов в пределах предписанной точности). Сюда относится также случай использования реализацией предопределенных числовых операций для выполнения, вычисления или предвыполнения некоторой конструкции. Данные в разд. 4.5.7 правила определяют случаи, для которых от реализации не требуется возбуждения исключения в случае возникновения ошибочной ситуации (см. также 11.6). | ||
PROGRAM_ERROR | Это исключение возбуждается при попытке вызвать подпрограмму, активизировать задачу или предвыполнить конкретизацию настройки, если тело соответствующего модуля еще не предвыполнено. Оно также возбуждается, если выполнение функции завершается через end (см. 6.5), при выполнении оператора отбора с ожиданием, когда отсутствует раздел else, a все альтернативы закрыты (см. 9.7.1). Наконец, в зависимости от реализации исключение может возбуждаться при попытке выполнить ошибочное действие и при некорректной зависимости от порядка (см. 1.6). | ||
STORAGE_ERROR | Это исключение возбуждается в одной из следующих ситуаций: при вычислении генератора; когда не хватает динамической памяти, выделенной для задачи; когда исчерпана память для набора генерируемых объектов; при предвыполнений элемента описания или при вызове подпрограммы, если памяти
недостаточно. | ||
TASKING_ERROR | Это исключение возбуждается при возбуждении исключений во время взаимодействия задач (см. 9 и 11.5). |
/p>
Примечание.
Описанные выше ситуации могут возникать, не возбуждая соответствующих исключений, если была использована прагма SUPPRESS подавления проверок (см. 11.7).
Примеры описанных пользователем исключений:
SINGULAR : exception; ERROR : exception; OVERFLOW, UNDERFLOW : exception;
Ссылки:
вещественный тип 3.5.6, задача 9, идентификатор 2.3, имя 4.1, исключение 11, компонента записи 3.7, конкретизация 12.3, конкретизация настройки 12.3, набор 3.8, настраиваемое тело 12.2, настраиваемый модуль 12, неявное описание 12.3, обработчик исключения 11.2, объект 3.2, оператор возбуждения 11.3, оператор возврата 5.8, описание 3.1, подпрограмма 6, ссылочное значение 3.8, тело задачи 9.1, тело подпрограммы 6.3.
Контекст исключения
CONSTRAINT_ERROR: агрегат 4.3.1, 4.3.2, атрибут дискретного типа 3.5.5, генератор 4.8, именованная компонента 4.1.3, индекс входа 9.5, индексированная компонента 4.1.1, квалифицированное выражение 4.7, логическая операция 4.5.1, ограничение 3.3.2, ограничение диапазона 3.5, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, оператор присваивания 5.2, 5.2.1, операция возведения в степень 4.5.6, описание объекта 3.2.1, отрезок 4.1.2, преобразование типа 4.6, предвыполнение формального параметра настройки 12.3, пустое ссылочное значение 3.8, сопоставление параметров 6.4.1, указание подтипа 3.3.2.
Контекст исключения
NUMERIC_ERROR: атрибут дискретного типа 3.5.5, неявное преобразование 3.5.4, 3.5.6, 4.6, операция над числовым типом 4.5, 4.5.7, числовая операция 3.5.5, 3.5.8, 3.5.10.
Контекст исключения
PROGRAM_ERROR: выход из функции 6.5, контроль предвыполнения 3.9, 7.3, 9.3, 12.2, набор 3.8, некорректная зависимость от порядка 1.6, отбор с ожиданием 9.7.1, ошибочный 1.6, предвыполнение 3.9.
Контекст исключения
STORAGE_ERROR: генератор 4.8.
Контекст исключения
TASKING_ERROR: активизация задачи 9.3, вызов входа 9.5, 9.7.2, 9.7.3, исключения при взаимодействии задач 11.5, оператор прекращения 9.10.
Пред. | Уровень выше | След. |
10.6. ОПТИМИЗАЦИЯ ПРОГРАММЫ |
Содержание | 11.2. ОБРАБОТЧИКИ ИСКЛЮЧЕНИЙ |
Описания личных типов и субконстант
Описание типа в качестве личного (приватного) в видимом разделе пакета служит для отделения характеристик, которые могут быть использованы непосредственно внешними программными модулями (логические свойства), от других характеристик, непосредственное использование которых возможно только внутри пакета (детали определения самого типа). Описания субконстант задают константы личных типов.
описание-личного-типа ::= type идентификатор [раздел-дискриминантов] is [limited] private;
описание-субконстанты ::= список-идентификаторов : constant обозначение-типа;
Описание личного типа допустимо только в качестве элемента описания в видимом разделе пакета или в качестве описания параметра настройки для типа в разделе формальных параметров настройки.
Обозначение типа в описании субконстанты должно обозначать личный тип или подтип личного типа. Описание субконстанты и описание соответствующего личного типа должны быть оба элементами описаний в видимом разделе одного и того же пакета. Описание субконстант с несколькими идентификаторами эквивалентно последовательности описаний субконстант с одним идентификатором, как объяснено в разд. 3.2.
Примеры описаний личного типа:
type KEY is private; type FILENAME is limited private;
Пример описания субконстанты:
NULLKEY : constant KEY;
Ссылки:
видимый раздел 7.2, идентификатор 2.3, константа 3.2.1, лимитируемый тип 7.4.4, личный тип 7.4.1, обозначение типа 3.3.2, описание 3.1, описание параметра настройки 12.1, пакет 7, подтип 3.3, программный модуль 6, раздел дискриминанта 3.7.1, раздел формальных параметров настройки 12.1, список идентификаторов 3.2, тип 3.3, формальный тип настройки 12.1, элемент описания 3.9.
7.4.1. ЛИЧНЫЕ ТИПЫ
Если описание личного типа дается в видимом разделе пакета, то соответствующее описание типа с тем же самым идентификатором должно присутствовать в качестве элемента описания в личном разделе пакета. Соответствующее описание должно быть либо полным описанием типа, либо описанием задачного типа.
В оставшейся части этого раздела объяснения даются для полных описаний типов. Те же правила применяются к описаниям задачных типов.
Описание личного типа и соответствующее полное описание типа определяют один тип. Описание личного типа вместе с видимым разделом определяет операции, которые могут использовать внешние программные модули (см. 7.4.2). С другой стороны, полное описание типа определяет другие операции, непосредственное использование которых возможно только внутри самого пакета.
Если описание личного типа включает раздел дискриминантов, то полное описание типа должно включать раздел дискриминантов по правилам согласования (см. 6.3.1) и определением типа должно быть определение именуемого типа. И наоборот, если описание личного типа не включает раздела дискриминантов, то тип, описанный с помощью полного описания типа
{полный
тип), не должен быть неограниченным типом с дискриминантами. Полный тип не должен быть неограниченным индексируемым типом. Лимитируемый тип (в частности, задач-ный тип) допускается в качестве полного типа, только если в описании личного типа присутствует зарезервированное слово
limited
(см. 7.4.4).
Внутри спецификации пакета, в которой описан личный тип, и до конца соответствующего полного описания типа ограничено использование имени этого личного типа или его подтипа, а также использование имени любого типа или подтипа с подкомпонентой данного личного типа. Использование такого имени допускается только в описании субконстанты, описании типа или подтипа, спецификации подпрограммы или описания входа; более того, не допускается использование этого имени в определениях производного типа или в простых выражениях.
При предвыполнении описания личного типа создается личный тип. Если описание личного типа имеет раздел дискриминантов, то он также предвыполняется. Предвыполнение полного описания типа заключается в предвыполнении определения типа; если имеется раздел дискриминантов, то он не предвыполняется (так как уже предвыполнен согласованный раздел дискриминантов в описании личного типа).
Примечание.
Из перечисленных правил следует, что ни описание переменной личного типа, ни создание объекта личного типа с помощью генератора недопустимо до полного описания типа. Точно также до полного описания нельзя использовать имя личного типа в конкретизации настройки или в спецификаторе представления.
Ссылки:
видимый раздел 7.2, выражение 4.4, генератор 4.8, зарезервированное слово 2.9, идентификатор 2.3, имя 4.1, индексируемый тип 3.6, конкретизация настройки 12.3, лимитируемый тип 7.4.4, личный раздел 7.2, личный тип 7.4, неограниченный индексируемый тип 3.6, неполное описание типа 3.8.1, операция 3.3, описание входа 9.5, описание личного типа 7.4, описание подтипа 3.3.2, описание субконстанты 7.4.3, описание типа 3.3.1, определение именуемого типа 3.7, определение типа 3.3.1, пакет 7, переменная 3.2.1, подкомпонента 3.3, подтип 3.3, полное описание типа 3.3.1, Предвыполнение 3.9, производный тип 3.4, раздел дискриминанта 3.7.1, согласованный 6.3.1, спецификатор представления 13.1, спецификация пакета 7.1, спецификация подпрограммы 6.1, тип 3.3, элемент описания 3.9.
7.4.2. ОПЕРАЦИИ НАД ЛИЧНЫМ ТИПОМ
Операции, которые неявно описаны введением описания личного типа, включают базовые операции: присваивание (кроме лимитируемого типа), проверку принадлежности, квалификацию, явное преобразование и именование компоненты для какого-либо дискриминанта. минанта.
Для личного типа Т в базовые операции также входят атрибуты Т'BASE (см. 3.3.3) и T'SIZE (см. 13.7.2). Для объекта А личного типа в базовые операции включается атрибут A'CONSTRAINED, если личный тип содержит дискриминант (см. 3.7.4), и во всех случаях — атрибуты A'SIZE и A'ADDRESS (см. 13.7.2).
Наконец, операции, неявно описанные описанием личного типа, включают предопределенные отношения равенства и неравенства (кроме личных типов, в описании которых присутствует зарезервированное слово
limited).
Рассмотренные выше операции вместе с подпрограммами, которые имеют параметр или результат личного типа и описаны в видимом разделе пакета, являются единственными операциями над .личным типом, используемыми вне пакета.
Внутри пакета, содержащего описание личного типа, дополнительные операции вводятся неявно полным описанием типа. При этом переопределение этих операций допустимо внутри той же самой зоны описаний, а именно между описанием личного типа и соответствующим полным описанием. Явно описанная подпрограмма скрывает неявно описанную операцию, которая имеет тот же самый профиль типа параметров и результата (это возможно, только если неявно описанной операцией является производная подпрограмма или предопределенная операция).
Если составной тип имеет подкомпоненту личного типа и описан вне пакета, содержащего описание личного типа, то неявно описанные при описании составного типа операции включают все операции, зависящие только от характеристик, вытекающих из одного описания личного типа. (Например, операция < не включается в набор операций для одномерного индексируемого типа.)
Если составной тип сам описан внутри пакета, содержащего описание личного типа (включая внутренний пакет или настраиваемый пакет), то неявно описываются дополнительные операции, которые зависят от характеристик полного типа, как этого требуют правила использования составного типа (например, операция < описана для одномерного индексируемого типа, если полный тип является дискретным). Эти дополнительные операции считаются неявно описанными в самом начале непосредственной области действия составного типа, их использование разрешено только после полного описания типа.
Те же правила относятся к неявно описанным для ссылочного типа операциям, чье обозначение типа есть личный тип или тип, описанный посредством неполного описания типа.
Для каждого личного типа или полтипа Т определен следующий атрибут:
T'CONSTRAINED |
Вырабатывает значение FALSE, если Т обозначает неограниченный неформальный личный тип с дискриминантами, не являющийся формальным параметром настройки; вырабатывает также значения FALSE, если Т обозначает личный тип, являющийся формальным параметром настройки, а соответствующий подтип фактического параметра является либо неограниченным типом с дискриминантом, либо неограниченным индексируемым типом; в остальных случаях вырабатывает значение TRUE. Значение атрибута имеет предопределенный тип BOOLEAN. |
/p>
Примечание.
Описание личного типа и соответствующее полное описание типа определяют два разных аспекта одного и того же типа. Вне пакета тип обладает теми характеристиками которые определены в видимой части. Для внешних программных модулей тип является именно личным типом, и любое правило языка, которое применяется только к другому классу типов к этому типу неприменимо. Тот факт, что полное описание может
реализовать
личный тип в виде типа конкретного класса (например, в виде индексируемого типа), можно использовать только внутри пакета.
Последствия такой фактической реализации сказываются тем не менее везде. Например, производится некоторая инициализация компонент по умолчанию; атрибут SIZE вырабатывает раз'мер полного типа; правила зависимости задач распространяются также на компоненты — объекты задачного типа.
Пример:
package KEY_MANAGER is
type KEY is private; NULL_KEY : constant KEY; procedure GET_KEY(K : out KEY); function "<" (X, Y : KEY) return BOOLEAN: private
type KEY is new NATURAL: NULLKEY : constant KEY := 0; end;
package body KEY_MANAGER is
LAST_KEY : KEY := 0; procedure GET_KEY(K : out KEY) is begin
LAST_KEY := LAST_KEY + 1; К := LAST_KEY; end GET_KEY;
function "<" (X. Y : KEY) return BOOLEAN is begin
return INTEGER(X) < INTEGER(Y); end "<"; end KEY_MANAGER;
Примечание к примеру:
Операциями, применимыми к объектам типа KEY вне пакета KEY MANAGER являются: присваивание, сравнение на равенство и неравенство, процедура GET_KEY и операция "<";
сюда не включаются другие операции отношения, например >=
или арифметические операции.
Явно описанная операция " <" скрывает предопределенную операцию < , неявно опи_ санную полным описанием типа. В теле функции необходимо явное преобразование Х и Y к типу INTEGER для явного вызова операции
"<"
над этим типом. С другой стороны результат функции мог бы быть записан в виде
not(X
> = Y), так как операция " > = не переопре-
Значение переменной LAST_KEY, описанной в теле пакета, не меняется между вызовами процедуры GET_KEY (см. также примечание к разд. 7.3).
Ссылки-
атрибут 4.1.4, базовая операция 3.3.3, видимый раздел 7.2, дискриминант 3.3, зависимость задач 9.4, именованная компонента 4.1.3, квалификация 4.7, компонента 3.3, контроль принадлежности 4.5, личный тип 7.4, неполное описание типа 3.8.1, непосредственная область
действия 8.2, неявное описание 3.1, область описания 8.1, основная операция 3.3.3, операция 3.3, операция отношения 4.5, описание 3.1, описание личного типа 7.4, пакет 7, параметр подпрограммы 6.2, подпрограмма 6, полное описание типа 3.3.1, полный тип 7.4.1, предопределенная операция 4.5, предопределенная функция 8.6, преобразование 4.6, присваивание 5.2, программный модуль 6, производная подпрограмма 3.4, производный тип 3.4, равенство 4.5.2, размерность 3.6, скрытие 8.3, составной тип 3.3.
7.4.3. СУБКОНСТАНТЫ
Если описание субконстанты дается в видимом разделе пакета, то описание константы (т. е. описание объекта, задающее константу с явной инициализацией) с тем же самым идентификатором должно быть элементом описания личного раздела этого пакета. Такое описание объекта называется
полным
описанием субконстанты. Заданное в полном описании обозначение типа должно быть согласовано с обозначением типа, заданным в описании субконстанты (см. 6.3.1). Допускаются групповые и единичные полные описания и описания субконстант при условии, что эквивалентные единичные описания согласованы.
В спецификации пакета, содержащей описание субконстанты, и до конца соответствующего полного описания имя субконстанты допускается использовать только в выражении по умолчанию для именуемой компоненты или формального параметра (но не формального параметра настройки).
Предвыполнение описания субконстанты не дает другого эффекта.
Выполнение программы ошибочно, если оно пытается использовать значение субконстанты до предвыполнения соответствующего полного описания.
Примечание.
Полное описание субконстанты заданного личного типа не должно встречаться до соответствующего полного описания типа. Это является следствием правил, определяющих допустимые использования имени, обозначающего личный тип (см. 7.4.1).
Ссыпки:
видимый раздел 7.2, выражение по умолчанию для дискриминанта 3.7.1, идентификатор 2.3, именуемая компонента 3.7, личный раздел 7.2, обозначение типа 3.3.2, описание константы 3.2.1, описание объекта 3.2.1, описание субконстанты 7.4, пакет 7, Предвыполнение не дает другого эффекта 3.1, согласованный 6.3.1, спецификация пакета 7.1, субконстанта 7.4, формальный параметр 6.1, формальный параметр настройки 12.1, 12.3, элемент описания 3.9.
7.4.4. ЛИМИТИРУЕМЫЕ ТИПЫ
Лимитируемый тип — это тип, для которого
неявным
описанием не вводится ни присваивание, ни сравнение на равенство и неравенство.
Описание личного типа с зарезервированным словом
limited
описывает лимитируемый тип. Задачный тип является лимитируемым типом. Производный тип от лимитируемого типа сам является лимитируемым типом. Наконец, составной тип является лимитируемым, если тип одной из его компонент является лимитируемым.
Над личным лимитируемым типом определены операции, которые даны в разд. 7.4.2, за исключением присваивания и предопределенного сравнения на равенство и неравенство.
Вид
out
допустим для формального параметра лимитируемого типа, описанного явно, только в том случае, если этот тип является личным лимитируемым типом, а описание подпрограммы находится в видимом разделе пакета, где описан и личный тип. То же самое относится к формальным параметрам описаний входов и описаний настраиваемых процедур. Соответствующий полный тип не должен быть лимитируемым, если любой такой формальный параметр имеет вид
out.
В противном случае в качестве соответствующего полного типа допускается (но не требуется) лимитируемый тип (в частности, допустив^задачный тип). Если полный тип, соответствующий лимитируемому личному типу, сам не является лимитируемым, то для этого типа в пакете (но не вне его) допустимо присваивание.
Из правил для лимитируемых типов вытекает следующее:
• Если тип объекта является лимитируемым, то в описании этого объекта явная инициализация недопустима.
• Если тип именуемой компоненты является лимитируемым, то выражение по умолчанию в описании компоненты недопустимо.
• Если тип объекта, указанного ссылочным типом, является лимитируемым, то в генераторе явная инициализация недопустима.
• Формальный параметр настройки вида
in
не должен быть лимитируемого типа.
Примечание.
Описанные выше правила не исключают выражение по умолчанию для формального параметра лимитируемого типа; они не исключают также субконстанту лимитируемого типа, если полный тип не является лимитируемым. Для лимитируемого типа допускается явное описание операции равенства (см. 6.7).
Для лимитируемого составного типа не разрешаются агрегаты (см. 3.6.2 и 3.7.4). Для лимитируемого индексируемого типа не разрешается катенация (см. 3.6.2).
Пример:
package I_O_PACKAGE is type FILE_NAME is limited private;
procedure OPEN (F in out FILE_NAME); procedure CLOSE (F in out FILE_NAME); procedure READ (F in FILE_NAME; ITEM : out INTEGER); procedure WRITE (F in FILE_NAME; ITEM : in INTEGER); private
type FILE_NAME is record
INTERNAL_NAME : INTEGER := 0; end record;
end I_0_PACKAGE;
package body I_0_PACKAGE is
LIMIT : constant := 200; type FILE_DESCRIPTOR is record ... end record;
DIRECTORY : array (1 .. LIMIT) of P1LE_DESCRIPTOR; ... procedure OPEN (F in out FILE_NAME) is ... end;
procedure CLOSE (F in out FILEJMAME) Is ... end;
procedure READ (F in FILE_NAME; ITEM : out INTEGER) is ... end:
procedure WRITE (F in FILEJMAME; ITEM : in INTEGER) Is ... end;
begin
... end I_O_PACKAGE;
Примечание к примеру.
В приведенном примере для внешних подпрограмм, использующих !_ О-PACKAGE, имя файла можно получить в результате вызова процедуры OPEN, а затем использовать его в вызовах процедур READ и WRITE. Следовательно, вне пакета имя файла, полученное после вызова процедуры OPEN, выполняет функцию пароля; его внутренние свойства (например, содержать числовое значение) неизвестны, и никакие другие операции (такие как сложение или сравнение внутренних имен) над этим именем не могут выполняться.
Этот пример характерен для тех случаев, когда желателен полный контроль над операциями. Такие пакеты служат двум целям: они препятствуют пользователю в использовании внутренней структуры типа, а также реализуют понятие упрятывания (скрытия) типа данных, для которых определены только заданные в спецификации пакета операции.
Ссылки:
агрегат 4.3, вид 12.1.1, выражение по умолчанию для дискриминанта 3.7, генератор 4.8, задачный тип 9.1, 9.2, именуемая компонента 3.7, именуемый тип 3.7, личный тип 7.4, начальное значение 3.2.1, неявное описание 3.1, обозначает 3.8, объект 3.2, операция 3.3, операция катенации 4.5, операция отношения 4.5, описание компоненты 3.7, описание личного типа
7.4. пакет 7, подкомпонента 3.3, подпрограмма 6, полное описание типа 3.3.1, полный тип 7.4.1, предопределенная операция 4.5, присваивание 5.2, производный тип 3.4, равенство 4.5.2, составной тип 3.3, спецификация дискриминанта 3.7.1, субконстанта 7.4.3, тип 3.3, тип компоненты 3.3, формальный параметр 6.1, формальный параметр настройки 12.1, 12.3.
Пред. | Уровень выше | След. |
7.3. ТЕЛА ПАКЕТОВ |
Содержание | 7.5. ПРИМЕР ПАКЕТА РАБОТЫ С ТАБЛИЦАМИ |
Описания переименования
Описание переименования задает другое имя для понятия.
описание-переименования ::= идентификатор : обозначение-типа renames имя-объекта; | идентификатор : exception renames имя-исключения;
| package идентификатор renames имя-пакета; | спецификация-подпрограммы renames имя-подпрограммы-или-входа;
Предвыполнение описания переименования вычисляет имя, которое следует после зарезервированного слова
renames,
и таким образом определяет понятие, обозначенное этим именем (переименованное понятие). В любой точке, где описание переименования видимо, идентификатор или знак операции, заданный в этом описании, обозначает переименованное понятие.
Первая форма описания переименования используется для переименования объектов. Переименованное понятие должно быть объектом базового типа обозначения типа. Описание переименования не изменяет свойств переименованного объекта. В частности, описание переименования не оказывает влияния на значение объекта и на то, является ли он константой или нет; аналогично переименования не затрагивают ограничения, накладываемые на объект (любое ограничение, которое следует из обозначения типа, входящего в описание переименования, игнорируется). Описание переименования правильно только в том случае, если точно один объект имеет этот тип и может быть обозначен этим именем объекта.
Существуют следующие ограничения, связанные с переименованием подкомпоненты переменной, которая зависит от дискриминантов. Переименование недопустимо, если подтип переменной, как это определено в соответствующем описании объекта, описании компоненты или указании подтипа компоненты, является неограниченным типом или если переменная — это формальный объект настройки (вида
in out).
Также если переменная — формальный параметр, то переименование недопустимо, если заданное в спецификации параметра обозначение типа обозначает неограниченный тип, чьи дискриминанты имеют выражения по умолчанию.
Вторая форма описания переименования используется для переименования исключений;
третья форма — для переименования пакетов.
Последняя форма описания переименования используется для переименования подпрограмм и входов. Переименованная подпрограмма или вход и спецификация подпрограммы, заданная в описании переименования, должны иметь один и тот же профиль типа параметров и результата (см. 6.6). Описание переименования правильно только в том случае, если точно одна видимая подпрограмма или вход удовлетворяют упомянутым выше требованиям и могут быть обозначены конкретным именем подпрограммы или входа. Кроме того, виды параметров должны совпадать с видами соответствующих по позиции формальных параметров.
Переименование не оказывает влияния на подтипы параметров и результата (если он есть) переименованной подпрограммы или входа. Эти подтипы заданы в первоначальном описании подпрограммы, конкретизации настройки или описании входа (но не в описании переименования), а также для вызовов, которые используют новое имя. С другой стороны, описание переименования может вводить имена параметров и выражения по умолчанию, которые отличаются от заданных для переименованной подпрограммы; именованные сопоставления в вызовах с новым именем подпрограммы должны использовать новое имя параметра; вызовы со старым именем подпрограммы должны использовать старые имена параметров.
Процедура может быть переименована только как процедура. Функция либо операция могут быть переименованы как функция либо как операция; при переименовании функции или операции операцией спецификация подпрограммы, заданная в описании переименования, подчиняется правилам разд. 6.7 для описаний операции. Литералы перечисления могут быть переименованы как функции; аналогично'атрибуты, определенные как функции (такие, как SUCC или PRED), могут быть переименованы как функции. Вход может быть переименован только как процедура; новое имя допускается только в контексте, допускающем имя процедуры. Вход из семейства может быть переименован, но семейство входов не может быть переименовано целиком. /
Примеры:
declare
L : PERSON renames LEFTMOST_PERSON; -- см. 3.8.1 begin
L.AGE := L.AGE + 1; end;
FULL : exception renames TABLE_MANAGER.TABLE_FULL; -- CM. 7.5
package TM renames TABLE.MANAGER;
function REAL_PLUS(LEFT, RIGHT : REAL ) return REAL renames "+"; function INT_PLUS (LEFT, RIGHT : INTEGER) return INTEGER renames "+";
function ROUGE return COLOR renames RED; —- CM. 3.5.1 function ROT return COLOR renames RED; function ROSSO return COLOR renames ROUGE:
function NEXT(X : COLOR) return COLOR renames COLOR'SUCC; - CM. 3.5.5
Примеры описания переименования с новыми именами параметров:
function "*" (X.Y : VECTOR) return REAL renames DOT_PRODUCT; —- CM. 6.1
Пример описания переименования с новым выражением по умолчанию:
function
MINIMUMtL : LINK := HEAD)
return
CELL
renames
MIN-.CELL; — CM. 6.1
Примечание.
Переименование может быть использовано для разрешения конфликта имен и введения сокращений. Переименование другим идентификатором или символом операции не скрывает старое имя; новое и старое имена (символ операции) не обязательно видимы в одних и тех же точках. Атрибуты РОЗ и VAL не могут быть переименованы, так как не могут быть написаны соответствующие спецификации; это положение справедливо для предопределенных мультипликативных операций с результатом
универсального-фиксированного
типа.
Вызовы переименованного входа с новым именем являются операторами вызова процедуры и недопустимы в местах, где синтаксис требует оператора вызова входа в условном и временном вызовах входа; аналогично атрибут COUNT нельзя применить к новому имени.
Объект задачного типа, описанный посредством описания объекта, может быть переименован как объект. Однако одиночная задача не может быть переименована, так как соответствующий задачный тип является анонимным. По тем же причинам не может быть переименован объект анонимного индексируемого типа. Не существует синтаксической формы для переименования настраиваемого модуля.
Для достижения эффекта переименования типа (включая задачный тип) может быть использован подтип, например:
subtype MODE is
TEXT_IO.FILE_MODE ; \
Ссылки:
атрибут 4.1.4, базовый тип 3.3, вид 6.1, видимость 8.3, временный вызов входа 9.7.3, вход 9.5, вызов входа 9.5, вызов подпрограммы 6.4, выражение по умолчанию 6.1, вычисление имени 4.1, дискриминант 3.7.1, допустимый 1.6, зависеть от дискриминанта 3.7.1, задачный объект 9.2, зарезервированное слово 2.9, знак операции 6.1, идентификатор 2.3, имя 4.1, исключение 11, константа 3.2.1, литерал перечисления 3.5.1, обозначение типа 3^3.2, объект 3.2, ограничение 3.3, ограниченный подтип 3.3, оператор вызова входа 9.5, оператор вызова процедуры 6.4, операция 6.7, описание 3.1, описание входа 9.5, описание объекта 3.2, описание операции 6.7, описание подпрограммы 6.1, пакет 7, параметр 6.2, переменная 3.2.1, подкомпонента 3.3, подпрограмма 6, подтип 3.3.2, правильно 1.6, предвыполнение 3.1, процедура 6.1, семейство входов 9.5, спецификация параметра 6.1, спецификация подпрограммы 6.1, тип 3.3, условный вызов входа 9.7.2, формальный параметр 6.1, функция 6.5.
Пред. | Уровень выше | След. |
8.3. ВИДИМОСТЬ |
Содержание | 8.6. СТАНДАРТНЫЙ ПАКЕТ |
Оптимизация программы
Компиляторы могут осуществлять оптимизацию предвыполнения описаний и выполнения операторов. В частности, компилятор может оптимизировать программу, вычисляя определенные выражения помимо статических. Если какое-либо из таких выражений, статических или нет, при вычислении приводит к возбуждению исключения, то код этой части программы может быть заменен кодом возбуждения того же исключения; это справедливо для исключений, возбуждаемых при вычислении имен и простых выражений (см. также разд. 11.6).
Компилятор может определить, что некоторые операторы или подпрограммы никогда не будут выполняться, например, если их выполнение зависит от условия, имеющего значение FALSE. В таком случае соответствующие части объектного машинного кода могут быть опущены. Такое правило позволяет на уровне языка производить
условную компиляцию.
Примечание.
Выражение, вычисление которого может привести к возбуждению исключения, не обязательно представляет ошибку, если выражение находится в операторе или подпрограмме, которые никогда не выполняются. Компилятор может предупреждать программиста о потенциальной ошибке.
Ссылки:
возбуждение исключения 11.1, выражение 4.7, вычисление 4.5, исключение 11, логическое значение FALSE 3.5.3, оператор 5, описание 3.1, подпрограмма 6, предвыполнение 3.9, программа 10, статическое выражение 4.9, условие 5.3.
Пред. | Уровень выше | След. | |
10.5. ПРЕДВЫПОЛНЕНИЕ БИБЛИОТЕЧНЫХ МОДУЛЕЙ
|
Содержание | Глава 11.
ИСКЛЮЧЕНИЯ |
Подавление проверок
Присутствие прагмы SUPPRESS позволяет реализации опускать некоторые проверки во время выполнения программы. Эта прагма имеет следующий вид:
pragma
SUPPRESS (идентификатор [, [ON =>] имя]);-
Проверка, указанная идентификатором, может быть опущена. Имя (если оно присутствует) должно быть простым или расширенным и обозначать объект, тип или подтип, задачный модуль или настраиваемый модуль; оно также может быть именем подпрограммы, в этом случае имя обозначает все видимые совмещенные подпрограммы.
Прагма SUPPRESS допустима непосредственно в разделе описаний или непосредственно в спецификации пакета. Во втором случае допустимо представление прагмы только с именем, которое обозначает понятие (или несколько совмещенных подпрограмм), описанное непосредственно в спецификации пакета. Действие прагмы распространяется от местоположения прагмы до конца зоны описания, связанной с самым внутренним объемлющим оператором блока или программным модулем. Если прагма задана в спецификации пакета, то ее действие распространяется до конца области действия именованного понятия.
Если в прагму включено имя, то возможность подавления проверки в дальнейшем ограничена: прагма действует только для операций над объектом с этим именем или над всеми объектами базового типа для указанного в прагме имени типа или подтипа, для вызовов подпрограмм с этим именем, для активизации задач указанного именем задачного типа и для конкретизации указанного настраиваемого модуля.
Следующие проверки соответствуют ситуациям, в которых может быть возбуждено исключение CONSTRAINT_ERROR. В этих проверках имя (если оно указано) должно обозначать объект или тип
ACCESS_CHECK | Проверяется именуемая компонента, индексируемая компонента, отрезок или атрибут объекта, указанный ссылочным значением на неравенство значению null этого ссылочного значения. | ||
DISCRIMINANT_CHECK | Проверяется, что дискриминант составного значения удовлетворяет ограничению дискриминанта. Также при ссылке на компоненты записи проверяется их существование для текущих значений дискриминанта. | ||
INDEX_CHECK | Проверяется, что границы значений индексов массива равны соответствующим границам ограничения индекса. Также при ссылке на компоненту массива по каждой размерности проверяется, что данное значение индекса находится в диапазоне, определенном границами индекса массива; при ссылке на отрезок массива проверяется, что заданный дискретный диапазон совместим с диапазоном, определенным границами индексов массива. | ||
LENGTH_CHECK | Проверяется, что каждой компоненте массива соответствует подходящая компонента при выполнении присваивания массиву, преобразовании типа и выполнении логических операций над массивами логических компонент. | ||
RANGE_CHECK | Проверяется, что некоторое значение удовлетворяет ограничению диапазона. Также при предвыполнении указания подтипа проверяется совместимость ограничения (если оно имеется) с обозначением типа. Для агрегата проверяется принадлежность индекса или дискриминанта соответствующему подтипу. Наконец, осуществляются проверки любых ограничений, создаваемых при конкретизации настройки. |
/p>
Следующие проверки соответствуют ситуациям, в которых возбуждается исключение NUMERIC_ERROR. Допустимыми именами в соответствующих прагмах являются имена числовых типов.
DIVISION_CHECK |
Проверяется, что второй операнд операций /, rem и mod не равен нулю. |
OVERFLOW_CHECK |
Проверяется, что в результате выполнения числовой операции не возникает переполнения. |
Следующие проверки соответствуют ситуациям, в которых возбуждается исключение PROGRAM - ERROR. Допустимыми именами в соответствующих прагмах являются имена задач-ных модулей, настраиваемых модулей или подпрограмм.
ELABORATION_CHECK |
Когда вызывается подпрограмма, выполняется активизация задачи или предвыполняется конкретизация настройки, то проверяется, что тело соответствующего программного модуля уже предвыполнено. |
Следующие проверки соответствуют ситуациям, в которых возбуждается исключение STORAGE_ERROR. Допустимыми именами в соответствующих прагмах являются имена, обозначающие ссылочные типы. задачные модули или полпппгпяммм
STORAGE_ERROR |
Проверяется, что выполнение генератора не потребует объема памяти, большего, чем необходимо для выбора, или что требуемый под задачу или для подпрограммы объем памяти достаточен. |
Если возникает ошибочная ситуация в отсутствие проверок во время выполнения программы, то программа считается ошибочной (результаты выполнения не определяются в языке).
Примеры:
pragma SUPPRESS (RANGE_CHECK);
pragma SUPPRESS (INDEX_CHECK, ON => TABLE);
Примечание.
Для некоторых реализации может оказаться невозможным или слишком дорогим подавление некоторых проверок, тогда соответствующая прагма SUPPRESS может быть проигнорирована. Следовательно, наличие такой прагмы внутри данного модуля не гарантирует, что соответствующее исключение не будет возбуждено; эти исключения также могут распространяться вызванными модулями.
;i
Ссылки:
агрегат 4.3, активизация 9.3, атрибут 4.1.4, вызов подпрограмм????? |4.8, дискретный диапазон 3.6, дискриминант 3.7.1, задача 9, задачный модуль 9, задачный тип 1'9.1, идентификатор 2.3, именуемый тип 3.7, индекс 3.6, индексируемая компонента 4.1.1, исключение CONSTRAINT_ERROR 11.1, исключение NUMERIC_ERROR 11.1, исключение PROGRAM_ERROR 11.1, компонента записи 3.7, компонента массива 3.6, конкретизация наст-ройки 12.3, массив 3.6, набор 3.8, настраиваемое тело 11.1, настраиваемый модуль 12, обозначение 3.8, обозначение типа 3.3.2, объект 3.2, ограничение 3.3, ограничение диапазона 3.5, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, оператор блока 5.6, операция 3.3.3, отрезок 4.1.2, ошибочная ситуация 11, ошибочный 1.6, предвыполнение 3.1, 3.9, подпрограмма 6, подтип 3.3, прагма 2.8, программный модуль 6, простое имя 4.1, раздел описаний 3.9, размерность 3.6, распространение исключения 11.4, расширенное имя 4.1.3, совместимый 3.3.2, составной тип 3.3, спецификация пакета 7.1, ссылочное значение 3.8, ссылочный тип 3.8, субмодуль 10.2, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, тип 3.3, числовая операция 3.5.5, 3.5.8, 3.5.10, числовой тип 3.5.
Пред. | Уровень выше | След. |
11.6. ИСКЛЮЧЕНИЯ И ОПТИМИЗАЦИЯ |
Содержание | Глава 12. НАСТРАИВАЕМЫЕ МОДУЛИ |
Порядок компиляции
Правила, определяющие порядок компилирования модулей, являются непосредственным следствием правил видимости и, в частности, того факта, что любой библиотечный модуль, упомянутый в спецификаторе контекста компилируемого модуля, видим в нем.
Компилируемый модуль должен компилироваться после всех библиотечных модулей, указанных в его спецификаторе контекста. Вторичный модуль, являющийся телом подпрограммы или пакета, должен компилироваться после соответствующего библиотечного модуля. Любой субмодуль родительского компилируемого модуля должен компилироваться после него.
Компилирование, при котором в компилируемом модуле обнаружена ошибка, считается неудавшимся и никак не влияет на программную библиотеку; то же самое относится и к перекомпиляции (никакой компилируемый модуль не может стать устаревшим вследствие такой перекомпиляции).
Порядок компилирования компилируемых модулей программы должен отвечать частичной упорядоченности, определенной приведенными выше правилами.
Аналогичные правила применяются при перекомпиляции. На компилируемый модуль потенциально влияет изменение любого библиотечного модуля, упомянутого в его спецификаторе контекста. На вторичный модуль потенциально влияет изменение соответствующего библиотечного модуля. На субмодуль потенциально влияет изменение родительского компилируемого модуля. В результате успешной перекомпиляции компилируемого модуля все компилируемые модули, на которые потенциально влияет данный, считаются устаревшими и должны перекомпилироваться, кроме тех, которые больше не нужны. Реализация может уменьшить стоимость перекомпиляции, если установит, что данные изменения не повлияли на модули, которые находились под потенциальным влиянием данного.
Перекомпилирование субмодулей некоторого модуля на сам этот модуль никакого влияния не оказывает. Изменения в теле подпрограммы или пакета не влияют на другие компилируемые модули (кроме субмодулей этого тела), так как эти компилируемые модули имеют доступ только к спецификации подпрограммы или пакета.
В реализации допустимы описанные ниже отступления от этого правила, связанные с открытыми подстановками, некоторыми оптимизациями, осуществляемыми компилятором, и некоторыми аспектами реализации настраиваемых программных модулей.
• Если прагма INLINE применяется к описанию подпрограммы в спецификации пакета, то открытая подстановка возможна, только если тело пакета откомпилировано раньше модулей, вызывающих эту подпрограмму. В таком случае открытая подстановка создает
зависимость
вызывающего модуля от тела пакета; компилятор должен распознавать такую зависимость при определении необходимости перекомпиляции. Если вызывающий модуль компилируется раньше, чем тело пакета, то для таких вызовов прагма INLINE может игнорироваться компилятором (при этом может быть выдано предупреждение о невозможности открытой подстановки). То же относится и к раздельно компилируемой подпрограмме, к которой применяется прагма INLINE.
• С целью оптимизации реализация может компилировать несколько модулей данной компиляции, создавая при этом дальнейшие зависимости между этими компилируемыми модулями. Эти зависимости должны учитываться компилятором для определения необходимых перекомпиляций.
• Реализация может требовать, чтобы описание настройки и соответствующее тело были частями одной и той же компиляции независимо от того, раздельно ли компилируется настраиваемый модуль или он локален в другом компилируемом модуле. Реализация может также требовать, чтобы субмодули настраиваемого модуля были частью одной и той же компиляции.
Примеры порядка компиляции:
а. В примере 1 (см. 10.1.1) процедура QUADRATIC-EQUATION должна компилироваться после библиотечных пакетов TEXT-10 и REAL-OPERATIONS, так как они упомянуты в спецификаторе совместности процедуры.
б. В примере 2 (см. 10.1.2) тело пакета STOCK должно компилироваться после соответствующей спецификации пакета.
в. В примере 2 (см. 10.1.2) спецификация пакета STOCK должна компилироваться до процедуры PROCESSOR.
С другой стороны, процедура PROCESSOR может компилироваться как до, так и после тела пакета STOCK.
г. В примере 3 (см. 10.2.1) процедура G должна компилироваться после пакета TEXT-10, так как этот пакет упомянут в спецификаторе совместности процедуры G. В то же время пакет TEXT-10 может компилироваться как до, так и после процедуры ТОР.
д. В примере 3 (см. 10.2.1) субмодули TRANSFORM и FACILITY должны компилироваться после главной программы ТОР. Субмодуль G должен компилироваться после его родительского модуля FACILITY.
Примечание.
Для библиотечных пакетов из правил перекомпиляции следует, что тело пакета становится устаревшим после перекомпиляции соответствующей спецификации. Если новая спецификация пакета не требует задания тела (т. е. она не содержит описаний программных модулей), то перекомпиляции тела такого пакета не требуется. В любом случае устаревшее тело пакета не должно использоваться и поэтому может быть удалено из программной библиотеки.
Ссылки:
библиотечный модуль 10.1, видимость 8.3, вторичный модуль 10.1, имя 4.1, компилируемый модуль 10.1, компиляция 10.1, локальное описание 8.1, настраиваемый модуль 12, настраиваемое тело 12.2, описание настройки 12.1, описание подпрограммы 6.1, пакет 7, переменная 3.2.1, прагма INLINE 6.3.2, предвыполнение 3.9, процедура 6.1, родительский модуль 10.2, соответствующее тело 3.9, спецификатор контекста 10.1.1, спецификатор совместности 10.1.1, спецификация пакета 7.1, спецификация подпрограммы 6.1, субмодуль 10.2, тело пакета 7.1, тело подпрограммы 6.3, тело процедуры 6.3, тип 3.3.
Пред. | Уровень выше | След. |
10.2. СУБМОДУЛИ КОМПИЛИРУЕМЫХ МОДУЛЕЙ |
Содержание | 10.4. ПРОГРАММНАЯ БИБЛИОТЕКА |
Последняя версия
Электронная версия перевода доступна по адресу http://ada-rm.euro.ru/
Пред. | Уровень выше | След. | |
СПРАВОЧНОЕ РУКОВОДСТВО ПО ЯЗЫКУ АДА 83 | Содержание | ПРЕДИСЛОВИЕ |
Прагмы
Прагма используется для задания информации компилятору. Прагма начинается зарезервированным словом pragma, за которым следует идентификатор — имя прагмы.
прагма ::=pragma идентификатор [(сопоставление-аргумента {, сопоставление-аргумента })];
сопоставление-аргумента ::= [идентификатор-аргумента => ] имя [идентификатор-аргумента => ] выражение
Прагмы допустимы только в следующих местах программы:
• После ограничителя точки с запятой, но не внутри раздела формальных параметров или раздела дискриминантов.
• В любом месте, где синтаксические правила допускают синтаксические понятия, в названии которых содержатся слова «описание», «оператор», «спецификатор» или «альтернатива», или одно из синтаксических понятий—вариант и обработчик исключений, но не вместо соответствующих конструкций, а также в любом месте, где допустим компилируемый модуль.
На месторасположение отдельных прагм могут накладываться дополнительные ограничения.
Некоторые прагмы имеют аргументы. Сопоставления аргументов могут быть либо позиционными, либо именованными, как и при сопоставлении параметров в вызовах подпрограмм (см. 6.4). Однако именованные сопоставления возможны, если определены идентификаторы аргументов. Именем аргумента должно быть либо имя, видимое в месте употребления прагмы, либо идентификатор, специфический для этой прагмы.
Предопределенные прагмы описаны в приложении В; они должны поддерживаться в каждой реализации. Реализация может определить дополнительные прагмы. Они должны быть описаны в приложении F. Реализация не должна допускать определение прагм, наличие или отсутствие которых влияет на правильность текста программы. Следовательно, правильность программы не зависит от наличия или отсутствия прагм, определенных реализацией.
Прагма, не определенная в языке, не дает никакого результата, если ее идентификатор не распознан (данной) реализацией. Более того, прагма (как определенная в языке, так и определенная реализацией) не дает никакого результата, если ее размещение или ее аргументы не соответствуют допустимым для прагмы.
Участок текста, на который распространяется действие прагмы, зависит от прагмы.
Примеры:
pragma LIST(OFF); pragma OPTIMIZE(TIME); pragma INLINE(SETMASK); pragma SUPPRESS(RANGE_CHECK, ON => INDEX);
Примечание.
Рекомендуется (но не требуется), чтобы реализация выдавала предупреждающие сообщения о прагмах, которые не распознаны и поэтому проигнорированы.
Ссылки:
вариант 3.7.3, видимость 8.3, выражение 4.4, компилируемый модуль 10.1, зарезервированное слово 2.9, идентификатор 2.3, имя 4.1, обработчик исключения 11.2, ограничитель 2.2, оператор 5, правильный 1.6, прагма, зависящая от реализации F, прагма, зависящая от языка В, раздел дискриминантов 3.7.1, статическое выражение 4.9.
Понятие со словом «описание»:
описание входа 9.5, описание компоненты 3.7, описание параметра настройки 12.1, основное описание 3.1.
Понятие со словом «спецификатор>:
спецификатор выравнивания 13.4, спецификатор использования 8.4, спецификатор компоненты 13.4, спецификатор контекста 10.1.1, спецификатор представления 13.1, спецификатор совместности 10.1.1.
Понятие со словом «альтернатива»:
альтернатива завершения 9.7.1, альтернатива задержки 9.7.1, альтернатива оператора выбора 5.4, альтернатива отбора 9.7.1, альтернатива отбора с ожиданием 9.7.1, альтернатива принятия 9.7.1.
Пред. | Уровень выше | След. |
2.7. КОММЕНТАРИИ | Содержание | 2.9. ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА |
результат коллективных усилий по разработке
Язык Ада - результат коллективных усилий по разработке единого языка программирования больших систем и систем реального времени.
Разработка проекта единого языка программирования высокого уровня была начата в 1974 г. Требования министерства обороны США были формализованы в серии документов, которые тщательно изучались службами министерства, промышленными организациями, университетами, а также министерствами обороны зарубежных стран. Язык Ада был разработан в соответствии с окончательным видом этих требований (1978 г.), изложенных в их спецификации под названием "Steelman" [1]
.
В группу разработчиков языка Ада, возглавляемую Жаном Д. Ишбиа, входили: Берндт Криг-Брукнер, Бриан А. Уичман, Анри Ф. Ледгар, Жан-Клод Элиар, Жан-Лоу Гэлли, Жан-Раймонд Абриал, Джон Г. П. Бэрнс, Майкл Вуджер, Оливер Рубин, Пол Н. Хилфингер и Роберт Фирс.
С группой разработчиков были тесно связаны несколько человек, которые на разных фазах проекта внесли большой вклад в работу. Это: Дж. Б. Гудинаф, Р. Ф. Брендер, М. В. Дэвис, Г. Ферран, К. Лестер, А. МакЛарен, Е. Морель, И. Р. Нэсси, Я. К. Пайл, С. А. Шуман и С. К. Вестал.
На втором этапе этой разработки были одновременно начаты работы в двух направлениях, которые оказали глубокое влияние на язык. Одно из них - разработка формального определения языка с использованием денотационной семантики. В этой работе принимали участие: В. Донзо-Гуж, Г. Кан и Б. Ланг. Другое - разработка пробного транслятора. В этой работе принимали участие: К. Рипкен, Р. Болье, П. Кадо, Дж. Холден, Дж. Ф. Хуэрас, Р. Г. Лан-ге, Д. Т. Корнхил. Успеху работы способствовала постоянная помощь со стороны Лин Черчилль и Марион Майерс и эффективная техническая поддержка со стороны Б. Гравем, В. Л. Хаймердингера и П. Клива. Руководил проектом X. Г. Шмитц.
В течение пяти лет работы над этим проектом было проведено несколько рабочих совещаний продолжительностью в одну неделю, в которых приняли участие: П. Белмонт, Б. Броз-гол, П. Коэн, Р. Дево, А. Эванс, Г.
Фишер, X. Харт, А. Л. Хиссен, П. Кнуэвеп, М. Крунентал, Н. Ломато, Э. Плодередер, Г. Зигмюллер, В. Стеннинг, Д. Таффс, а также Ф. Белц, Р. Конверс, К. Коррел, А. Н. Хаберманн, Дж. Саммет, С. Сквайерс, Дж. Теллер, Р. Вегнер и П. Р. Везерол.
Своими замечаниями, критикой и предложениями влияние на проект оказали несколько человек. Это были: П. Бринч Хансен, Г. Гооз, К. А. Р. Хоар, Марк Рэйн, В. А. Вулф, а также Е. Боебер, П. Боннар, X. Клаузен, М. Кокс, Г. Дисмукс, Р. Ичус, Т. Фрогат, X. Ганцингер, К. Хью-итт, С. Камин, Р. Котлер, О. Лекарм, Дж. А. Н. Ли, Дж. Л. Мансион, Ф. Минел, Т. Финни, Дж. Рой-рих, В. Шнайдер, А. Сингер, Д. Шлосберг, И. К. Ванд, рецензенты из групп Ада-Европа, AdaTEC, Afeet, LMSC и рецензенты из токийской группы.
Рецензии и замечания, многочисленные отчеты об исследованиях, полученные по окончании обоих этапов, девятьсот отчетов по вопросам, связанным с языком, и отчетов об исследованиях и проверке, полученных из пятидесяти различных стран на третьем этапе проекта, тысячи замечаний, полученных в результате работ по стандартизации ANSI, а также текущая работа рабочей группы LTPL-E Комитета Падуя - Европа - все это оказало существенное влияние на окончательное определение языка Ада.
Широкая поддержка была оказана со стороны военных ведомств и агентств. Сюда входят финансирование, обширные рецензии и огромный личный вклад членов рабочей группы по языкам высокого уровня и других заинтересованных лиц. В частности, Уильям А. Уиттекер возглавлял данную программу на ее организационных этапах, а Дэвид А. Фишер обеспечил успешную разработку документов, содержащих требования к языку, которые привели к появлению спецификации требований "Steelman".
Данное определение языка было разработано силами исследовательских центров фирм Ханиуэлл и Ханиуэлл-Буль, а позднее Alsys по контракту с министерством обороны США. В роли технического представителя правительства США выступал В. Е. Карлсон, а позднее Лар-ри Э. Драффел и Роберт Е. Масис, успешно координировавшие труд всех участников проекта по языку Ада.
[1]
Далее стилмановские требования. - Прим. ред.
Пред. | Уровень выше | След. |
Содержание | Глава 1. ВВЕДЕНИЕ |
к языку Ада объясняется тем
Огромное внимание к языку Ада объясняется тем обстоятельством, что в нем формализовано около 40 современных методов программирования доступными техническими и лексическими средствами. Это, с одной стороны, усложняет реализацию языка, а с другой стороны, упрощает его использование во многих областях применения ЭВМ.
Стандарт описания языка Ада обеспечивает совместимость систем программирования на уровне исходных текстов программ. Внедрение единого языка программирования должно привести к существенному сокращению количества дублирующих работ и учебных курсов по применению ЭВМ, а также будет способствовать взаимопониманию различных участников создания программ (заказчиков, программистов и пользователей). Так, например, в США стандарт описания языка Ада за последние три года обеспечил разработку 160 совместимых по языку компиляторов, из которых 70 прошли аттестацию как компиляторы, соответствующие полному описанию языка. В СССР существует более 20 групп, реализующих системы программирования на основе языка Ада. Назрела необходимость в стандартизации описания языка в СССР и в странах - членах СЭВ. Публикация перевода этой книги будет способствовать достижению совместимости по исходным текстам программ всех систем программирования на различных типах ЭВМ.
Перевод книги существенно осложнялся большим объемом описания языка (63 зарезервированных слова, 180 синтаксических понятий, 1000 семантических понятий, 5000 общеупотребительных повествовательных слов) и ряд противоречивых требований к терминологии: учет контекста, независимость, уникальность, краткость, отсутствие синонимии. Переводчики стремились придерживаться терминологических традиций отечественной литературы по программированию, чему способствовала пятилетняя дискуссия по терминологии в Рабочей группе по языку программирования Ада Комиссии по языкам и системам программирования при ГКНТ СССР.
Книга может быть использована как пособие по проектированию, разработке, отладке и сопровождению больших и сверхбольших программ. Ее изучение позволит программистам уточнить свои знания языка Ада и более эффективно осуществлять поиск ошибок в текстах программ.
Большую помощь в работе над переводом стандарта ANSI описания языка Ада оказали Н. Е. Богородская, Н. Л. Жданова, В. Г. Коневских, В. М. Курочкин, В. В. Лукашев, А. П. Попов, Е. П.Фадеева.
Над переводом второй части книги работали В. А. Хитров, В. П. Чепкасов, А. В. Черепанов.
А. А. Красилов
Предвыполнение библиотечных модулей
Перед выполнением главной программы все библиотечные модули, необходимые для главной программы, и тела этих модулей (если они есть) предвыполняются. Такими библиотечными модулями являются модули, упомянутые в спецификаторах совместности для главной программы, ее тела и субмодулей, а также модули, упомянутые в спецификаторах совместности для этих библиотечных модулей, их тел и субмодулей, и т. д. вплоть до получения транзитивного замыкания.
Предвыполнение таких библиотечных модулей и их тел производится в соответствии с частичной упорядоченностью, определяемой спецификаторами совместности (см. 10.3). Кроме того, библиотечный модуль, упомянутый в спецификаторе контекста для субмодуля, должен быть предвыполнен до тела библиотечного модуля-предка этого субмодуля.
Порядок предвыполнения, отвечающий такому отношению упорядоченности, не всегда обеспечивает выполнение следующего требования: тело любого библиотечного модуля пред-выполняется прежде любого другого компилируемого модуля, при предвыполнении которого необходимо предвыполнение тела этого библиотечного модуля. Для указания необходимости более раннего предвыполнения тел библиотечных модулей используется прагма ELABORATE.
Эта прагма записывается в виде
pragma ELABORATE (простое-имя-библиотечного-модуля {, простое-имя-библиотечного-модуля });
Такие прагмы допустимы только непосредственно после спецификатора контекста компилируемого модуля (до следующего за ним библиотечного или вторичного модуля). Аргументы этой прагмы должны быть простыми именами библиотечных модулей, упомянутых в спецификаторе контекста, и каждый такой библиотечный модуль должен иметь соответствующее тело. Эта прагма указывает, что тело библиотечного модуля должно предвыполняться до данного компилируемого модуля. Если данный компилируемый модуль — субмодуль, то тело библиотечного модуля должно предвыполняться до тела библиотечного модуля-предка (субмодуля).
Программа неправильна, если не может быть найден необходимый порядок предвыполнения (т.
е. если существуют циклические зависимости). Предвыполнение компилируемых модулей программы в остальных случаях осуществляется в некотором порядке, который не определен в языке.
Ссылки:
аргумент прагмы 2.8, библиотечный модуль 10.1, в некотором порядке 1.6, вторичный модуль 10.1, главная программа 10.1, допустим 1.6, зависимость между компилируемыми ^модулями 10.3, имя 4.1, компилируемый модуль 10.1, неправильна 1.6, простое имя 4.1, специ-|фикатор контекста 10.1.1, спецификатор совместности 10.1.1, субмодуль 10.2, раздельная компиляция 10.1.
Пред. | Уровень выше | След. |
10.4. ПРОГРАММНАЯ БИБЛИОТЕКА |
Содержание | 10.6. ОПТИМИЗАЦИЯ ПРОГРАММЫ |
Преобразование типа
Вычисление явного преобразования типа — это вычисление выражения, заданного в качестве операнда, и преобразование результата в значение указанного целевого типа. Явные преобразования типов допустимы между взаимосвязанными типами.
преобразование-типа ::= обозначение-типа (выражение)
Целевой тип преобразования типа — это базовый тип обозначения типа. Тип операнда преобразования типа должен быть определимым независимо от контекста (в частности, независимо от целевого- типа). Более того, недопустимо, чтобы операнд преобразования типа был литералом
null,
генератором, агрегатом или строковым литералом; задание в качестве операнда преобразования типа выражения, заключенного в скобки, допускается, только если само выражение является допустимым.
Преобразование к подтипу состоит в преобразовании к целевому типу с последующей проверкой принадлежности результата этому подтипу. Допускается преобразование операнда заданного типа к тому же самому типу.
Другие явные преобразования типов допустимы в следующих трех случаях:
а. Числовые типы.
Операнд может быть любого числового типа, значение операнда преобразуется в значение целевого типа, который должен быть также числовым. Для преобразования вещественных типов точность результата лежит в пределах точности заданного подтипа (см. 4.5.7). Преобразование значения вещественного типа в значение целого типа состоит в его округлении до ближайшего целого; для вещественного операнда, равноотстоящего от двух целых (с точностью этого вещественного подтипа), округление может быть произведено как в ту, так и в другую сторону.
б. Производные типы.
Преобразование допустимо, если целевой тип и тип операнда являются производными один от другого, непосредственно или косвенно, или если существует третий тип, от которого производными являются тип операнда и целевой тип, непосредственно или косвенно.
в. Индексируемые типы.
Преобразование допустимо, если тип операнда и целевой тип — индексируемые типы, которые удовлетворяют следующим условиям: оба типа должны иметь одну и ту же размерность; в каждой позиции индекса типы индексов должны быть либо одинаковыми, либо взаимопреобразуемыми; типы компонент должны быть одинаковыми; наконец, если тип компоненты — тип с дискриминантами или ссылочный тип, то подтипы компонент должны быть оба либо ограниченными, либо неограниченными.
Если обозначение типа задает неограниченный индексируемый тип, то для каждой позиции индекса границы результата преобразования определены преобразованием границ операнда в значения соответствующего типа индекса целевого типа. Если обозначение типа задает ограниченный индексируемый тип, то границы результата совпадают с границами, указанными в обозначении типа. В обоих случаях значение каждой компоненты результата определяется соответствующей компонентой операнда (см. 4.5.2).
При вычислении преобразований числовых и производных типов возбуждается исключение CONSTRAINT_ERROR, если результат преобразования не удовлетворяет заданным в обозначении типа ограничениям.
При преобразовании индексируемых типов проверяется тот факт, что любое ограничение подтипа компоненты одинаково для индексируемого типа операнда и для целевого индексируемого типа. Если обозначение типа задает неограниченный индексируемый тип и если операнд не является пустым массивом, то для каждой позиции индекса проверяется принадлежность границ результата соответствующему подтипу индекса целевого типа. Если обозначение типа задает ограниченный индексируемый подтип, то для каждой компоненты операнда проверяется наличие соответствующей компоненты целевого подтипа, и наоборот. Если хотя бы одна из этих проверок дает отрицательный результат, возбуждается исключение CONSTRAINT_ERROR.
Если допустимо преобразование одного типа в другой, то также допустимым является и обратное преобразование. Это обратное преобразование используется тогда, когда фактический параметр вида
in out
или
out
имеет форму преобразования типа имени (переменной), как это поясняется в разд. 6.4.1.
Единственной допустимой формой неявного преобразования типа является преобразование значения
универсального-целого
или
универсального-вещественного
типов в значение другого числового типа. Неявное преобразование операнда
универсального-целого
типа в другой целый тип или операнда
универсального-вещественного
типа в другой вещественный тип возможно только для операнда, являющегося либо числовым литералом, либо именованным числом, либо атрибутом; в этом разделе такой операнд называется
преобразуемым
универсальным операндом. Неявное преобразование преобразуемого универсального операнда применимо тогда и только тогда, когда самый сложный полный контекст (см. 8.7) определяет единственный (числовой) целевой тип для этого неявного преобразования и, кроме этого преобразования, не существует иной, предписанной языком правильной интерпретации этого контекста.
Примечание.
Правила для неявных преобразований подразумевают, что для операнда явного преобразования типа не производится никаких неявных преобразований. Аналогично не производится никаких неявных преобразований для операндов предопределенных операций отношения, являющихся преобразуемыми универсальными операндами.
Для индексируемых типов в языке допускается неявное преобразование подтипов (см. 5.2.1). Последствием явного преобразования типа может быть изменение представления (в частности, см. 13.6). Явные преобразования используются также для фактических параметров (см. 6.4).
Примеры преобразования числовых типов:
RЕАL(2 * J) -- значение преобразуется к плавающему типу INТЕGЕR(1.6) -- значение равно 2 INТЕGЕR(-0.4) -- значение равно 0
Примеры преобразования производных типов:
type A_FORM is new BFORM;
X : AFORM; Y : BPORM;
X := A_FORM(Y); Y := B_FORM(X); -- обратное преобразование
Примеры преобразования индексируемых типов:
type SEQUENCE is array (INTEGER range <>) of INTEGER: subtype DOZEN is SEQUENCE(1 .. 12); LEDGER : array(1 .. 100) of INTEGER;
SEQUENCE(LEDGER) -- с границами как у LEDGER SEQUENCE(LEDGER(31 .. 42)) -- с границами 31—42 DOZEN(LEDGER(31 .. 42)) -- с границами как у DOZEN
Примеры неявных преобразований:
Х : INTEGER := 2; X + 1 + 2 -- неявное преобразование каждого целого литерала 1 + 2 + X -- неявное преобразование каждого целого литерала X + (1 + 2) -- неявное преобразование каждого целого литерала
2 = (1 + 1) -- тип - универсальный-целый
-- неявных преобразований нет A'LENGTH = B'LENGTH -- то же, что и выше С : constant := 3 + 2 -- то же, что и выше X = 3 and 1 = 2 -- неявное преобразование 3, но не 1 и 2
Ссылки:
атрибут 4.1.4, базовый тип 3.3, вещественный тип 3.5.6, вид 6.1, возбуждение исключений 11, выражение 4.4, именованное число 3.2, имя 4.1, индекс 3.6, индексируемый тип 3.6, исключение CONSTRAINED-ERROR 11.1, компонента 3.3, неограниченный индексируемый тип 3.6, обозначение типа 3.3.2, ограниченный индексируемый подтип 3.6, оператор 5, переменная 3.2.1, плавающий тип 3.5.7, подтип 3.3, подтип индекса 3.6, представление 13.1, принадлежать подтипу 3.3, производный тип 3.4, пустой массив 3.6.1, размерность 3.6, сопоставленная компонента 4.5.2, тип 3.3, тип индекса 3.6, универсальный вещественный тип 4.5.6, универсальный целый тип 3.5.4, фактический параметр 6.4.1, целый тип 3.5.4, числовой литерал 2.4, числовой тип 3.5.
Пред. | Уровень выше | След. |
4.5. ОПЕРАЦИИ И ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЯ |
Содержание | 4.7. КВАЛИФИЦИРОВАННЫЕ ВЫРАЖЕНИЯ |
a атрибуты, предопределенные в языке
P'ADDRESS | Префикс Р обозначает объект, программный модуль, метку или вход. Вырабатывает адрес первого кванта памяти, отведенной под Р. Для подпрограммы, пакета, задачи или метки это значение ссылается на машинный код, связанный с соответствующим телом или оператором. Для входа, для которого задан спецификатор адреса, это значение ссылается на соответствующее аппаратное прерывание. Значение этого атрибута имеет предопределенный в пакете SYSTEM тип ADDRESS (см. 13.7.2). | ||
P'AFT | Префикс Р обозначает фиксированный подтип. Вырабатывает число десятичных цифр после точки, необходимых для обеспечения точности подтипа Р, если только атрибут DELTA подтипа Р не превышает 0.1, в этом случае атрибут вырабатывает значение единицы. (P'AFT — это наименьшее положительное число N, для которого (10 ** N)*P' DELTA больше или равно 1.) Значение этого атрибута имеет
универсальный-целый тип (см. 3.5.10). | ||
P'BASE | Префикс Р обозначает тип или подтип. Этот атрибут обозначает базовый тип Р и может быть только префиксом имени другого атрибута, например P'BASE'FIRST (см. 3.3.3). | ||
P'CALLABLE | Префикс Р — это объект задачного типа. Вырабатывает значение FALSE, когда выполнение задачи Р либо закончено, либо завершено, либо задача находится в аварийном состоянии. В остальных случаях вырабатывает значение TRUE. Значение этого атрибута имеет предопределенный тип BOOLEAN (см. 9.9). | ||
P'CONSTRAINED | Префикс Р обозначает объект некоторого типа с дискриминантами. Вырабатывает значение TRUE, если ограничение дискриминантов наложено на объект Р или если объект — константа (включая формальный параметр или формальный параметр настройки вида in). В остальных случаях вырабатывает значение FALSE. Если Р — формальный параметр настройки вида in out или если Р — формальный параметр вида in out или out, а обозначение типа, заданное в соответствующей спецификации параметра, обозначает неограниченный тип с дискриминантами, то значение этого атрибута получается из значения атрибута соответствующего фактического параметра. Значение атрибута имеет предопределенный тип BOOLEAN (см. 3.7.4). | ||
P'CONSTRAINED | Префикс Р обозначает личный тип или подтип. Вырабатывает значение FALSE, если Р обозначает неограниченный неформальный личный тип с дискриминантами; вырабатывает это же значение, если Р обозначает настраиваемый формальный личный тип, а соответствующий фактический подтип — это либо неограниченный тип с дискриминантами, либо неограниченный индексируемый тип. В остальных случаях вырабатывается значение TRUE. Значение этого атрибута имеет предопределенный тип BOOLEAN (см. 7.4.2). | ||
P'COUNT | Префикс Р обозначает вход задачи. Вырабатывает число вызовов входа, присутствующих в очереди этого входа, (если атрибут вычисляется внутри оператора принятия входа Р, то в это число не входит вызывающая задача). Значение этого атрибута имеет
универсальный-целый тип (см. 9.9). | ||
Р'DELTA | Префикс Р обозначает фиксированный подтип. Вырабатывает значение дельты, заданной в определении точности фиксированного типа для подтипа Р. Значение этого атрибута имеет
универсальный-вещественный тип (см. 3.5.10) | ||
P'DIGITS | Префикс Р обозначает плавающий подтип. Вырабатывает число десятичных цифр в десятичной мантиссе модельных чисел подтипа Р. (Этот атрибут вырабатывает число D, определенное в разд. 3.5.7.) Значение этого атрибута имеет
универсальный-целый тип (см. 3.5.8). | ||
P'EMAX | Префикс Р обозначает плавающий подтип. Вырабатывает наибольшее значение порядка двоичной канонической формы модельных чисел подтипа Р. (Этот атрибут вырабатывает произведение 4*В.) Значение этого атрибута имеет
универсальный-целый тип (см. 3.5.8). | ||
P'EPSILON | Префикс Р обозначает плавающий подтип. Вырабатывает абсолютное значение разности между модельным числом 1.0 и следующим модельным числом подтипа Р. Значение этого атрибута имеет
универсальный-вещественный тип (см. 3.5.8). | ||
P'FIRST | Префикс Р обозначает скалярный тип или подтип скалярного типа. Вырабатывает значение нижней границы Р. Значение этого атрибута имеет тип Р (см. 3.5). | ||
P'FIRST | Префикс Р соответствует индексируемому типу или обозначает ограниченный индексируемый подтип. Вырабатывает значение нижней границы диапазона первого индекса. Значение этого атрибута имеет тот же тип, что и тип значения нижней границы (см. 3.6.2 и 3.8.2). | ||
P'FIRST(N) | Префикс Р соответствует индексируемому типу или обозначает ограниченный индексируемый подтип. Вырабатывает значение нижней границы диапазона N-го индекса. Значение этого атрибута имеет тот же тип, что и указанная нижняя граница. Аргумент N должен быть статическим выражением типа
универсальный-целый. Значение N должно быть положительным (ненулевым) и не превосходить размерности массива (см. 3.6.2 и 3.8.2). | ||
P'FIRST_BIT | Префикс Р обозначает компоненту записи. Вырабатывает величину смещения первого бита относительно начала первого кванта памяти, занимаемой этой компонентой. Величина смещения измеряется числом битов. Значение этого атрибута имеет тип
универсальный-целый (см. 13.7.2). | ||
P'FORE | Префикс Р обозначает фиксированный подтип. Вырабатывает минимальное число символов, необходимых для десятичного представления целой части любого значения подтипа Р в предположении, что это представление не включает порядок, но включает односимвольный префикс, который является либо знаком минус, либо пробелом. (Это минимальное число не учитывает предшествующие нули и символы подчеркивания и по меньшей мере равно двум.) Значение этого атрибута имеет
универсальный-целый тип (см. 3.5.10). | ||
P'IMAGE(X) | Префикс Р обозначает дискретный тип или подтип. Этот атрибут представляет собой функцию с одним параметром. Фактический параметр Х должен быть значением базового типа Р. Тип результата — предопределенный тип STRING. Результат представляет собой образ значения X, т. е. последовательность символов, представляющих изображение значения. Образу целого значения соответствуют десятичный литерал без символов подчеркивания, предшествующих нулей, порядка и последующих пробелов, но с одним символом слева, который представляет собой либо минус, либо пробел. Образом литерала перечисления является либо соответствующий идентификатор из прописных букв, либо соответствующий символьный литерал (включая два апострофа) без предшествующих и последующих пробелов. Образ символа, отличного от графического, определяется реализацией (см. 3.5.5). | ||
P'LARGE | Префикс Р обозначает вещественный подтип. Вырабатывает наибольшее положительное модельное число подтипа Р. Значение этого атрибута имеет
универсальный-вещественный тип (см. 3.5.8 и 3.5.10). | ||
P'LAST | Префикс Р обозначает скалярный тип или подтип скалярного типа. Вырабатывает значение верхней границы Р. Значение этого атрибута имеет тип Р (см. 3.5). | ||
P'LAST | Префикс Р соответствует индексируемому типу или обозначает ограниченный индексируемый подтип. Вырабатывает значение верхней границы диапазона первого индекса. Значение атрибута имеет тип верхней границы (см. 3.6.2 и 3.8.2). | ||
P'LAST(N) | Префикс Р соответствует индексируемому типу или обозначает ограниченный индексируемый подтип. Вырабатывает значение верхней границы диапазона N-го индекса. Значение этого атрибута имеет тот же тип, что и верхняя граница. Аргумент N должен быть статическим выражением типа
универсальный-целый. Значение N должно быть положительным (ненулевым) и не превышать размерности массива (см. 3.6.2 и 3.8.2). | ||
P'LAST_BIT | Префикс Р обозначает компоненту записи. Вырабатывает величину смещения последнего бита относительно первого кванта памяти, занимаемой этой компонентой. Величина смещения измеряется числом битов. Значение атрибута имеет тип
универсальный-целый (см. 13.7.2). | ||
P'LENGTH | Префикс Р соответствует индексируемому типу или обозначает ограниченный индексируемый подтип. Вырабатывает число значений диапазона первого индекса (нуль для пустого диапазона). Значение этого атрибута имеет
универсальный-целый тип (см. 3.6.2). | ||
P'LENGTH(N) | Префикс Р соответствует индексируемому типу или обозначает ограниченный индексируемый подтип. Вырабатывает число значений в диапазоне N-го индекса (нуль для пустого диапазона). Значение этого атрибута имеет
универсальный-целый тип. Аргумент N должен быть статическим выражением типа универсальный-целый. Значение N должно быть положительным (ненулевым) и не должно превышать размерности массива (см. 3.6.2 и 3.8.2). | ||
P'MACHINE_EMAX | Префикс Р обозначает плавающий тип или подтип. Вырабатывает наибольшее значение
порядка машинного представления базового типа Р. Значение этого атрибута имеет универсальный-целый тип (см. 13.7.3). | ||
P'MACHINE_EMIN | Префикс Р обозначает плавающий тип или подтип. Вырабатывает наименьшее (наибольшее по модулю отрицательное) значение
порядка машинного представления базового типа Р. Значение этого атрибута имеет универсальный-целый тип (см. 13.7.3). | ||
P'MACHINE_MANTISSA | Префикс Р обозначает плавающий тип или подтип. Вырабатывает число цифр в
мантиссе машинного представления базового типа Р (цифры являются расширенными цифрами из диапазона 0 . . P'MACHINE_RADIX - 1). Значение этого атрибута имеет универсальный-целый тип (см. 13.7.3). | ||
P'MACHINE_OVERFLOWS | Префикс Р обозначает вещественный тип или подтип. Вырабатывает значение TRUE, если каждая предопределенная операция над значениями базового типа Р либо возвращает точный результат, либо возбуждение исключения NUMERIC_ERROR при переполнении. В противном случае вырабатывает значение FALSE. Значение этого атрибута имеет предопределенный тип BOOLEAN (см. 13.7.3). | ||
P'MACHINE_RADIX | Префикс Р обозначает плавающий тип или подтип. Вырабатывает значение
основания, используемое в машинном представлении базового типа Р. Значение этого атрибута имеет тип универсальный-целый (см. 13.7.3). | ||
P'MACHINE_ROUNDS | Префикс Р обозначает вещественный тип или подтип. Вырабатывает значение TRUE, если каждая предопределенная арифметическая операция над значениями базового типа Р либо возвращает точный результат, либо осуществляет округление. В противном случае вырабатывает значение FALSE. Значение этого атрибута имеет предопределенный тип BOOLEAN (см. 13.7.3). | ||
P'MANTISSA | Префикс Р обозначает вещественный подтип. Вырабатывает число двоичных цифр мантиссы модельных чисел подтипа Р. (Этот атрибут вырабатывает число В, введенное в разд. 3.5.7 для плавающего типа и в разд. 3.5.9 для фиксированного типа.) Значение этого атрибута имеет
универсальный-целый тип (см. 3.5.8 и 3.5.10). | ||
P'POS(X) | Префикс Р обозначает дискретный тип или подтип. Этот атрибут является функцией с одним параметром. Фактический параметр Х должен быть значением базового типа Р. Тип результата —
универсальный-целый. Результатом является порядковый номер позиции для значения фактического параметра (см. 3.5.5), | ||
P'POSITION | Префикс Р обозначает компоненту записи. Вырабатывает величину смещения первого кванта памяти, занятого этой компонентой, относительно первого кванта памяти, занимаемого записью. Величина смещения измеряется числом квантов. Значение этого атрибута имеет
универсальный-целый тип (см. 13.7.2). | ||
P'PRED(X) | Префикс Р обозначает дискретный тип или подтип. Этот атрибут является функцией с одним параметром. Фактический параметр Х должен быть значением базового типа Р. Тип результата — базовый тип Р. Результатом является значение с номером позиции, на единицу меньшим номера позиции для значения X. Если Х равен P'BASE'FIRST, то возбуждается исключение CONSTRAINT_ERROR (см. 3.5.5). | ||
P'RANGE | Префикс Р соответствует индексируемому типу или обозначает ограниченный индексируемый подтип. Вырабатывает диапазон первого индекса Р, т. е. диапазон Р'FIRST . . P'LAST. (см.3.6.2). | ||
P'RANGE(N) | Префикс Р соответствует индексируемому типу или обозначает ограниченный индексируемый подтип. Вырабатывает диапазон N-го индекса Р, т. е. диапазон P'FIRST (N) . . P'LAST (N) (см. 3.6.2). | ||
P'SAFE_EMAX | Префикс Р обозначает плавающий тип или подтип. Вырабатывает наибольшее значение порядка двоичной канонической формы хранимых чисел базового типа Р. (Этот атрибут вырабатывает число Е, определенное в разд. 3.5.7.) Значение этого атрибута имеет
универсальный-целый тип (см. 3.5.8). | ||
P'SAFE_LARGE | Префикс Р обозначает вещественный тип или подтип. Вырабатывает наибольшее положительное хранимое число базового типа Р. Значение этого атрибута имеет
универсальный-вещественный тип (см. 3.5.8 и 3.5.10). | ||
P'SAFE_SMALL | Префикс Р обозначает вещественный тип или подтип. Вырабатывает наименьшее положительное (ненулевое) хранимое число базового типа Р. Значение этого атрибута имеет
универсальный-вещественный тип (см. 3.5.8 и 3.5.10). | ||
P'SIZE | Префикс Р обозначает тип или подтип. Вырабатывает минимальное число битов, необходимое реализации для представления любого возможного значения объекта типа или подтипа Р. Значение этого атрибута имеет
универсальный-целый тип (см. 13.7.2). | ||
P'SIZE | Префикс Р обозначает объект. Вырабатывает число битов, отведенных для размещения объекта. Значение этого атрибута имеет
универсальный-целый тип (см.13.7.2). | ||
P'SMALL | Префикс Р обозначает вещественный подтип. Вырабатывает наименьшее положительное (ненулевое) число подтипа Р. Значение этого атрибута имеет
универсальный-вещественный тип (см. 3.5.8 и 3.5.10). | ||
P'STORAGE_SIZE | Префикс Р обозначает ссылочный тип или подтип. Вырабатывает общее число квантов памяти, резервируемых для соответствующего базовому типу Р набора. Значение этого атрибута имеет
универсальный-целый тип (см.13.7.2). | ||
P'STORAGE_SIZE | Префикс обозначает задачный тип или задачу. Вырабатывает общее число квантов памяти, резервируемых для каждой активизации задачи типа Р или объекта Р задачного типа. Значение этого атрибута имеет
универсальный-целый тип (см. 13.7.2). | ||
P'SUCC(X) | Префикс Р обозначает дискретный тип или подтип. Этот атрибут является функцией с одним параметром. Фактический параметр Х должен быть значением базового типа Р. Тип результата является базовым типом Р. Результат представляет собой значение с номером позиции, на единицу большим номера позиции для значения X. Если Х равен P'BASE'LAST, то возбуждается исключение CONSTRAINT_ERROR (см. 3.5.5). | ||
P'TERMINATED | Префикс Р соответствует задачному типу []
. Вырабатывает значение TRUE, если задача Р завершена, иначе вырабатывает значение FALSE. Значение этого атрибута имеет предопределенный тип BOOLEAN (см. 9.9). | ||
P'VAL(X) | Префикс Р обозначает дискретный тип или подтип. Этот атрибут является специальной функцией с одним параметром X, который может быть любого целого типа. Тип результата является базовым типом Р. Результат представляет собой значение, чьим номером позиции является значение типа
универсальный-целый, и это значение соответствует X. Если соответствующее Х универсальное-целое значение не принадлежит диапазону P'POS (P'BASE'FIRST). .P'POS (P'BASE'LAST), то возбуждается исключение CONSTRAINT_ERROR (см. 3.5.5). | ||
P'VALUE(X) | Префикс Р обозначает дискретный тип или подтип. Этот атрибут является функцией с одним параметром. Фактический параметр Х должен быть значением предопределенного типа STRING. Тип результата — базовый тип Р. Любые предшествующие и последующие пробелы последовательности символов, соответствующей X, игнорируются. Если для перечислимого типа последовательность символов имеет синтаксис литерала перечисления и если этот литерал существует для базового типа Р, то результатом является соответствующее значение перечислимого типа. Если для целого типа последовательность символов имеет синтаксис целого литерала, возможно с дополнительным символом плюс или минус, и если соответствующее значение принадлежит базовому типу Р, то результатом является именно это значение. Во всех остальных случаях возбуждается исключение CONSTRAINT_ERROR (CM. 3.5.5). | ||
Р'WIDTH | Префикс Р обозначает дискретный подтип. Вырабатывает максимальную длину образа по всем значениям подтипа Р. (Образ — это последовательность символов, вырабатываемых атрибутом IMAGE.) Значение этого атрибута имеет
универсальный-целый тип (см. 3.5.5). | ||
[]
Или задаче. - Прим. ред. |
Пред. | Уровень выше | След. | |
14.7. ПРИМЕР ВВОДА-ВЫВОДА
|
Содержание | Приложение B.
ПРАГМЫ, ПРЕДОПРЕДЕЛЕННЫЕ В ЯЗЫКЕ |
b прагмы, предопределенные в языке
Ниже определяются прагмы LIST, PAGE и OPTIMIZE и остальные предопределенные прагмы, которые рассматривались в описании языка.
Прагма | Смысл | ||
CONTROLLED | Единственным аргументом является простое имя ссылочного типа. Эта прагма допустима только непосредственно в разделе описаний или в спецификации пакета, содержащих описание этого ссылочного типа, причем описание должно помещаться перед прагмой. Не допускается использование этой прагмы для производного типа. Прагма указывает, что для объектов, указанных значениями соответствующего ссылочного типа, не должно выполняться автоматическое освобождение памяти, исключая выход из самого вложенного оператора блока, тела подпрограммы или тела задачи, охватывающих описание ссылочного типа либо выход из главной программы (см. 4.8) | ||
ELABORATE | В качестве аргументов используются одно или несколько простых имен, обозначающих библиотечные модули. Эта прагма допустима только непосредственно после спецификатора контекста компилируемого модуля (перед библиотечным или вторичным модулем). Каждый агрумент прагмы должен быть простым именем библиотечного модуля, упомянутого в спецификаторе контекста. Эта прагма указывает, что тело соответствующего библиотечного модуля должно быть предвыполнено до предвыполнения данного компилируемого модуля. Если данный компилируемый модуль является субмодулем, то тело библиотечного модуля должно быть предвыполнено до предвыполнения тела родительского (по отношению к этому субмодулю) библиотечного модуля (см. 10.5). | ||
INLINE | В качестве аргументов используется одно или несколько имен; каждое имя является либо именем подпрограммы, либо именем настраиваемой подпрограммы. Эта прагма допустима только на месте элемента описания в разделе описаний или в спецификации пакета либо же после библиотечного модуля в компиляции, но до любого следующего компилируемого модуля. Прагма указывает на возможную подстановку тела подпрограммы вместо каждого их вызова; в случае настраиваемой подпрограммы эта прагма относится к вызовам ее конкретизации (см. 6.3.2). | ||
INTERFACE | В качестве аргументов используются имя языка и имя подпрограммы. Эта прагма допустима на месте элемента описания и должна применяться к подпрограмме, описанной ранее в виде элемента описания того же самого раздела описаний или спецификации пакета. Эта прагма допустима также для библиотечного модуля; в этом случае прагма должна помещаться после описания подпрограммы и перед любым следующим компилируемым модулем. Эта прагма указывает другой язык (и тем самым соглашения по вызову) и информирует компилятор о том, что для соответствующей подпрограммы будет представлен объектный модуль (см. 13.9). | ||
LIST | В качестве единственного аргумента используется один из идентификаторов ON или OFF. Эта прагма допустима в любом месте, где допустимы прагмы. Прагма указывает, что необходимо продолжить или прекратить вывод листинга компиляции до тех пор, пока в той же компиляции не встретится прагма LIST с другим аргументом. Текст самой прагмы печатается всегда, если компилятор выводит листинг. | ||
MEMORY_SIZE | В качестве единственного аргумента используется числовой литерал. Эта прагма допустима только в начале компиляции, до ее первого компилируемого модуля (если он есть). Применение этой прагмы приводит к использованию указанного числового литерала для определения именованного числа MEMORY_SIZE (см. 13.7). | ||
OPTIMIZE | В качестве единственного аргумента используется один из идентификаторов TIME или SPACE. Эта прагма допустима только внутри раздела описаний и относится к блоку или телу, охватывающему этот раздел описаний. Она указывает главный критерий оптимизации — время выполнения или занимаемую память. | ||
PACK | В качестве единственного аргумента используется простое имя именуемого или индексируемого типа. Допустимое положение этой прагмы в программе и ограничения, относящиеся к именуемому типу, определяются теми же правилами, что и для спецификатора представления. Прагма указывает, что при выборе представления значений данного типа главным критерием оптимизации обязан быть минимум занимаемой памяти (см. 13.1). | ||
PAGE | Эта прагма не имеет аргументов и допустима везде, где допустимы прагмы. Она указывает, что текст программы, следующий за прагмой, должен начинаться с новой страницы (если компилятор параллельно выводит листинг). | ||
PRIORITY | Единственным аргументом этой прагмы является статическое выражение предопределенного целого подтипа PRIORITY. Эта прагма допустима только в спецификации задачи или непосредственно внутри самого внешнего раздела описаний главной программы. Она указывает приоритет этой задачи (или задач этого задачного типа) или приоритет главной программы (см. 9.8). | ||
SHARED | В качестве единственного аргумента этой прагмы используется простое имя переменной. Эта прагма допустима только для переменной, описанной посредством описания объекта скалярного или ссылочного типа. И описание переменной, и прагма должны находиться (в указанном порядке) в одном и том же разделе описаний или в спецификации пакета. Эта прагма указывает, что каждое чтение или изменение значения этой переменной является ее точкой синхронизации. Реализация должна ограничивать круг объектов, для которых допустимо использование этой прагмы, теми объектами, прямое чтение или прямое изменение значения которых реализуются как неделимые операции (см. 9.11). | ||
STORAGE_UNIT | В качестве единственного аргумента используется числовой литерал. Эта прагма допустима только в начале компиляции, до первого ее компилируемого модуля (если он есть). Применение этой прагмы приводит к использованию для определения именованного числа STORAGE_UNIT значения заданного числового литерала (см. 13.7). | ||
SUPPRESS | В качестве аргументов используются идентификатор проверки, а также имя объекта, типа или подтипа, подпрограммы, задачного модуля или настраиваемого модуля. Эта прагма допустима только непосредственно либо в разделе описаний, либо в спецификации пакета. В последнем случае единственным допустимым вариантом является использование имени, обозначающего понятие (или несколько совмещенных подпрограмм), описанное непосредственно внутри этой спецификации. Разрешение подавить указанную проверку действует от прагмы до конца области действия описаний, соответствующей самому вложенному оператору блока или программному модулю. Для | ||
прагмы, используемой в спецификации пакета, это разрешение действительно до конца области действия описания, заданного своим именем понятия. Если в качестве аргумента прагмы используется имя, то разрешение на подавление указанной проверки ограничивается следующими правилами: это разрешение распространяется только на операции над указанными объектами базового типа указанного типа или подтипа, на вызовы указанной подпрограммы, на активизацию задач указанного задачного типа, на конкретизацию указанного настраиваемого модуля (см. 11.7). | |||
SYSTEM_NAME | Единственным аргументом прагмы является литерал перечисления. Эта прагма допустима только в начале компиляции, до первого ее компилируемого модуля (если он есть). Применение прагмы приводит к использованию литерала перечисления, заданного идентификатором, для определения константы SYSTEM_NAME. Прагма допустима только в том случае, если указанный в ней идентификатор соответствует одному из литералов перечисления типа NAME, описанного в пакете SYSTEM (см. 13.7). |
Пред. | Уровень выше | След. | |
Приложение A.
АТРИБУТЫ, ПРЕДОПРЕДЕЛЕННЫЕ В ЯЗЫКЕ |
Содержание | Приложение C.
ПРЕДОПРЕДЕЛЕННОЕ ОКРУЖЕНИЕ ЯЗЫКА |
c предопределенное окружение языка
Ниже дана спецификация пакета STANDARD, содержащая все предопределенные в языке идентификаторы. Соответствующее тело пакета определено реализацией и не показано.
Предопределенные для описанных в пакете STANDARD типов операции даны в виде комментариев, так как они описаны неявно. Для псевдоимен анонимных типов
(универсальный-вещественный,
например), а также для неопределенной информации (например,
определен-реализацией
и
любой-фиксированный-тип)
используется курсив.
package STANDARD is
type BOOLEAN is (FALSE, TRUE);
-- Предопределенными операциями отношения -- для этого типа являются следующие:
-- function "=" (LEFT, RIGHT : BOOLEAN) return BOOLEAN; -- function "/=" (LEFT, RIGHT : BOOLEAN) return BOOLEAN; -- function "<" (LEFT, RIGHT : BOOLEAN) return BOOLEAN; -- function "<=" (LEFT, RIGHT : BOOLEAN) return BOOLEAN; -- function ">" (LEFT, RIGHT : BOOLEAN) return BOOLEAN; -- function ">=" (LEFT, RIGHT : BOOLEAN) return BOOLEAN;
-- Предопределенными логическими операциями -- для этого типа являются следующие:
-- function "and" (LEFT, RIGHT : BOOLEAN) return BOOLEAN; -- function "or" (LEFT, RIGHT : BOOLEAN) return BOOLEAN; -- function "xor" (LEFT, RIGHT : BOOLEAN) return BOOLEAN;
-- function "not" (RIGHT : BOOLEAN) return BOOLEAN;
-- Предопределен универсальный тип универсальный, целый.
type INTEGER is определен-реализацией;
-- Для этого типа предопределены следующие операции:
-- function "=" (LEFT, RIGHT : INTEGER) return BOOLEAN; -- function "/=" (LEFT, RIGHT : INTEGER) return BOOLEAN; -- function "<" (LEFT, RIGHT : INTEGER) return BOOLEAN; -- function "<=" (LEFT, RIGHT : INTEGER) return BOOLEAN; -- function ">" (LEFT, RIGHT : INTEGER) return BOOLEAN; -- function ">=" (LEFT, RIGHT : INTEGER) return BOOLEAN;
-- function "+" (RIGHT : INTEGER) return INTEGER; -- function "-" (RIGHT : INTEGER) return INTEGER; -- function "abs" (RIGHT : INTEGER) return INTEGER;
-- function "+" (LEFT, RIGHT : INTEGER) return INTEGER; -- function "-" (LEFT, RIGHT : INTEGER) return INTEGER; -- function "*" (LEFT, RIGHT : INTEGER) return INTEGER; -- function "/" (LEFT, RIGHT : INTEGER) return INTEGER; -- function "rem" (LEFT, RIGHT : INTEGER) return INTEGER; -- function "mod" (LEFT, RIGHT : INTEGER) return INTEGER;
-- function "**" (LEFT : INTEGER; RIGHT : INTEGER) return INTEGER;
-- Реализация может обеспечить другие предопределенные целые типы. Рекомендуется, чтобы -- имена этих дополнительных типов оканчивались на INTEGER, например, SHORT_INTEGER или -- LONG_INTEGER. Спецификация каждой операции для типа универсальный-целый или для -- любого дополнительного предопределенного целого типа может быть получена заменой -- идентификатора INTEGER на имя этого типа в спецификации соответствующей операции для -- типа INTEGER исключая правый операнд операции возведения в степень.
-- Универсальный тип универсальный-вещественный предопределен.
type FLOAT is определен-реализацией;
-- Для этого типа предопределены следующие операции:
-- function "=" (LEFT, RIGHT : FLOAT) return BOOLEAN; -- function "/=" (LEFT, RIGHT : FLOAT) return BOOLEAN; -- function "<" (LEFT, RIGHT : FLOAT) return BOOLEAN; -- function "<=" (LEFT, RIGHT : FLOAT) return BOOLEAN; -- function ">" (LEFT, RIGHT : FLOAT) return BOOLEAN; -- function ">=" (LEFT, RIGHT : FLOAT) return BOOLEAN;
-- function "+" (RIGHT : FLOAT) return FLOAT; -- function "-" (RIGHT : FLOAT) return FLOAT; -- function "abs" (RIGHT : FLOAT) return FLOAT;
-- function "+" (LEFT, RIGHT : FLOAT) return FLOAT; -- function "-" (LEFT, RIGHT : FLOAT) return FLOAT; -- function "*" (LEFT, RIGHT : FLOAT) return FLOAT; -- function "/" (LEFT, RIGHT : FLOAT) return FLOAT;
-- function "**" (LEFT : FLOAT; RIGHT : INTEGER) return FLOAT;
for CHARACTER use -- 128 ASCII character set without holes (0, 1, 2, 3, 4, 5, ..., 125, 126, 127);
-- Предопределенные операции для типа CHARACTER те же самые, что и для любого перечислимого типа.
package ASCII is
-- Управляющие символы:
NUL : constant CHARACTER := nul; SOH : constant CHARACTER := soh: STX : constant CHARACTER := stx; ETX : constant CHARACTER := etx; EOT : constant CHARACTER := eot; ENQ : constant CHARACTER := enq: ACK : constant CHARACTER := ack; BEL : constant CHARACTER := bel; BS : constant CHARACTER := bs; HT : constant CHARACTER := ht; LF : constant CHARACTER := lf; VT : constant CHARACTER := vt; FF : constant CHARACTER := ff; CR : constant CHARACTER := cr; SO : constant CHARACTER := so; SI : constant CHARACTER := si; DLE : constant CHARACTER := dle; DC1 : constant CHARACTER := dc1; DC2 : constant CHARACTER := dc2; DC3 : constant CHARACTER := dc3; DC4 : constant CHARACTER := dc4; NAK : constant CHARACTER := nak; SYN : constant CHARACTER := syn; ETB : constant CHARACTER := etb; CAN : constant CHARACTER := can; EM : constant CHARACTER := em: SUB : constant CHARACTER := sub; ESC : constant CHARACTER := esc; FS : constant CHARACTER := fs; GS : constant CHARACTER := gs; RS : constant CHARACTER := rs; US : constant CHARACTER := us; DEL : constant CHARACTER := del;
-- Другие символы:
EXCLAM : constant CHARACTER := '!'; QUOTATION : constant CHARACTER := '"'; SHARP : constant CHARACTER := '#'; DOLLAR : constant CHARACTER := '$'; PERCENT : constant CHARACTER := '%'; AMPERSAND : constant CHARACTER := '&'; COLON : constant CHARACTER := ':'; SEMICOLON : constant CHARACTER := ';'; QUERY : constant CHARACTER := '?'; AT_SIGN : constant CHARACTER := '@'; L_BRACKET: constant CHARACTER := '['; BACK_SLASH: constant CHARACTER := '\'; R_BRACKET: constant CHARACTER := ']'; CIRCUMFLEX: constant CHARACTER := '~'; UNDERLINE: constant CHARACTER := '_'; GRAVE : constant CHARACTER := '`'; L_BRACE : constant CHARACTER := '{'; BAR : constant CHARACTER := '|'; R_BRACE : constant CHARACTER := '}'; TILDE : constant CHARACTER := '~';
-- Строчные буквы:
LC_A : constant CHARACTER := 'a'; ... LC_Z : constant CHARACTER := 'z';
end ASCII;
-- Предопределенные подтипы:
subtype NATURAL is INTEGER range 0 .. INTEGER'LAST; subtype POSITIVE is INTEGER range 1 .. INTEGER'LAST;
-- Предопределенный строковой тип:
type STRING is array(POSITIVE range <>) of CHARACTER;
pragma PACK(STRING);
-- Следующие операции для этого типа предопределены:
-- function "=" (LEFT, RIGHT : STRING) return BOOLEAN; -- function "/=" (LEFT, RIGHT : STRING) return BOOLEAN; -- function "<" (LEFT, RIGHT : STRING) return BOOLEAN; -- function "<=" (LEFT, RIGHT : STRING) return BOOLEAN; -- function ">" (LEFT, RIGHT : STRING) return BOOLEAN; -- function ">=" (LEFT, RIGHT : STRING) return BOOLEAN;
-- function "&" (LEFT : STRING; RIGHT : STRING) return STRING; -- function "&" (LEFT : CHARACTER; RIGHT : STRING) return STRING; -- function "&" (LEFT : STRING; RIGHT : CHARACTER) return STRING; -- function "&" (LEFT : CHARACTER; RIGHT : CHARACTER) return STRING;
type DURATION is delta определен-реализацией range определен-реализацией;
-- Для типа DURATION предопределены все те операции, -- что и для любого фиксированного типа
-- Предопределены следующие исключения:
CONSTRAINT_ERROR : exception; NUMERIC_ERROR : exception; PROGRAM_ERROR : exception; STORAGE_ERROR : exception; TASKING_ERROR : exception;
end STANDARD;
Некоторые аспекты предопределенных понятий не могут быть выражены в терминах самого языка. Хотя, например, перечислимый тип BOOLEAN может быть записан посредством двух литералов перечисления FALSE и TRUE, формы управления промежуточной проверкой в самом языке выражены быть не могут.
Примечание.
Определением языка предопределены следующие библиотечные модули:
пакет CALENDAR
пакет SYSTEM
пакет MACHINE_CODE(ecnu он предусмотрен)
настраиваемая процедура UNCHECKED_DEALLOCATION
настраиваемая функция UNCHECKED_CONVERSION
настраиваемый пакет SEQUENTIAL_IO
настраиваемый пакет DIRECT_IO
пакет TEXT_IO
пакет IO_EXCEPTIONS
пакет LOW_LEVEL_IO
Пред. | Уровень выше | След. |
Приложение B. ПРАГМЫ, ПРЕДОПРЕДЕЛЕННЫЕ В ЯЗЫКЕ |
Содержание | Приложение D. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ |
d термины и определения
Это приложение носит информационный характер и не является частью определения стандарта языка. Термины, выделенные в тексте курсивом, либо имеют собственную статью, либо описываются в статьях, относящихся к логически связанным с ними понятиям. После термина в скобках приведен соответствующий английский термин.
Агрегат
(aggregate) — базовая операция над типом, которая объединяет значения
компонент в
составное значение
индексируемого типа
(агрегат массива) или
именуемого типа
(агрегат записи), являющихся разновидностями составного типа. Компоненты агрегата могут быть
позиционными
(координатными) и/или
именованными
(ключевыми).
Атрибут
(attribute) — базовая операция над типом, которая вырабатывает предопределенную характеристику поименованного понятия, указанного
префиксом;
некоторые атрибуты являются
функциями, типом
или
диапазоном.
Вещественный тип
(real type) — набор приближенных значений вещественных чисел, заданных с относительной погрешностью
(плавающий тип}
или абсолютной погрешностью
(фиксированный тип).
Вещественный тип реализуется
хранимыми в
памяти вычислительной машины числами и определяется точностью приближения и
диапазоном.
Вид
(mode), см.
параметр.
Видимость
(visibility) — доступность характеристик описанного понятия при его применении в данной точке текста программы.
Описание
понятия, вводящее идентификатор, называется
видимым в
данной точке текста программы, если это понятие осмысленно при появлении его идентификатора в этой точке программы. Прямая видимость подразумевает одно описание понятия с характеристиками, уникальными в
области действия,
и некоторое число использовании этого понятия. При
именовании
описание
видимо
на месте
постфикса в
именуемой компоненте или на месте имени в
именованном сопоставлении.
Иначе, описание
видимо непосредственно
всякий раз, когда единственный идентификатор имеет этот смысл.
Видимый раздел
(visible part), см.
пакет.
Возбуждение исключения
(raising an exception), см.
исключение.
Вход
(entry) — именование точки синхронизации задач и передачи данных между ними. Вход используется для осуществления взаимодействия задач. Синтаксически вызов входа похож на вызов
подпрограммы; его
внутренний механизм определяется одним или несколькими
операторами принятия,
специфицирующими действия, выполняемые при вызове входа.
Вычисление
(evaluation) — процесс получения значения (например,
выражения}.
Этот процесс происходит во время выполнения программы.
Выражение
(expression) — формула, определяющая процесс получения значения.
Генератор
(allocator) — базовая операция над типом, создающая
объект
и вырабатывающая
ссылочное значение,
которое указывает на этот объект. Созданный объект должен сохраняться до тех пор, пока существует обозначение объекта некоторым именем.
Диапазон
(range) — упорядоченный набор последовательных значений
скалярного типа.
Диапазон задается нижней и верхней границами этого набора значений. Значение из диапазона называется
принадлежащим
этому диапазону.
Дискретный тип
(discrete type) — упорядоченный набор различных значений. Дискретными типами являются
перечиспимый
и
целый
типы. Дискретные типы используются для индексирования и управления повторением в операторах цикла, а также в выборах операторов выбора и
вариантах
записи.
Дискриминант
(discriminant) — специальный
компонент объекта
или значение
именуемого типа. Подтипы
других компонентов и даже их присутствие или отсутствие могут зависеть от значения дискриминанта.
Задача
(task) — программный модуль, функционирующий параллельно с другими частями программы. Задача задается
спецификацией задачи,
которая задает
имя
задачи, а также имена и
формальные параметры
ее
входов,
и
телом
задачи, которое определяет ее выполнение.
Задачный модуль (модуль-задача)
является одним из видов программных модулей.
Заданный тип —
это
тип,
который представляет возможность последующего описания любого количества однотипных задач. Говорят, что значение задачного типа
указывает
задачу.
Именованное сопоставление
(named association) — способ задания связи элемента составного значения с одной или несколькими позициями с помощью их именования.
Именуемая компонента
(selected component) —
имя,
состоящее из
префикса
и идентификатора, называемого
постфиксом.
Именуемые компоненты используются для обозначения компонент записей,
входов
и
объектов,
указанных ссылочными значениями; они также используются как
расширенные имена.
Именуемый тип
(record type) — составной тип из именованных различными идентификаторами
компонент,
которые обычно бывают различных
типов
или
подтипов.
Для каждой компоненты значения записи или
объекта-записи в
определении именуемого типа задается идентификатор, который однозначно определяет компоненту записи.
Имя
(name) — средство представления понятия. Говорят, что имя
обозначает
понятие и что понятие является смыслом имени. См. также
описание, префикс.
Индекс
(index), см.
индексируемый тип.
Индексируемая компонента
(indexed component) — форма
имени,
содержащая
выражения,
которые задают значения
индексов компоненты массива.
Индексируемая компонента
обозначает
компоненту массива. Индексируемая компонента может также обозначать
вход в
семействе входов.
Индексируемый тип
(array type) — составной тип из
компонент
одного и того же
подтипа
(и следовательно, одного и того же типа). Каждая компонента однозначно идентифицируется
индексом
(для одномерного массива) или последовательностью индексов (для многомерного массива). Каждый индекс должен быть значением
дискретного типа
и принадлежать требуемому диапазону индексов.
Исключение
(exception) — обозначение ошибочной ситуации, которая может произойти при выполнении программы и при этом будет зарегистрирована и обработана.
Возбуждение
исключения состоит в прекращении нормального выполнения программы, сигнализирующем о наличии ошибки.
Обработчик исключения —
это резервная часть программного текста, задающая реакцию на исключение. Выполнение этого программного текста называется
обработкой исключения.
Квалифицированное выражение
(qualified expression) —
выражение,
перед которым указан его
тип
или
подтип.
Используется для разрешения неоднозначности выражения (например, из-за
совмещения).
Компилируемый модуль
(compilation unit) —
описание
или
тело программного модуля,
предназначенные для компиляции в качестве самостоятельного текста. Перед ним может быть задан
спецификатор контекста,
включающего другие компилируемые модули, от которых зависит данный и имена которых указаны в
спецификаторах совместимости.
Компонента
(component) — значение, которое является частью более сложного значения, или
объект,
который является частью более сложного объекта.
Константа
(constant), см.
объект.
Лексема
(lexical element) — лексический элемент, который может быть идентификатором,
литералом,
ограничителем или комментарием.
Лимитируемый тип
(limited type) —
тип,
для которого не определены неявно описанные операции присваивания и предопределенного сравнения на равенство. Все
заданные типы —
лимитируемые.
Личный тип
может быть определен как лимитируемый. Для лимитируемого типа может быть явно описана операция сравнения на равенство.
Литерал
(literal) — значение, явно выраженное буквами, цифрами или другими символами. Литерал — это одно из четырех: числовой литерал, литерал перечисления, символьный литерал или строковый литерал.
Личный раздел
(private part), см.
пакет.
Личный тип
(private type) —
тип,
структура и набор значений которого явно определены, но непосредственно недоступны для пользователя. О личном типе известны только его
дискриминанты
(если они есть) и набор
операций,
определенных над его значениями. Личный тип и соответствующие операции определяются в
видимом разделе пакета
или в
разделе формальных параметров настройки.
Для личных типов, не являющихся
лимитируемыми,
определены также операции присваивания, сравнения на равенство и неравенство.
Модельное число
(model number) — точно представляемое значение
вещественного типа. Операции
над вещественными типами определяются в терминах операций над модельными числами этих типов. Свойства модельных чисел и операции над ними являются минимальными свойствами, предписанными для всех реализации вещественных чисел.
Набор
(collection) — вся совокупность
объектов,
создаваемых вычислением
генераторов
для некоторого
ссылочного типа.
Настраиваемый модуль
(generic unit) — шаблон для множества
подпрограмм
или
пакетов.
Создаваемые с использованием этого шаблона подпрограмма или пакет называются
экземплярами
данного настраиваемого модуля. Конкретизация настройки является видом описания, которое создает экземпляр. Настраиваемый модуль пишется в виде подпрограммы или пакета с предшествующим спецификации
разделом формальных параметров настройки. Формальным параметром
настройки является либо
тип,
либо
подпрограмма,
либо
объект.
Настраиваемый модуль — это один из видов
программных модулей.
Область действия
(scope), см.
описание.
Обозначить
(denote), см.
описание.
Обработчик
(handler), см.
исключение.
Объект
(object) — понятие, которое обладает значением некоторого
типа. Программа
создает объект либо при
предвыполнении описания объекта,
либо при
вычислении генератора.
Описание или генератор задают тип объекта, объект может обладать значением только этого типа.
Офаничение
(constraint) — средство выделения подмножества значений
типа.
Принадлежащее этому подмножеству значение удовлетворяет ограничению.
Ограничение диапазона
(range constraint) — способ определения
диапазона типа,
т. е. подмножества значений этого типа, принадлежащих диапазону.
Ограничение дискриминанта
(discriminant constraint) — способ определения дискриминанта для
именуемого типа
или
личного типа.
Ограничение индекса
(index constraint) — определение ограничения в задании нижней и верхней границ для каждого индекса индексируемого типа.
Оператор
(statement) — синтаксическая конструкция, определяющая одно или несколько действий, реализуемых во время выполнения
программы.
Оператор блока
(block statement) — составной оператор, который может содержать последовательность
операторов.
Он может также содержать
раздел описаний
и
обработчики исключений,
которые являются локальными в данном операторе блока.
Оператор принятия
(accept statement), см.
вход.
Операция
(operator) — ограничитель или зарезервированное слово, используемое для указания алгоритма преобразования значений одного или двух операндов в результат заданного
типа.
Унарную операцию записывают перед операндом; бинарную операцию — между двумя операндами. Операция — это специальный вид
вызова функции.
Операция может быть описана как функция. Многие операции неявно описываются
описанием
типа (например, большинство описаний типа подразумевает описание операции сравнения на равенство для значений этого типа).
Операция типа
(operation) — элементарное действие, связанное с одним или несколькими
типами.
Операция типа [8]
неявно описывается при описании этого типа либо является
подпрограммой,
которая имеет
параметр
или
результат
заданного типа.
Описание
(declaration) — синтаксическая конструкция, которая связывает идентификатор (или другие' обозначения) с понятием. Это сопоставление внутри области текста, называемой
областью действия
описания. Внутри области действия описания существуют места использования идентификатора для ссылки на связанное с ним понятие.
Идентификатор, употребляемый в таких местах, называется
простым именем
понятия; говорят, что
имя обозначает
связанное с ним понятие.
Описание переименования
(renaming declaration) — описание другого
имени
понятия.
Пакет
(package) —
программный модуль,
который определяет группу логически связанных понятий, таких как
типы, объекты
этих типов и
подпрограммы с параметрами
этих типов. Пакет состоит из
описания пакета
и
тела пакета.
Описание пакета имеет
видимый раздел,
содержащий
описания
всех понятий, которые могут быть явно использованы вне пакета. Он может содержать также
личный раздел с
деталями реализации, которые заканчивают спецификацию видимых понятий, но которые недоступны для пользователя пакета.
Тело пакета
содержит реализации
подпрограмм
(и, возможно,
задач),
которые заданы в описании пакета. Пакет — это один из видов программного модуля.
Параметр
(parameter) — одно из именованных понятий, связанных с
подпрограммой, входом
или
настраиваемым модулем
и используемых для связи с соответствующим
телом
подпрограммы,
оператором принятия
или настраиваемым телом.
Формальный параметр —
это идентификатор, используемый для обозначения именованного понятия в теле.
Фактический параметр —
это конкретное понятие, сопоставленное соответствующему формальному параметру при
вызове подпрограммы, вызове входа
или
конкретизации настройки. Вид
формального параметра определяет, поставляет ли фактический параметр значение для формального, или формальный параметр — для фактического, или и то и другое. Сопоставление фактических
параметров формальным параметрам может быть определено с помощью
именованного сопоставления, с
помощью
позиционного сопоставления
или их комбинацией.
Переменная
(variable), см.
объект.
Перечислимый тип
(enumeration type) —
дискретный тип,
значения которого представляются
литералами
перечисления, заданными явно в
описании типа.
Эти литералы перечисления являются либо идентификаторами, либо
символьными литералами.
Плавающий тип
(floating point type), см.
вещественный тип.
Подкомпонента
(subcomponent) —
компонента
либо компонента другой компоненты или подкомпоненты.
Подпрограмма
(subprogram) —
программный модуль,
который может быть либо
процедурой,
либо
функцией.
Процедура определяет последовательность действий и вызывается с помощью
вызова процедуры.
Функция определяет последовательность действий, а также возвращает значение, называемое
результатом,
и, таким образом,
вызов функции
является
выражением.
Подпрограмма задается в виде
описания подпрограммы,
которое определяет ее
имя, формальные параметры
и (для функции) ее результат, и
тело подпрограммы,
которое определяет последовательность действий. В вызове подпрограммы задаются
фактические параметры,
которые сопоставляются с формальными параметрами. Подпрограмма — это один из видов программного модуля.
Подтип
(subtype) — набор значений данного
типа,
определяемый
ограничением
типа. Каждое значение из множества значений подтипа
принадлежит
этому подтипу и
удовлетворяет
ограничению, определяющему подтип.
Позиционное сопоставление
(positional association) — способ задания связи элемента с позицией, использующий позицию размещения элемента для определения этого элемента.
Постфикс
(selector), см.
именуемая компонента.
Прагма
(pragma) — языковая конструкция для передачи информации компилятору.
Предвыполнение
(elaboration) — процесс, применяемый к
описанию, в
результате которого описание выполняет свое назначение (например, создается
объект).
Этот процесс происходит при выполнении
программы.
Префикс
(prefix) — начальная часть некоторых видов
имени.
Префикс — это либо
вызов функции,
либо
имя.
Присваивание
(assignment) — базовая
операция типа,
заменяющая текущее значение
переменной
новым значением.
Оператор присваивания
определяет слева переменную, а справа — выражение, значение которого обязано стать новым значением переменной.
Программа
(program) — совокупность из нескольких
компилируемых модулей,
один из которых является
подпрограммой,
называемой
главной программой.
Выполнение программы состоит из выполнения главной программы, которая может вызвать подпрограммы, описанные в других компилируемых модулях программы.
Программный модуль
(program unit) — либо
настраиваемый модуль,
либо
пакет,
либо
подпрограмма,
либо
задачный модуль.
Производный тип
(derived type) —
тип,
значения и
операции
которого есть копии значений и операций существующего типа. Существующий тип называется
родительским типом
производного типа.
Простое имя
(simple name), см.
описание, имя.
Процедура
(procedure), см.
подпрограмма.
Прямая видимость
(direct visibility), см.
видимость.
Раздел вариантов
(variant part) — определяет
альтернативные компоненты записи в
зависимости от значения
дискриминанта
записи. Каждое значение дискриминанта устанавливает одну из альтернатив раздела вариантов.
Раздел описаний
(declarative part) — последовательность
описаний.
Он может также содержать логически связанную информацию, например
тела подпрограмм
и
спецификаторы представления.
Рандеву
(rendezvous) — взаимодействие между двумя параллельно выполняемыми
задачами,
когда одна задача вызвала
вход
другой задачи, и в вызванной задаче для этого вызова выполняется соответствующий
оператор принятия.
Расширенное имя
(expanded name) — способ
обозначения
понятия, которое
описано
непосредственно внутри некоторой конструкции. Расширенное имя имеет форму
именуемой компоненты: префикс
обозначает конструкцию
{программный модуль
или
блок, цикл
или
оператор принятия}, постфикс —
это
простое имя
понятия.
Родительский тип
(parent type), см.
производный тип.
Скалярный тип
(scalar type) — упорядоченный набор значений с операциями отношения. К скалярному типу относится
дискретный
или
вещественный тип. Объект
или значение скалярного типа не имеет
компонент.
Совмещение
(overloading) — свойство понятия иметь несколько альтернатвпыл паопачо-ний в данной точке программного текста. Например, совмещенным
литералом
перечисления может быть идентификатор, который появляется в определениях нескольких
перечислимых типов.
Реальный смысл совмещенного идентификатора определяется по контексту. Совмещенными могут быть также
подпрограммы, агрегаты, генераторы
и
строковые литералы.
Составной тип
(composite type) — тип, значения которого имеют
компоненты.
Существуют две разновидности составного типа:
индексируемые типы
и
именуемые типы.
Спецификатор использования
(use clause) — средство, обеспечивающее прямую видимость
описаний,
которые находятся в
видимых разделах
именованных
пакетов.
Спецификатор контекста
(context clause), см.
компилируемый модуль.
Спецификатор представления
(representation clause) — средство указания компилятору отображения
типа, объекта
или
задачи
на архитектуру объектной машины, на которой выполняется
программа.
В некоторых случаях спецификаторы представления полностью определяют отображение, в других случаях они задают критерии выбора отображения.
Спецификатор совместности
(with clause), см.
компилируемый модуль.
Ссылочный тип
(access type) — набор значений
(ссылочные значения},
которые могут быть либо пустым значением, либо значением,
указывающим объект,
созданный
генератором.
Значение указанного объекта может быть прочитано или изменено через ссылочное значение. Определение ссылочного типа задает тип объектов, на которые указывают значения ссылочного типа. См. также
набор.
Субмодуль
(subunit), см.
тело.
Тело
(body) — конструкция, определяющая процесс выполнения
подпрограммы, пакета,
или
задачи. След тела
является синтаксической формой тела, которая указывает, что его выполнение определяется раздельно компилируемым
субмодулем.
Тип
(type) — набор значений и набор
операций типа,
применимых к этим значениям.
Определение типа —
это языковая конструкция, которой вводится тип. Конкретный тип — это
ссылочный тип, индексируемый тип, личный тип, именуемый тип, скалярный тип
или
задачный тип.
Удовлетворять
(satisfy), см.
ограничение, подтип.
Указывать
(designate), см.
ссылочный тип, задача.
Фактический параметр
(actual parameter), см.
параметр.
Фиксированный тип
(fixed point type), см.
вещественный тип.
Формальный параметр
(formal parameter), см.
параметр.
Функция
(function), см.
подпрограмма.
Целый тип
(integer type) —
дискретный тип,
значения которого представляют все целые числа в заданном
диапазоне.
Экземпляр
(instance), см.
настраиваемый мрдуль.
[8]
Вместо термина "операция типа" в стандарте используется термин "операция", который не вызывает неоднозначности при его использовании в контексте. -- Прим. ред.
Пред. | Уровень выше | След. |
Приложение C. ПРЕДОПРЕДЕЛЕННОЕ ОКРУЖЕНИЕ ЯЗЫКА |
Содержание | Приложение E. СВОДКА СИНТАКСИСА |
e сводка синтаксиса
Пред. | Уровень выше | След. | |
Приложение D.
ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ |
Содержание | Приложение F.
ХАРАКТЕРИСТИКИ, ЗАВИСЯЩИЕ ОТ РЕАЛИЗАЦИИ |
f характеристики, зависящие от реализации
Определение языка Ада допускает машинную зависимость в контролируемых пределах. Не допускаются машинно-зависимые расширения, ограничения синтаксиса и семантики. Машинная зависимость допускается только в определенных реализацией прагмах и атрибутах, в машинно-зависимых соглашениях, перечисленных в гл. 13, а также в ограничениях на использование спецификаторов представления.
Справочное руководство по каждой реализации языка программирования Ада должно включать в себя такое приложение (называемое приложением F), которое описывает все характеристики, зависящие от реализации. В таком приложении для данной реализации должны быть перечислены:
1. Форма, допустимые места расположения и результат каждой зависящей от реализации прагмы.
2. Имя и тип каждого атрибута, зависящего от реализации.
3. Спецификация пакета SYSTEM (см. 13.7).
4. Список всех ограничений на спецификаторы представления (см. 13.1).
5. Соглашения об использовании генерируемых реализацией имен, обозначающих компоненты, зависящие от реализации (см. 13.4).
6. Интерпретация выражений, появляющихся в спецификаторах адреса, включая связанные с прерываниями (см. 13.5).
7. Любое ограничение на неконтролируемые преобразования (см. 13.10.2).
8. Любые зависящие от реализации особенности для пакетов ввода-вывода (см. 14).
Пред. | Уровень выше | |
Приложение E.
СВОДКА СИНТАКСИСА |
Содержание |
использования задачи
В следующем примере определена задача буферизации для сглаживания различий между скоростью ввода производящей задачи и скоростью ввода некоторой потребляющей задачи. Например, производящая задача может содержать операторы:
loop
-— выработка следующего символа CHAR BUFFER.WRITE(CHAR); exit when CHAR = ASCII.EOT; end loop;
потребляющая задача — операторы:
loop
BUFFER.READ(CHAR); -— использование символаСНАР
exit when CHAR = ASCII.EOT; end loop;
Задача буферизации содержит внутренний пул для символов, обрабатываемых цикличес-ки. Пул имеет два индекса: IN-INDEX, указывающий место следующего вводимого символа, и OUT_INDEX, указывающий место следующего выводимого символа.
task BUFFER is
entry READ (С : out CHARACTER); entry WRITE (C : in CHARACTER); end:
task body BUFFER is
POOL_SIZE : constant INTEGER := 100: POOL : array(1 .. POOL_SIZE) of CHARACTER; COUNT : INTEGER range 0 .. POOL_SIZE := 0; IN_INDEX, OUT_INDEX : INTEGER range 1 .. POOL_SIZE := 1; begin
loop
select
when COUNT < POOL_SIZE => accept WRITE(C : in CHARACTER) do
POOL(IN_INDEX) := C; end; IN_INDEX := IN_INDEX mod POOL_SIZE + 1; COUNT := COUNT + 1; or when COUNT > 0 => accept READ(C ; out CHARACTER) do
C := POOL(OUT_INDEX); end; OUT_INDEX := OUT_INDEX mod POOL_SIZE + 1; COUNT := COUNT - 1; or
terminate;
end select:
end loop:
end BUFFER;
Пред. | Уровень выше | След. | |
9.11. РАЗДЕЛЯЕМЫЕ ПЕРЕМЕННЫЕ
|
Содержание | Глава 10.
СТРУКТУРА ПРОГРАММЫ И РЕЗУЛЬТАТ КОМПИЛЯЦИИ |
Пример настраиваемого пакета
В следующем примере использован настраиваемый пакет для одной из возможных организаций стеков. Размер каждого стека и тип его элементов являются параметрами настройки.
generic
SIZE : POSITIVE; type ITEM is private;
package STACK is
procedure PUSH (E : in ITEM); procedure POP (E : out ITEM);
OVERFLOW, UNDERFLOW : exception;
end STACK;
package body STACK is
type TABLE is array (POSITIVE range <>) of ITEM; SPACE : TABLE(1 .. SIZE); INDEX : NATURAL := 0;
procedure PUSH(E : in ITEM) is begin
if INDEX >= SIZE then
raise OVERFLOW; end if;
INDEX := INDEX + 1; SPACE(INDEX) := E; end PUSH;
procedure POP(E : out ITEM) is begin
if INDEX = 0 then
raise UNDERFLOW; and if;
E := SPACE(INDEX); INDEX := INDEX - 1: end POP;
end STACK;
Экземпляры настраиваемого пакета могут быть получены так:
package STACK_INT is new STACK(SIZE => 200, ITEM => INTEGER);
package STACK_BOOL is new STACK(100, BOOLEAN);
После этого могут быть вызваны процедуры конкретизированных пакетов:
STACK_INT.PUSH(N);
STACK_BOOL.PUSH(TRUE);
Возможна другая организация стека (тело пакета опущено):
generic
type ITEM is private; package ON_STACKS is
type STACK(SIZE : POSITIVE) is limited private;
procedure PUSH (S : in out STACK; E : in ITEM); procedure POP (S : in out STACK; E : out ITEM); OVERFLOW, UNDERFLOW : exception;
private
type TABLE is array (POSITIVE range <>) of ITEM;
type STACK(SIZE : POSITIVE) is record
SPACE : TABLE(1 .. SIZE); INDEX : NATURAL := 0; end record;
end:
При использовании такого пакета сначала должна быть осуществлена конкретизация, после чего можно описать стеки с элементами соответствующего типа:
declare
package STACK_REAL is new ON_STACKS(REAL); use STACK_REAL; S : STACK(100); begin
... PUSH(S, 2.54); ... end;
Пред. | Уровень выше | След. | |
12.3. КОНКРЕТИЗАЦИЯ НАСТРОЙКИ
|
Содержание | Глава 13.
СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ И ОСОБЕННОСТИ, ЗАВИСЯЩИЕ ОТ РЕАЛИЗАЦИИ |
Пример пакета обработки текстов
Этот пример иллюстрирует простой пакет обработки текстов. Пользователи имеют доступ только к видимому разделу; реализация от них скрыта в личном разделе и теле пакета (тело не показано).
С точки зрения пользователя, TEXT является строкой переменной длины. Каждый текстовый объект имеет максимальную длину, которая должна задаваться при описании этого объекта, и текущую длину, которая равна длине в диапазоне от нуля до максимального. Максимальная возможная длина текстового объекта является константой, определяемой реализацией.
Сначала в пакете определяются необходимые типы, затем функции, возвращающие некоторые характеристики объектов типа, затем функции преобразования текстов и предопределенных типов CHARACTER и STRING и, наконец, некоторые стандартные операции над переменными строками. Большинство операций над строками, символами, а также над типом TEXT совмещены для минимизации числа явных преобразований, которые должен написать пользователь.
package TEXT_HANDLER is MAXIMUM : constant := SOME_VALUE; -— это значение определено реализацией
subtype INDEX it INTEGER range 0 .. MAXIMUM;
type TEXT(MAXIMUM_LENGTH : INDEX) is limited private;
function LENGTH (T TEXT) return INDEX; function VALUE (T TEXT) return STRING; function EMPTY (T TEXT) return BOOLEAN;
function TO_TEXT (S STRING; MAX : INDEX) return TEXT; -- максимальная длина МАХ function TO_TEXT (С CHARACTER; MAX : INDEX) return TEXT; function TO_TEXT (S STRING) return TEXT; - - максимальная длина S'LENGTH function TO_TEXT (C CHARACTER) return TEXT;
function "&" (LEFT : TEXT; RIGHT TEXT) return TEXT; function "&" (LEFT : TEXT; RIGHT STRING) return TEXT; function "&" (LEFT : STRING; RIGHT TEXT) return TEXT; function "&" (LEFT : TEXT; RIGHT CHARACTER) return TEXT; function "&" (LEFT : CHARACTER; RIGHT TEXT) return TEXT;
function "=" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN; function "<" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN; function "<=" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN; function ">" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN; function ">=" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN;
procedure SET (OBJECT ; in out TEXT; VALUE : In TEXT); procedure SET (OBJECT : In out TEXT; VALUE : In STRING); procedure SET (OBJECT : In out TEXT; VALUE : in CHARACTER);
procedure APPEND (TAIL : In TEXT; TO In out TEXT); procedure APPEND (TAIL : in STRING; TO In out TEXT); procedure APPEND (TAIL : In CHARACTER; TO in out TEXT);
procedure AMEND (OBJECT in out TEXT; BY In TEXT; POSITION : In INDEX); procedure AMEND (OBJECT in out TEXT; BY In STRING; POSITION : In INDEX); procedure AMEND (OBJECT In out TEXT; BY In CHARACTER; POSITION : In INDEX);
-— заменяет часть объекта с заданной позиции на данный -— текст, строку или символ
function LOCATE (FRAGMENT : TEXT; WITHIN : TEXT) return INDEX; function LOCATE (FRAGMENT : STRING; WITHIN : TEXT) return INDEX; function LOCATE (FRAGMENT : CHARACTER; WITHIN : TEXT) return INDEX;
—- возвращают значение О, если фрагмент не размещается
private
type TEXT(MAXIMUM_LENGTH : INDEX) is record
POS : INDEX := 0; VALUE : STRING(1 .. MAXIMUM_LENGTH); end record;
end TEXT-HANDLER;
Пример использования пакета обработки текста:
Программа открывает файл вывода, имя которого дается строкой NAME. Эта строка имеет вид
[УСТРОЙСТВО :] [ИМЯ ТИПА [.РАСШИРЕНИЕ]]
Для устройства, имени файла и расширения существуют стандартные значения по умолчанию. Названное пользователем имя передается через параметр функции EXPAND_FILE_NAME, ее результатом является расширенная версия с необходимыми добавлениями по умолчанию.
function EXPAND_FILE_NAME (NAME : STRING) return STRING is use TEXT_HANDLER;
DEFAULT_DEVICE : constant STRING = "SY:"; DEFAULT_FILE_NAME : constant STRING = "RESULTS"; DEFAULT_EXTENSION : constant STRING = ".DAT";
MAXIMUM_FILE_NAME_LENGTH : constant INDEX := SOME_APPROPRIATE_VALUE: FILE_NAME : TEXT(MAXIMUM_FILE_NAME_LENGTH);
begin
SET(FILE_NAME, NAME); if EMPTY(FILE_NAME) then
SET(FILE_NAME, DEFAULT_FILE_NAME); end if;
if LOCATEC:', FILE_NAME) = 0 then
SET(FILE_NAME, DEFAULT_DEVICE & FILE_NAME); end if;
if LOCATE('.', FILE_NAME) = 0 then
APPEND(DEFAULT_EXTENSION, TO => FILE_NAME); end if;
return VALUE(FILE_NAME);
end EXPAND_FILE_NAME;
Пред. | Уровень выше | След. |
7.5. ПРИМЕР ПАКЕТА РАБОТЫ С ТАБЛИЦАМИ |
Содержание | Глава 8. ПРАВИЛА ВИДИМОСТИ |
Пример пакета работы с таблицами
Следующий пример иллюстрирует использование пакетов для организации простого взаимодействия пользователя с довольно сложными процедурами.
Необходимо создать пакет для работы с таблицами по внесению и извлечению их элементов. Элементы включаются в таблицу по мере их поступления. Каждый поступивший элемент имеет порядковый номер. Элементы выбираются в соответствии с их порядковыми номерами, причем первым выбирается элемент с наименьшим порядковым номером.
С точки зрения пользователя, пакет чрезвычайно прост. Существует тип с именем ITEM — тип элемента таблицы, есть процедура INSERT для включения элементов в таблицу и процедура RETRIEVE для извлечения элемента с наименьшим порядковым номером. Если таблица пуста, то возвращается специальный элемент NULL-ITEM, а если таблица заполнена, то при выяпяй nnniiftnvnki INRFRT по.чЛужляйтся искпючание TABLE _FULL-
Ниже приведена схема такого пакета. Пользователю известна только спецификация пакета.
package TABLE_MANAGER is
type ITEM is record
ORDER_NUM : INTEGER; ITEM_CODE : INTEGER; QUANTITY : INTEGER; ITEM-TYPE : CHARACTER; end record;
NULL-ITEM : constant ITEM := (ORDER_NUM | ITEM_CODE | QUANTITY => 0, ITEM_TYPE => ' ');
procedure INSERT (NEWJTEM : in ITEM); procedure RETRIEVE (FIRSTJTEM : out ITEM);
TABLE_FULL : exception; -— это исключение возбуждается в процедуре end; -— INSERT, если таблица заполнена
Детали реализации таких пакетов могут быть достаточно сложными; в данном случае используются двусвязные списки внутренних элементов. Локальная вспомогательная процедура EXCHANGE используется для перемещения внутренних элементов из списка занятых в список свободных. Начальные связи таблицы устанавливаются в разделе инициализации. Нет необходимости показывать пользователям тело пакета.
package body TABLE_MANAGER is
SIZE : constant := 2000; subtype INDEX is INTEGER range 0 .. SIZE;
type INTERNAL-ITEM is record
CONTENT : ITEM; SUCC : INDEX; PRED : INDEX; end record;
TABLE : array (INDEX) of INTERNAL-ITEM; FIRST_BUSY_ITEM : INDEX := 0; FIRST_FREE_ITEM : INDEX := 1; function FREE_LIST_EMPTY return BOOLEAN is ...
end;
function BUSY_LIST_EMPTY return BOOLEAN is ... end;
procedure EXCHANGE (FROM : in INDEX; TO : in INDEX) is ... end;
procedure INSERT (NEWJTEM : in ITEM) is begin
if FREE_LIST_EMPTY then raise TABLE_FULL; end if;
-— остальная часть кода подпрограммы INSERT end INSERT;
procedure RETRIEVE (FIRSTJTEM : out ITEM) is ... end;
begin
-— инициализация связей таблицы end TABLE_MANAGER;
Пред. | Уровень выше | След. |
7.4. ОПИСАНИЯ ЛИЧНЫХ ТИПОВ И СУБКОНСТАНТ |
Содержание | 7.6. ПРИМЕР ПАКЕТА ОБРАБОТКИ ТЕКСТОВ |
Пример ввода-вывода
В примере показано использование некоторых средств ввода-вывода текстов в режиме диалога. Пользователю предлагается выбрать цвет; программа в соответствии с описью выдает число предметов этого цвета на складе. Используются файлы ввода и вывода по умолчанию. Для простоты все необходимые конкретизации настройки заданы в одной подпрограмме;
на практике для этого мог бы использоваться самостоятельный пакет.
with TEXT_IO; use TEXT_IO; procedure DIALOGUE is
type COLOR is (WHITE, RED, ORANGE, YELLOW, GREEN, BLUE, BROWN); package COLOR_IO is new ENUMERATION_10(ENUM => COLOR); package NUMBER_IO is new INTEGER_IO(INTEGER);
use COLOR_IO, NUMBER_IO;
INVENTORY : array (COLOR) of INTEGER := (20, 17, 43, 10, 28, 173, 87); CHOICE : COLOR;
procedure ENTER_COLOR (SELECTION : out COLOR) is begin
loop
begin
PUT ("Color selected: "); -— обращение к пользователю GET (SELECTION); -— вводит набранный цвет или возбуждает исключение return;
exception
when DATA_ERROR => PUT("lnvalid color, try again. ");-- пользователь должен набрать новую строчку NEW_LINE(2); -- завершение выполнения оператора блока end;
end loop;
-— повторение оператора блока, пока не будет получен правильнй цвет end;
begin -- операторы процедуры DIALOGUE;
NUMBERJO.DEFAULT_WIDTH := 5; loop
ENTER_COLOR(CHOICE); -- пользователь набирает цвет и -— начинает новую строчку SET_COL(5); PUT(CHOICE); PUT(" items available:"); SET_COL(40); PUT(INVENTORY(CHOICE)); -— ширина по умолчанию равна 5 NEW_LINE; end loop;
end DIALOGUE;
Пример диалога (набранное пользователем выделено курсивом):
ВЫБРАННЫЙ ЦВЕТ: Black
ОШИБОЧНЫЙ ЦВЕТ, ПОВТОРИТЕ НАБОР
ВЫБРАННЫЙ ЦВЕТ: Blue
BLUE ВСЕГО ПРЕДМЕТОВ: 173 ВЫБРАННЫЙ ЦВЕТ: Yellow
YELLOW ВСЕГО ПРЕДМЕТОВ: 10
Пред. | Уровень выше | След. | |
14.6. ВВОД-ВЫВОД НИЗКОГО УРОВНЯ
|
Содержание | Приложение A.
АТРИБУТЫ, ПРЕДОПРЕДЕЛЕННЫЕ В ЯЗЫКЕ |
Приоритеты
Каждая задача может (но не обязательно) иметь приоритет со значением подтипа PRIORITY (типа INTEGER), описанного в предопределенном библиотечном пакете SYSTEM (см. 13.7). Меньшее значение приоритета указывает на меньшую степень важности; диапазон приоритетов определяется реализацией. Приоритет связывается с задачей, если в спецификации соответствующей задачи присутствует прагма:
pragma
PRIORITY (статическое-выражение);
Приоритет задается значением выражения. Если такая прагма присутствует в самом внешнем разделе описаний главной программы, то приоритет связывается с главной программой. В спецификации данной задачи или при подпрограмме — библиотечном модуле может употребляться не более одной такой прагмы, и это единственные места, допустимые для этой прагмы. Прагма PRIORITY игнорируется при ее появлении в подпрограмме, не являющейся главной программой.
Спецификация приоритета является указанием, помогающим реализации в распределении ресурсов между параллельными задачами, когда число выполняемых задач превышает возможности их одновременной обработки имеющимися ресурсами. Влияние приоритетов на порядок очередности выполнения задач определяется следующим правилом.
Если две задачи с разными приоритетами готовы к выполнению и могут практически выполняться, используя одни и те же физические процессоры и одни и те же ресурсы обработки, то нельзя чтобы выполнялась задача с более низким приоритетом, а не выполнялась задача с более высоким приоритетом.
Для задач с одинаковыми приоритетами порядок выполнения не определен. Для задач, приоритеты которых не заданы, правила очередности не определены, исключая случай, когда между задачами происходит рандеву. Если приоритеты обеих задач определены, то рандеву выполняется с той задачей, чей приоритет является наибольшим. Если приоритет определен только для одной задачи, то рандеву выполняется как минимум с приоритетом этой задачи. Если приоритеты задач не заданы, то приоритет рандеву также не определен.
Примечание.
Приоритет задачи является статическим и поэтому фиксирован. Однако приоритет во время рандеву может и не быть статическим, поскольку он также зависит от приоритета задачи, вызывающей вход. Приоритеты следует использовать только для указания относительной степени важности; их не следует использовать для синхронизации задач.
Ссылки:
главная программа 10.1, задача 9, оператор вызова входа 9.5, пакет SYSTEM 13.7, подтип 3.3, прагма 2.8, раздел описаний 3.9, рандеву 9.5, спецификация задачи 9.1, статическое выражение 4.9, целый тип 3.5.4.
Пред. | Уровень выше | След. |
9.7.2. УСЛОВНЫЕ ВЫЗОВЫ ВХОДОВ |
Содержание | 9.9. АТРИБУТЫ ЗАДАЧ И ВХОДОВ |
Профиль типа параметров и результата совмещение подпрограмм
Два раздела формальных параметров называются имеющими одинаковый профиль типа параметров тогда и только тогда, когда они имеют одинаковое число параметров, а в каждой позиции соответствующие параметры имеют один и тот же базовый тип. Подпрограмма или вход имеет одинаковый профиль типа параметров и результата с другой подпрограммой или
входом тогда и только тогда, когда оба имеют одинаковый профиль типа параметров, и либо оба являются функциями с одним и тем же базовым типом результата, либо оба функциями не являются.
Один и тот же идентификатор подпрограммы или знак операции может быть использован для нескольких спецификаций подпрограмм. В этом случае идентификатор или знак операции называется совмещенным; подпрограммы, которые имеют этот идентификатор или знак операции, тоже называются совмещенными и, следовательно, могут совмещаться друг с другом. Как поясняется в разд. 8.3, если две подпрограммы совмещаются друг с другом, то одна из них может скрыть другую, только если обе подпрограммы имеют одинаковый профиль типа параметров и результата [6]
(см. 8.3, где описаны другие требования, необходимые для скрытия).
Вызов совмещенной подпрограммы неоднозначен (и поэтому неправилен), если ее имя, число сопоставлений параметров, типы и порядок фактических параметров, имена формальных параметров (при использовании именованных сопоставлений параметров) и тип результата (для функций) не позволяют идентифицировать единственную (совмещенную) спецификацию подпрограммы.
Примеры совмещенных подпрограмм:
procedure PUT(X : INTEGER»; procedure PUT(X : STRING); procedure SET(TINT : COLOR); procedure SET(SIGNAL : LIGHT);
Примеры вызовов:
PUT(28); PUT("no possibte ambiguity here"); SET(TINT => RED»: SET(SIGNAL => RED); SET(COLOR'(RED));
-- SET (RED) может быть неоднозначным, так как -- может обозначать значение типа COLOR и типа
Примечание.
Понятие профиля типа параметров и результата не учитывает имен параметров, их видов и подтипов, а также присутствия или отсутствия выражений по умолчанию.
Неоднозначности могут ( но не обязательно) также возникнуть, когда фактические параметры вызова совмещенной подпрограммы сами являются вызовами совмещенной функции, совмещенными литералами или агрегатами.
Неоднозначности могут (но не обязательно) также возникнуть, когда видимы несколько совмещенных подпрограмм, принадлежащих различным пакетам. Этих неоднозначностей можно избежать несколькими способами: использовать квалифицированные выражения для некоторых или для всех фактических параметров и результата, если он есть; имя такой подпрограммы можно задавать более точно расширенным именем; наконец, такая подпрограмма может быть переименована.
Ссылки:
агрегат 4.3, базовый тип 3.3, вид 6.1, вход 9.5, вызов функции 6.4, выражение по умолчанию для формального параметра 6.1, знак операции 6.1, идентификатор 2.3, именованное сопоставление параметров 6.4, квалифицированное выражение 4.7, литерал 4.2, неправильный 1.6, описание переименования 8.5, пакет 7, параметр подпрограммы 6.2, подпрограмма 6, подтип 3.3, подтип результата 6.1, скрытие 8.3, совмещение 8.7, спецификация подпрограммы 6.1, тип 3.3, фактический параметр 6.4.1, формальный параметр 6.1, функция 6.5.
[6]
1) Имеется в виду, что обе подпрограммы имеют разные зоны описания. -
Прим. ред.
Пред. | Уровень выше | След. |
6.5. ФУНКЦИИ |
Содержание | 6.7. СОВМЕЩЕНИЕ ОПЕРАЦИЙ |
Программная библиотека
Правила языка требуют, чтобы компилятор одинаковым образом обрабатывал программу, состоящую из нескольких компилируемых модулей (и субмодулей) или из одного компилируемого модуля. Должен быть предусмотрен библиотечный файл, содержащий информацию о компилируемых модулях программной библиотеки, в который могут включаться символьные таблицы и другая информация, относящаяся к предыдущим компиляциям.
Обычно входными данными для компилятора являются компилируемые модули (или модуль) и библиотечный файл. Последний используется для проверок и корректируется после успешного компилирования каждого из этих модулей.
Примечание.
Для компилируемых модулей компиляции создается одна программная библиотека. Возможно существование различных программных библиотек; в языке не определены правила их именования — это обеспечивается окружением системы программирования.
Для создания программной библиотеки данной программы или данного семейства программ следует ввести команды. Эти команды могут разрешать использование модулей из других программных библиотек. Наконец, для запроса состояний модулей в программной библиотеке также следует ввести команды. Форма этих команд не задана в определении языка.
Ссылки:
компилируемый модуль 10.1, порядок компиляции 10.3, программа 10.1, программная библиотека 10.1, спецификатор использования 8.4, спецификатор контекста 10.1.1, спецификатор совместности 10.1.1, субмодуль 10.2.
Пред. | Уровень выше | След. | |
10.3. ПОРЯДОК КОМПИЛЯЦИИ
|
Содержание |
10.5. ПРЕДВЫПОЛНЕНИЕ БИБЛИОТЕЧНЫХ МОДУЛЕЙ |
Производные типы
Определение производного типа задает новый (базовый) тип, свойства которого наследуют свойства
родительского типа:
новый тип называется
производным типом.
Определение производного типа создает одновременно
производный подтип,
являющийся подтипом производного типа.
определение-производного-типа ::=
new
указание-подтипа
Указание подтипа после зарезервированного слова
new
определяет
родительский подтип.
Родительский тип является базовым для родительского подтипа. Если для родительского подтипа существует ограничение, то подобное ограничение существует и для производного подтипа; разница состоит только в том, что для ограничения диапазона и для ограничения плавающего или фиксированного типов, которое включает ограничение диапазона, значение каждой границы заменяется на соответствующее значение производного типа. Производный тип обладает следующими свойствами:
• Производный тип относится к тому же самому классу типов, что и родительский тип. Набор возможных значений для производного типа есть копия набора возможных значений для родительского типа. Если родительский тип составной, то такие же компоненты существуют и у производного типа, а подтип соответствующих компонент тот же самый.
• Для каждой базовой операции над родительским типом существует соответствующая базовая операция над производным типом. Допускается явное преобразование значения родительского типа в соответствующее значение производного типа и наоборот, как поясняется в разд. 4.6.
• Для каждого литерала перечисления или предопределенной операции над родительским типом существует соответствующая операция над производным типом.
• Если родительский тип — задачный тип, то для каждого входа родительского типа существует соответствующий вход производного типа.
• Если выражение по умолчанию существует для компоненты объекта, имеющего родительский тип, то то же самое выражение используется для соответствующей компоненты объекта производного типа.
• Если родительский тип — ссылочный тип, то родительский и производный типы имеют один и тот же набор; существует пустое ссылочное значение для производного типа, которое по умолчанию является значением этого типа.
• Если существует явный спецификатор представления для родительского типа и если этот спецификатор расположен до (но не после) определения производного типа, то соответствующий спецификатор представления неявно задан и для производного типа.
• Подпрограммы, которые являются операциями над родительским типом, называются наследуемыми. Для каждой наследуемой подпрограммы родительского типа имеется соответствующая производная подпрограмма над производным типом. Могут быть выделены два сорта наследуемых подпрограмм. Во-первых, если родительский тип описан непосредственно в видимом разделе пакета, то подпрограмма, явно описанная непосредственно в видимом разделе, становится наследуемой после конца видимого раздела (если подпрограмма — операция над родительским типом). (Явное описание — это описание подпрограммы, описание переименования подпрограммы или конкретизация настройки.) Во-вторых, если родительский тип сам является производным и не описан в видимом разделе пакета, то подпрограмма, которая стала наследуемой, и она не скрыта наследуемой подпрограммой первого сорта, является далее наследуемой.
Описание производного типа неявно описывает операции над производным типом. Неявные описания любых производных подпрограмм следуют за описанием производного типа.
Спецификация производной подпрограммы неявно получается систематическим замещением родительского типа на производный тип в спецификации наследуемой подпрограммы. Любой подтип родительского типа подобным образом замещается подтипом производного типа с аналогичными ограничениями (как при замене ограничения родительского подтипа на соответствующее ограничение производного подтипа). Наконец, любое выражение родительского типа можно использовать как операнд преобразования типа, которое вырабатывает результат производного типа.
Вызов производной подпрограммы эквивалентен вызову соответствующей подпрограммы родительского типа, в котором каждый фактический параметр производного типа заменяется преобразованием типа этого фактического параметра на родительский тип (это означает, что преобразование к родительскому типу происходит перед вызовом параметров вида
in и in out;
обратное преобразование к производному типу происходит после вызова параметров вида
in out и out,
см. 6.4.1). Дополнительно, если результат вызванной функции имеет родительский тип, то он преобразуется к производному типу.
Если производный или личный тип описан непосредственно в видимом разделе пакета, то в нем этот тип не должен использоваться как родительский тип в определении производного типа. (Для личных типов см. также разд. 7.4.1.)
При предвыполнении определения производного типа сначала предвыполняется указание подтипа, затем создается производный подтип.
Примеры:
type LOCAL-COORDINATE is new COORDINATE; —- Два различных типа type MIDWEEK is new DAY range TUE .. THU; —- CM. 3.5.1 type COUNTER is new POSITIVE; -- тот же диапазон, что и у POSITIVE type SPECIAL-KEY is new KEYMANAGER.KEY; — CM. 7.4.2 -- Производные подпрограммы имеют следующие спецификации:
--procedure GETKEY(K : out SPECIAL_KEY); -—function "<"(X,Y : SPECIAL_KEY) return BOOLEAN;
Примечание.
Из правил наследования базовых операций и литералов перечисления следует, что обозначения для литерала или агрегата производного типа те же самые, что и для родительского типа; такие литералы и агрегаты называются
совмещенными.
Из правил также следует, что обозначения компоненты, дискриминанта, входа, отрезка или атрибута одинаковы для производного и родительского типов.
Скрытие производной подпрограммы допустимо даже в одной и той же зоне описания (см. 8.3). Производная подпрограмма скрывает предопределенную операцию, имеющую тот же профиль типа параметров и результата (см. 6.6).
Описание настраиваемой подпрограммы не наследуется, поскольку оно описывает настраиваемый модуль, а не подпрограмму. С другой стороны, конкретизация настраиваемой подпрограммы является (ненастраиваемой) подпрограммой, которая является наследуемой, если она удовлетворяет требованиям наследуемости подпрограмм.
Если родительский тип является логическим, то предопределенные операции отношения над производным типом дают результаты предопределенного типа BOOLEAN (см. 4.5.2).
Если спецификатор представления дан для родительского типа и помещен за описанием производного типа, то соответствующий спецификатор представления неприменим к производному типу; следовательно, для такого производного типа допускается явный спецификатор представления.
Если параметр производной подпрограммы принадлежит производному типу, подтип это-
.-, го
параметра не обязан иметь значение, общее с производным подтипом.
Ссылки:
агрегат 4.3, атрибут 4.1.4, базовая операция 3.3.3, базовый тип 3.3, вид 6.1, видимый раздел 7.2, вход 9.5, вызов функции 6.4, выражение по умолчанию 3.2.1, граница диапазона 3.5, дискриминант 3.3, зарезервированное слово 2.9, зона описания 8.1, класс типа 3.3, компонента 3.3, литерал 4.2, литерал перечисления 3.5.1, личный тип 7.4, логический тип 3.5.3, набор 3.8, начальное значение по умолчанию для ссылочного типа 3.8, непосредственно в 8.1, неявное описание 3.1, ограничение 3.3, ограничение диапазона 3.5, ограничение плавающего типа 3.5.7, ограничение фиксированного типа 3.5.9, оператор вызова процедуры 6.4, описание 3.1, описание настройки 12.1, определение типа 3.3.1, отрезок 4.1.2, пакет 7, подпрограмма 6, подтип 3.3, предвыполнение 3.9, предопределенная операция 4.5, преобразование 4.6, процедура б, совмещение 6.6, 8.7, сопоставление параметров 6.4, составной тип 3.3, спецификатор представления 13.1, спецификация пакета 7.1, спецификация подпрограммы 6.1, ссылочное значение 3.8, тип 3.3, указание подтипа 3.3.2, фактический параметр 6.4.1, формальный параметр 6.1.
Пред. | Уровень выше | След. |
3.3. ТИПЫ И ПОДТИПЫ |
Содержание | 3.5. СКАЛЯРНЫЕ ТИПЫ |
Простые и составные операторы последовательности операторов
Оператор может быть или простым, или составным. Простой оператор не содержит других операторов. Составной оператор содержит простые операторы и другие составные операторы.
последовательность-операторов ::= оператор (оператор) оператор ::= {метка} простой-оператор | {метка} составной-оператор простой-оператор ::= пустой-оператор | оператор-присваивания | оператор-вызова-процедуры | оператор-выхода | оператор-возврата | оператор-перехода | оператор-вызова-входа | оператор-задержки | оператор-прекращения | оператор-возбуждения | оператор-кода
составной-оператор ::= условный-оператор | оператор-выбора | оператор-цикла | оператор-блока | оператор-принятия | оператор-отбора
метка ::= << простое-имя-метки >> пустой-оператор ::= null:
Говорят, что имя каждой метки, стоящей перед оператором,
помечает
этот оператор. Имя метки (а также имя цикла или блока) неявно описано в конце раздела описаний самого внутреннего блока, тела подпрограммы, тела пакета, тела задачи или настраиваемого тела, которые содержат данный помеченный оператор (именованный оператор цикла или именованный оператор блока). При отсутствии в операторе блока раздела описаний подразумевается, что оператор блока содержит неявный раздел описаний (с предшествующим
declare
).
Имена меток, циклов и блоков неявно описываются в порядке появления в тексте программы начал соответствующих помеченных операторов, операторов цикла и операторов блока. Для имен меток, циклов и блоков, неявно описанных в теле программного модуля, включая вложенные в это тело операторы блока, но исключая другие вложенные программные модули (т. е. подпрограммы, пакеты, задачи или настраиваемые модули), должны использоваться различные идентификаторы.
Выполнение пустого оператора заключается в переходе к выполнению следующего оператора.
Выполнение последовательности операторов состоит в поочередном выполнении отдельных операторов последовательности, пока они все не будут закончены или пока не произойдет передача управления.
Передача управления вызывается выполнением операторов выхода, возврата или перехода, выбором альтернативы завершения, возбуждением исключения или (неявно) выполнением оператора прекращения.
Примеры помеченных операторов:
<<HERE>> <<ICI>> <<AQUI>> <<HIER>>
null;
<<AFTER>> X := 1;
Примечание.
Область действия описания начинается самим описанием (см. 8.2). Область действия
неявного
описания имени метки, цикла или блока начинается до первого
явного
появления соответствующего имени, поскольку это появление возможно лишь в качестве метки оператора, в операторе блока, операторе цикла или операторе перехода. Неявное описание в операторе блока может скрыть описание, данное во внешнем программном модуле или операторе блока (согласно обычным правилам скрытия, изложенным в разд. 8.3).
Ссылки:
альтернатива завершения 9.7.1, возбуждение исключений 11, завершенная задача 9.4, задача 9, задачный модуль 9.1, идентификатор 2.3, имя блока 5.6, имя цикла 5.5, исключение 11, настраиваемое тело 12.1, настраиваемый модуль 12, неявное описание 3.1, область действия 8.2, оператор блока 5.6, оператор возбуждения 11.3, оператор возврата 5.8, оператор выбора 5.4, оператор вызова входа 9.5, оператор вызова процедуры 6.4, оператор выхода 5.7, оператор задержки 9.6, оператор кода 13.8, оператор отбора 9.7, оператор перехода 5.9, оператор прекращения 9.10, оператор принятия 9.5, оператор, присваивания 5.2, оператор цикла 5.5, описание 3.1, пакет 7, подпрограмма 6, программный модуль 6, простое имя 4.1, раздел описаний 3.9, скрытие 8.3, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, условный оператор 5.3.
Пред. | Уровень выше | След. |
4.10. УНИВЕРСАЛЬНЫЕ ВЫРАЖЕНИЯ |
Содержание | 5.2. ОПЕРАТОРЫ ПРИСВАИВАНИЯ |
Разделяемые переменные
Обычными средствами передачи данных между задачами являются операторы вызова и принятия входов.
Если две задачи считывают или изменяют
разделяемую
переменную (доступную обеим задачам), то ни одна из них ничего не может знать о порядке выполнения операций над переменной в другой задаче, исключая точки их синхронизации. Две задачи синхронизуются в начале и в конце их рандеву. В начале и в конце своей активизации задача синхронизуется с вызвавшей эту активизацию задачей. Задача, которая закончила свое выполнение, синхрони-зуема с любой другой задачей.
О действиях, выполняемых программой, использующей разделяемые переменные, всегда могут быть сделаны следующие предположения:
• Если в интервале времени между двумя точками синхронизации задача считывает разделяемую переменную скалярного или ссылочного типа, то эта переменная не изменяется никакой другой задачей в течение данного интервала времени.
• Если в интервале времени между двумя точками синхронизации задача изменяет разделяемую переменную скалярного или ссылочного типа, то эта переменная не считывается и не изменяется никакой другой задачей в течение данного интервала времени.
Выполнение программы ошибочно, если какое-либо из этих предположений нарушено.
Если данная задача считывает значение разделяемой переменной, сделанные выше предположения допускают, чтобы реализация поддерживала локальные копии значения (например, в регистрах или в некоторых других видах временной памяти); и пока данная задача не достигла точки синхронизации или не изменила значение разделяемой переменной, следствием принятых допущений является то, что для данной задачи чтение локальной копии эквивалентно чтению собственно разделяемой переменной.
Аналогично если данная задача изменяет значение разделяемой переменной, сделанные предположения допускают, чтобы реализация поддерживала локальные копии значения и откладывала запоминание локальной копии в разделяемую переменную до точки синхронизации, заменяя каждые последующие считывание или изменения значений разделяемой переменной на считывание или изменение локальной копии.
С Другой стороны, не допускается, чтобы реализация вводила такую память, которая не будет обрабатываться в каноническом порядке (см. 11.6).
Для задания того, что каждое считывание или изменение значения разделяемой переменной является для этой переменной точкой синхронизации, может быть использована прагма SHARED, т.е. для данной переменной (но не обязательно для остальных) сделанных выше предположения справедливы. Форма этой прагмы следующая:
pragma
SHARED (простое-имя-переменной);
Прагма допустима только для переменной, объявленной описанием объекта скалярного или ссылочного типа; описание переменной и прагма должны помещаться (в таком порядке) непосредственно в одном и том же разделе описаний или в спецификации пакета; прагма должна появиться до любого вхождения имени переменной, отличного от вхождения в спецификаторе адреса.
Реализация должна ограничивать объекты, для которых допустима прагма SHARED, объектами, для которых каждое прямое считывание или прямое изменение реализуется неделимыми операциями.
Ссылки:
активизация 9.3, глобальный 8.1, задача 9, изменение значение 6.2 канонический порядок 11.6, оператор вызова входа 9.5, оператор принятия 9.5, ошибочный 1.6, переменная 3.2.1, прагма 2.8, присваивание 5.2, простое имя 3.1, 4.1, раздел описаний 3.9, рандеву 9.5, спецификация пакета 7.1, тип 3.3, чтение значения 6.2.
Пред. | Уровень выше | След. |
9.10. ОПЕРАТОРЫ ПРЕКРАЩЕНИЯ |
Содержание | 9.12. ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАДАЧИ |
Разделы описаний
Раздел описаний содержит элементы описания (возможно, и ни одного).
раздел-описаний ::= {основной-элемент-описания} {дополнительный - элемент - описания}
основной-элемент-описания ::= основное-описание | спецификатор-представления | спецификатор-использования
дополнительный-элемент-описания ::= тело | описание-подпрограммы | описание-пакета | описание-задачи | описание-настройки | спецификатор-использования | конкретизация-настройки
тело ::= соответствующее-тело | след-тела
соответствующее-тело ::= тело-подпрограммы | тело-пакета | тело-задачи
Предвыполнение раздела описаний состоит из предвыполнения элементов описания, если они есть, в порядке их следования в разделе описаний. После своего предвыполнения элемент описания называется
предвыпопненным.
До окончания своего предвыполнения (включая фазу перед предвыполнением) элемент описания еще не предвыполнен.
Для нескольких форм элементов описания правила языка (в частности, правило определения области действия и правила видимости) таковы, что использование понятия до предвыполнения элемента описания, который объявляет это понятие, либо невозможно, либо является неправильным. Например, невозможно использование имени типа для описания объекта, если соответствующее описание типа еще не предвыполнено. В случае тел осуществляются следующие проверки:
• При вызове подпрограммы проверяется, предвыполнено ли уже тело подпрограммы.
• При активизации задачи проверяется, предвыполнено ли уже тело соответствующего за-дачного модуля.
• При конкретизации настраиваемого модуля, имеющего тело, проверяется, предвыполнено ли уже тело настраиваемого модуля.
Если одна из этих проверок дает отрицательный результат, возбуждается исключение PROGRAM_ERROR.
Если описание подпрограммы, описание пакета, описание задачи или описание настраиваемого понятия являются элементами описания данного раздела описаний, то тело (если оно существует) программного модуля, описанного элементом описания, должно само быть элементом описания этого раздела описаний (и должно помещаться ниже).
Если тело представлено следом тела, то для этого программного модуля необходим раздельно компилируемый субмодуль, содержащий соответствующее тело (см. 10.2).
Ссылки:
активизация 9.3, видимость 8.3, вызов подпрограммы 6.4, исключение PROGRAM_ERROR 11.1, конкретизация 12.3, область действия 8.2, тип 3.3.
Предвыполнение описаний:
3.1, конкретизация настройки 12.3, неполное описание типа 3.8.1, описание входа 9.5, описание задачи 9.1, описание компоненты 3.7, описание личного типа 7.4.1, описание настройки 12.1, описание объекта 3.2.1, описание пакета 7.2, описание переименования 8.5, описание подпрограммы 6.1, описание подтипа 3.3.2, описание субкон-станты 7.4.3, описание типа 3.3.1, описание числа 3.2.2, спецификация дискриминанта 3.7.1, спецификация литерала перечисления 3.5.1, спецификация параметра 6.1, спецификация параметра цикла 5.5.
Предвыполнение определений типа:
3.3.1, определение вещественного типа 3.5.6, определение именуемого типа 3.7, определение индексируемого типа 3.6, определение перечислимого типа 3.5.1, определение производного типа 3.4, определение ссылочного типа 3.8, определение целого типа 3.5.4.
Предвыполнение других конструкций:
библиотечный модуль 10.5, задача 9.2, компилируемый модуль 10.1, настраиваемое тело 12.2, раздел дискриминантов 3.7.1, след тела 10.2, спецификатор использования 8.4, спецификатор контекста 10.1, спецификатор представления 13.1, спецификатор совместности 10.1.1, спецификация задачи 9.1, субмодуль 10.2, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, формальный параметр настройки 12.1, 12.3.
Пред. | Уровень выше | След. |
3.8. ССЫЛОЧНЫЕ ТИПЫ |
Содержание | Глава 4. ИМЕНА И ВЫРАЖЕНИЯ |
Символьные литералы
Символьный литерал — это один из 95 графических символов (включая пробел), заключенный между двумя символами апострофа. Символьный литерал имеет значение символьного типа.
символьный-литерал ::= 'графический-символ'
Примеры:
'А' '*' ''' ' '
Ссылки:
графический символ 2.1, литерал 4.2, символ пробела 2.1, символьный тип 3.5.2.
Пред. | Уровень выше | След. | |
2.4. ЧИСЛОВЫЕ ЛИТЕРАЛЫ | Содержание | 2.6. СТРОКОВЫЕ ЛИТЕРАЛЫ |
Системный пакет
Для каждой реализации имеется предопределенный библиотечный пакет SYSTEM, который включает определения некоторых характеристик, зависящих от конфигурации. Спецификация пакета зависит от реализации и должна быть приведена в приложении F. Видимый раздел этого пакета должен содержать по крайней мере следующие описания:
package SYSTEM is
type ADDRESS is определен-реализацией;
type NAME is определенный-реализацией-перечислимого-типа;
SYSTEM-NAME : constant NAME := определен - реализацией;
STORAGE-UNIT : constant := определен-реализацией;
MEMORY-SIZE : constant := определен-реализацией;
-- зависящие от системы именованные числа: MIN-INT : constant := определен-реализацией;
МАХ-INT : constant := определен-реализацией;
MAX-DIGITS : constant := определен-реализацией;
MAX-MANTISSA : constant := определен-реализацией;
FINE-DELTA : constant := определен-реализацией;
TICK : constant := определен-реализацией;
-- другие зависящие от системы описания: subtype PRIORITY is INTEGER range определен-реализацией;
end SYSTEM;
Тип ADDRESS — это тип адресов, задаваемых спецификаторами адреса; к этому же типу принадлежат значения, вырабатываемые атрибутом ADDRESS. Значения перечислимого типа NAME — это имена альтернативных машинных конфигураций, обрабатываемых реализацией;
одно из них — константа SYSTEM-NAME. Именованное число STORAGE-UNIT равно числу разрядов в кванте памяти, а именованное число MEMORY-SIZE — числу квантов памяти, доступных в конфигурации; эти именованные числа имеют
универсальный-целый
тип.
Альтернативная форма пакета SYSTEM с другими значениями SYSTEM-NAME, STORAGE-UNIT и MEMORY-SIZE может быть получена использованием соответствующих прагм. Эти прагмы допустимы только в начале компиляции до первого компилируемого модуля (если он есть) компиляции.
pragma
SYSTEM-NAME (литерал-перечисления);
В результате выполнения этой прагмы заданный идентификатором литерал перечисления будет использован для определения константы SYSTEM-NAME.
Эта прагма допустима, только если этот идентификатор соответствует одному из литералов типа NAME.
pragma
STORAGE-UNIT (числовой-литерал);
В результате выполнения этой прагмы заданное числовым литералом значение будет использовано для определения именованного числа STORAGE-UNIT.
pragma
MEMORY-SIZE (числовой-литерал);
В результате выполнения этой прагмы заданное числовым литералом значение будет использовано для определения именованного числа MEMORY-SIZE.
Компиляция любой из этих прагм вызовет неявную перекомпиляцию пакета SYSTEM. Следовательно, любой компилируемый модуль, в спецификаторе контекста которого упоминается пакет SYSTEM, становится устаревшим. Реализация может ввести дополнительные ограничения на использование этих прагм. Например, реализация может допустить их только в начале первой компиляции, когда создается новая программная библиотека.
Примечание.
Согласно правилам видимости, описание из пакета SYSTEM видимо в компилируемом модуле только в том случае, если этот пакет упомянут в спецификаторе совместности, примененном (непосредственно или косвенно) к данному компилируемому модулю.
Ссылки:
атрибут 4.1.4, библиотечный модуль 10.1, видимость 8.3, видимый раздел 7.2, должен 1.6, идентификатор 2.3, именованное число 3.2, компилируемый модуль 10.1, литерал перечисления 3.5.1, описание 3.1, описание числа 3.2.2, пакет 7, перечислимый тип 3.5.1, прагма 2.8, применим 10.1.1, программная библиотека 10.1, спецификатор адреса 13.5, спецификатор совместности 10.1.1, спецификация пакета 7.1, тип 3.3, числовой литерал 2.4.
13.7.1. ЗАВИСЯЩИЕ ОТ СИСТЕМЫ ИМЕНОВАННЫЕ ЧИСЛА
Перечисленные ниже именованные числа описаны в пакете SYSTEM. Числа FINE-DELTA и TICK принадлежат
универсальному-вещественному
типу, остальные —
универсальному-целому
типу.
MIN-INT |
Наименьшее (наибольшее по модулю отрицательное) значение из всех определенных целых типов. |
МАХ-I NT |
Наибольшее (положительное) значение из всех предопределенных целых типов. |
MAX-DIGITS |
Наибольшее допустимое значение числа значащих десятичных цифр в ограничении для плавающего типа. |
MAX-MANTISSA |
Наибольшее возможное число двоичных цифр в мантиссе модельных чисел фиксированного подтипа. |
FINE-DELTA |
Наименьшая дельта, допустимая в ограничении для фиксированного типа, которое имеет ограничение диапазона -1.0..1.0. |
TICK |
Базовый период времени, выраженный в секундах. |
/p>
Ссылки:
дельта из ограничения фиксированного типа 3.5.9, допустим 1.6, именованное число 3.2, модельное число 3.5.6, ограничение диапазона 3.5, ограничение для плавающего типа 3.5.7, ограничение для фиксированного типа 3.5.9, пакет 7, пакет SYSTEM 13.7, тип 3.3, универсальный-вещественный тип 3.5.6, универсальный-целый тип 3.5.4, целый тип 3.5.4.
13.7.2. АТРИБУТЫ ПРЕДСТАВЛЕНИЯ
Значения некоторых зависящих от реализации характеристик могут быть определены с помощью соответствующих
атрибутов представления.
Эти атрибуты описаны ниже.
Для любого объекта, программного модуля, метки или входа X:
X'ADDRESS |
Вырабатывает адрес первого кванта памяти, отведенной под X. Для подпрограммы, пакета, задачного модуля или метки это значение ссылается на машинный код, связанный с соответствующим телом или оператором. Для входа, для которого задан спецификатор адреса, это значение ссылается на соответствующее аппаратное прерывание. Значение этого атрибута принадлежит типу ADDRESS, определенному в пакете SYSTEM. |
Для любого типа или подтипа Х или для любого объекта X:
X'SIZE |
Примененный к объекту вырабатывает число битов, отводимых в памяти для размещения объекта. Примененный к типу или подтипу вырабатывает минимальное число битов, необходимое реализации для размещения любого возможного объекта этого типа или подтипа. Значение этого атрибута имеет тип универсальный-целый. |
Если префиксом атрибута является функция, то атрибут понимается как атрибут функции (а не как результат вызова функции). Если тип префикса — ссылочный тип, то атрибут понимается как атрибут префикса (а не указанного объекта: атрибуты этого объекта могут быть записаны с префиксом, оканчивающимся зарезервированным словом all).
Для любого компонента С записи R:
R.C'POSITION |
Вырабатывает величину смещения первого кванта памяти, занятого полем С, относительно первого кванта памяти, занятого записью R. Величина смещения измеряется числом квантов. Значение этого атрибута принадлежит универсальному-целому типу. |
R.C'FIRST_BIT |
Вырабатывает величину смещения первого бита, занятого полем С, относительно первого кванта памяти. Величина смещения измеряется числом битов. Значение этого атрибута имеет универсальный-целый тип. |
R.C'LAST_BIT |
Вырабатывает величину смещения последнего бита, занятого полем С, относительно первого кванта памяти, занятого С. Величина смещения измеряется числом битов. Значение этого атрибута имеет универсальный-целый тип. |
/p>
Для любого ссылочного типа или подтипа Т:
Т'STORAGE_SIZE |
Вырабатывает общее число квантов памяти, выделенных для набора, связанного с базовым типом Т. Значение атрибута имеет универсальный-целый тип. |
Для любого задачного типа или объекта задачного типа Т:
Т'STORAGE_SIZE |
Вырабатывает число квантов памяти, выделенных для каждой активизации задачи типа Т или активизации объекта Т задачного типа. Значение этого атрибута имеет универсальный-целый тип. |
Примечание.
Для объекта Х задачного типа атрибут X'SIZE вырабатывает число разрядов, используемых для размещения объекта X; атрибут X'STORAGE_SIZE вырабатывает число квантов памяти, выделенных для активизации задачи, указанной X. Для формального параметра Х в случае передачи параметра копированием Х'ADDRESS вырабатывает адрес локальной копии; в случае передачи параметра ссылкой Х'ADDRESS вырабатывает адрес фактического параметра.
Ссылки:
активизация 9.3, атрибут 4.1.4, базовый тип 3.3, вход 9.5, задача 9, задачный модуль 9, задачный объект 9.2, задачный тип 9.2, квант памяти 13.7, компонента 3.3, метка 5.1, набор 3.8, объект 3.2, объект именуемого типа 3.7, оператор 5, пакет 7, передача параметров 6.2, подпрограмма 6, подтип 3.3, предопределенный пакет SYSTEM 13.7, предопределенный тип ADDRESS 13.7, программный модуль 6, спецификатор адреса 13.5, ссылочный подтип 3.8, ссылочный тип 3.8, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, тип 3.3, универсальный-целый тип 3.5.4, фактический параметр 6.2, формальный параметр 6.1, 6.2.
13.7.3. АТРИБУТЫ ПРЕДСТАВЛЕНИЯ ВЕЩЕСТВЕННЫХ ТИПОВ
Для каждого вещественного типа или подтипа Т определены нижеследующие машинно-зависимые атрибуты, не связанные с модельными числами. Использующие эти атрибуты программы могут получить некоторую дополнительную информацию о характеристиках числового типа (см. разд. 4.5.7 о правилах определения точности операций с вещественными операндами). Для обеспечения переносимости программ должна быть обеспечена известная осторожность в использовании таких машинно-зависимых атрибутов.
Атрибуты, применимые к плавающим и фиксированным типам:
T'MACHINE_ROUNDS |
Вырабатывает значение TRUE, если каждая предопределенная арифметическая операция над значениями базового типа Т либо возвращает точный результат, либо осуществляет округление. В противном случае вырабатывает значение FALSE. Значение этого атрибута имеет предопределенный тип BOOLEAN. |
T'MACHINE_OVERFLOWS |
Вырабатывает значение TRUE, если каждая предопределенная операция над значениями базового типа Т либо возвращает точный результат, либо возбуждает исключение NUMERIC_ERROR при перевыполнении (см. 4.5.7); в противном случае вырабатывает значение FALSE. Значение этого атрибута имеет предопределенный тип BOOLEAN. |
Следующие атрибуты дают характеристики машинного представления значений плавающего типа в терминах канонической формы, определенной в разд. 3.5.7:
T'MACHINE_RADIX |
Вырабатывает значение основания системы счисления, используемого в машинном представлении базового типа Т. Значение этого атрибута имеет универсальный-целый тип. |
T'MACHINE_MANTISSA |
Вырабатывает число цифр в мантиссе машинного представления базового типа Т. (Цифра — это расширенная цифра из диапазона 0 .. Т'MACHINE_RADIX - 1.) Значение этого атрибута имеет универсальный-целый тип. |
T'MACHINE_EMAX |
Вырабатывает наибольшее значение порядка в машинном представлении базового типа Т. Значение этого атрибута имеет универсальный-целый тип. |
T'MACHINE_EMIN |
Вырабатывает наименьшее (наибольшее по модулю отрицательное) значение порядка в машинном представлении базового типа Т. Значение этого атрибута имеет универсальный-целый тип. |
Примечание.
В большинстве машин наибольшее представимое в машине число типа Т равно
F'MACHINE_RADIX..(F'MACHINE_EMIN - 1)
а наименьшее положительное представимое число в машине равно
F'MACHINE_RADIX ** (F'MACHINE_EMIN - 1)
Ссылки:
арифметическая операция 4.5, атрибут 4.1.4, базовый тип 3.3, вещественный тип 3.5.6, исключение NUMERIC_ERROR 11.1, логическое значение TRUE 3.5.3, логическое значение FALSE 3.5.3, модельное число 3.5.6, основание системы счисления 3.5.7, плавающий тип 3.5.7, подтип 3.3, предопределенный логический тип 3.5.3, предопределенная операция 3.3.3, тип 3.3, универсальный-целый тип 3.5.4, фиксированный тип 3.5.9, числовой тип 3.5.
Пред. | Уровень выше | След. |
13.6. ИЗМЕНЕНИЕ ПРЕДСТАВЛЕНИЯ |
Содержание | 13.8. ВСТАВКИ МАШИННЫХ КОДОВ |