ГОСУДАРСТВЕННЫЙ СТАНДАРТ
СОЮЗА ССР

ЯЗЫК ПРОГРАММИРОВАНИЯ АДА

ГОСТ 27831-88

(ИСО 8652-87 )

.. - Л 1

Издание официальное

9£S/88-8 ЕЯ





ГОСУДАРСТВЕННЫЙ КОМИТЕТ СССР ПО СТАНДАРТАМ
Москва



УДК 681.3.06:006.354 Группа П85

ГОСУДАРСТВЕННЫЙ СТАНДАРТ СОЮЗА ССР

Я

ГОСТ 27831-88

ЗЫК ПРОГРАММИРОВАНИЯ АДА

Programming language Ada


(ИСО 8652-87)



ОКСТУ 4002

Дата введения 01.07.89

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

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

  1. ОБЩИЕ ПОЛОЖЕНИЯ

    1. Область действия стандарта

В настоящем стандарте описаны форма представления и семантика про­граммных модулей, написанных на языке Ада. Цель стандарта - повысить надежность и переносимость программ для разнообразных систем обработ­ки данных.

  1. С о д е р ж а н и е стандарта

Стандарт определяет:

  1. Форму представления программного модуля, написанного на языке Ада.

  2. Результаты трансляции и выполнения такого программного модуля, в) Способ получения Ада-программ из набора программных модулей, г) Предопределенные программные модули, которые должна обеспечи­вать согласованная со стандартом реализация (далее - согласованная реа­лизация) .

  1. Допустимые в рамках стандарта изменения языка и способы их за­дания.

Издание официальное Перепечатка воспрещена

  1. * © Издательство стандартов, 1989Те нарушения стандарта, которые обязана обнаруживать согласован­ная реализация, а также результат попытки транслировать или выполнять программный модуль, содержащий такие нарушения.

  2. Те нарушения стандарта, которые согласованная реализация не обя­зана обнаруживать.

Стандарт не определяет:

  1. Средства преобразования программного модуля, написанного на языке Ада, в объектный код, выполняемый процессором.

  2. Средства инициализации трансляции, выполнения программных мо­дулей и управления ими.

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

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

м) Результат выполнения программного модуля, содержащего любое нарушение стандарта, которое согласованная реализация не обязана обнару­живать.

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

Там, где стандарт предписывает, что программный модуль, написанный на языке Ада, имеет точный результат, этот результат является функцио­нальным значением данного программного модуля, и его должны обеспе­чивать все согласованные реализации. Там, где стандарт допускает неодно­значность результата выполнения программного модуля, под функциональ­ным значением программного модуля в целом понимается множество воз­можных результатов, и согласованная реализация может обеспечить любой из возможных результатов. Примерами допустимых неоднозначностей яв­ляются:

  1. Значения фиксированных и плавающих числовых величин, а также результаты операций над ними;

  2. Порядок выполнения операторов в различных параллельных задачах при отсутствии явной синхронизации.

  1. Согласованность реализации, со стандар­том

Согласованная реализация должна:

  1. Корректно транслировать и выполнять правильные программные мо­дули, написанные на языке Ада, если только их объем находится в допусти­мых для реализации пределах.

  2. Не выполнять программные модули, объем которых больше допус­каемого реализацией.

  3. Не выполнять программные модули, содержащие ошибки, обнару­жение которых предусмотрено стандартом;

  4. Включать предусмотренные стандартом предопределенные програм­мные модули.Содержать только те изменения, которые допускает стандарт.

  5. Описывать допустимые изменения способом, разрешенным стандар­том.

  1. Структура стандарта

Стандарт содержит четырнадцать глав, четыре обязательных и два спра­вочных приложения.

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

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

Определение стандарта языка программирования Ада предполагает сле­дующее ограничение: материал каждого из перечисленных ниже пунктов но­сит информативный характер и не является частью определения стандарта языка.

  • Разд. 1.3. Цели и источники разработки.

  • Разд. 1.4. Обзор свойств языка.

  • Примеры и примечания, приведенные в конце любого раздела.

  • Каждый раздел, заголовок которого начинается со слов „Пример” или „Примеры”.

  1. Цели и источники разработки

Язык был разработан исходя из трех противоречивых требований:

  • обеспечить надежность и сопровождение программ;

  • поддерживать программирование как вид человеческой деятельности;

  • обеспечить эффективность программ.

Необходимость в языках, повышающих надежность и упрощающих со­провождение программ, является установленным фактом. В языке Ада предпочтение было отдано удобочитаемости программы по сравнению с лег­костью ее написания. Например, правила языка требуют, чтобы все перемен­ные и их типы были явно описаны в программе. Так как тип переменной не­изменен, компилятор может гарантировать совместимость операций над пе­ременными со свойствами, присущими объектам этого типа. Более того, чтобы избежать обозначений, которые могут привести к ошибкам, в синтак- сисе .^зьіка было отдано предпочтение конструкциям, которые ближе к естественному языку. Язык поддерживает раздельную компиляцию про­граммных модулей способом, облегчающим разработку и сопровождение программ и обеспечивающим один и тот же уровень контроля для межмо­дульных и внутримодульных связей.

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

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

При создании любого языка необходим учет проблемы эффективности. Языки, которые требуют сверхсложных компиляторов или приводят к не­эффективному использованию памяти и времени выполнения программы, дают неэффективные результаты на всех машинах и для всех программ. Каждая конструкция языка оценивалась с точки зрения современных ме­тодов реализации. Отвергались все те конструкции, которые были недоста­точно ясными или требовали чрезмерных машинных ресурсов.

Ни одна из указанных выше целей разработки языка не откладывалась на будущее. Все они учитывались одновременно и с самого начала разработ­ки языка.

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

Другое обстоятельство, существенно упростившее разработку, было следствием приобретенного ранее опыта реализации удачных проектов на базе языка Паскаль, созданного с целями, аналогичными указанным выше. Такими языками являются языки Евклид, Лис, Меса, Модула и Сью. Мно­гие из ключевых идей и синтаксических форм этих языков имеют аналоги в языке Ада. Некоторые существующие языки, такие как Алгол 68 и Симу- ла, а также современные проекты языков Альфард и Клу, также повлияли на разработку языка, хотя и в меньшей степени, чем языки семейства Пас­каль.

  1. Обзор свойств языка

Ада-программа представляет собой один или несколько программных модулей, которые могут компилироваться раздельно. Программные моду­ли — это подпрограммы (определяющие выполняемый алгоритм), пакеты (определяющие наборы понятий), задачные модули (определяющие парал­лельные вычисления) или настраиваемые модули (определяющие парамет­ризованные пакеты и подпрограммы). Каждый модуль обычно состоит из двух частей: спецификации, содержащей видимую для других модулей ин­формацию, и тела, содержащего детали реализации, о которых другие моду­ли не обязаны знать.

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

Ада-программа может использовать библиотеку программных модулей общего назначения.

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

Программные модули. Подпрограмма является основным модулем для представления алгоритма. Существуют два вида подпрограмм: процедуры и функции. Процедура — это средство вызова последовательности действий. Например, она может считывать данные, изменять значения переменных или выводить информацию. Процедура может иметь параметры для управления механизмом передачи информации между процедурой и точкой вызова.

Функция — это средство вызова действий по вычислению значения. Она подобна процедуре, но в результате выполнения еще и возвращает ре­зультат.

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

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

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

Описания и операторы. Тело программного модуля, как правило, со­держит две части: раздел описаний, который определяет логические поня­тия, используемые в программном модуле, и последовательность операто­ров, определяющая выполнение этого программного модуля.

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

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

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

Оператор выбора и условный оператор позволяют выполнить одну из входящих в них последовательностей операторов, определяемую значением выражения или значением условия.

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

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

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