Н. Джехани - Язык Ада (1988) (1160771), страница 59
Текст из файла (страница 59)
Языки, которые требуют сверхсложных компиляторов или приводят к неэффективному использованию памяти и времени выполнения программы, дают неэффективные результаты на всех машинах и для всех программ. При создании языка Ада каждая его конструкция оценивалась с точки зрения современных методов реализации.
Отвергались все те конструкции, которые были не. достаточно ясными или требовали чрезмерных машинных ресурсов. Ни одна из указанных выше цепей разработки языка не откладывалась на будущее. Все они учитывались одновременно и с самого начала разработки. При разработке любого языка трудность заключается в том, что необходимо определить не только возможности, которыми должен обладать язык и которые диктует предполагаемая область применения, но и собственно разработать средства языка, обеспечивающие эти возможности.
Подобная трудность существовала и при разработке языка Ада, хотя благодаря стилмановским требованиям она была меньше, чем обычно. Стилмановские требования, копь скоро требования уже существуют, позвопяпн сконцентрировать внимание собственно на создании системы, удовлетворяющей этим требованиям, что часто упрощало процесс разработки. Другое обстоятельство, существенно упростившее разработку, было следствием приобретенного ранее опыта реализации удачных проектов с целями, подобными указанным выше, на базе языка Паскаль.
Такими языками являются языки Евклид, Лис, Меса, Модула и Сью. Многие из ключевых идеи и синтаксических форм этих языков имеют аналоги в языке Ада. Некоторые существующие языки, такие как Алгол 68 и Симула, а также современные проекты языков Альфард и Клу, также повлияли на разработку языка, хотя и в меньшей степени, чем языки семейства Паскаль. Наконец, большое значение для определения стандарта языка имели его начальная разработка (язык «Зеленый ), проекты языков «Красный», «Голубой» и «Желтый», рассмотрение различных стадий проекта и тысячи замечаний, полученных из 15 стран на предварительных этапах разработки и в процессе голосования при стандартизации, — все это оказало значительное влияние на определение стандарта языка.
1.4. ОБЗОР СВОЙСТВ ЯЗЫКА Ада-программа представляет собой один или несколько программных модулей, которые могут компилироваться раздельно. Программные модули — это подпрограммы (определяющие выполняемый алгоритм), пакеты (определяющие наборы понятий), модули-задачи (определяющие параллельные вычисления) или настраиваемые модули (определяющие параметризованные пакеты и подпрограммы). Каждый модуль обычно состоит из двух частей: спецификации, содержащей видимую для других модулей информацию, и тела, содержащего детали реализации, о которых другие модули не обязаны знать. Это различие между спецификацией и телом, а также возможност~ компилировать модули раздельно позволяют разрабатывать, кодировать и тестировать программу как множество в достаточной степени независимых программных компонент. Ада-программа обычно будет использовать библиотеку программных модулей общего назначения.
Язык предоставляет средства, с помощью которых отдельные организации могут создавать свои собственные библиотеки. В тексте раздельно компилируемого программного модуля должны быть указаны имена библиотечных модулей, которые ему требуются. Программные модули Подпрограмма является основным модулем для представления алгоритма. Существует два вида подпрограмм: процедуры и функции. Процедура — это средство вызова последовательности действий. Например, она может считывать данные, изменять значения переменных или выводить информацию. Процедура может иметь параметры для управления механизмом передачи информации между процедурой и точкой вызова.
Функция — это средство вызова действий по вычислению значения. Она подобна процедуре, но в результате выполнения еще и возвращает значение. Глава Т Пакет — это основной модуль для определения набора логически связанных понятий. Например, пакет может быть использован для определения общей группы данных и типов, набора взаимосвязанных подпрограмм ипи же множества описаний типов и соответствующих операций.
Части пакета могут быть скрыты от пользователя, разрешая, таким образом, доступ только к тем логическим свойствам, которые описаны в спецификации пакета. Задачный модуль — это основной модуль для определения задачи, последовательность действий которой может выполняться параллельно с выполнением других задач. Такие задачи могут быть реализованы на многомашинной или многопроцессорнои системе либо чередованием выполнения задач на одном процессоре. Задачныи модуль может определить или одну выполняемую задачу, или задачный тип, позволяющий создать любое количество подобных задач.
Описания и операторы Тело программного модуля, как правило, содержит две части: раздел описаний, который определяет логические понятия, используемые в программном модуле, и последовательность операторов, определяющую выполнение этого программного модуля. Раздел описаний связывает имена с описанными понятиями. Например, имя может обо. значать тип, константу, переменную или исключение. Раздел описаний также может вводить имена и параметры других вложенных подпрограмм, пакеты, задачные модули и настраивае. мые модули, используемые в этом программном модуле. Последовательность операторов описывает последовательность деиствии, которые должны быть выполнены.
Операторы выполняются последовательно (если только оператор возврата, перехода, выхода нпи возбуждения исключения не выкювет продолжения выполнения с другого места). Оператор присваивания изменяет значение переменнои. Вызов процедуры инициирует вы. попнение процедуры после сопоставления каждого фактического параметра, заданного в вызове, соответствующему формальному параметру. Оператор выбора и условный оператор позволяют выполнить одну из входящих в них по. спедовательностей операторов, определяемую значением выражения или значением условия. Оператор цикла обеспечивает основной итерационный механизм в языке.
Оператор цикла задает повторение выполнения некоторой последовательности операторов по заданной итерационной схеме или до выполнения оператора выхода. Оператор блока включает в себя последовательность операторов, которым предшествуют описания локальных понятии, используемых в этих операторах. Некоторые операторы применимы только к задачам. Оператор задержки приостанавлива. ет выполнение задачи на указанныи интервал времени. Оператор вызова входа записывается как оператор вызова процедуры; он показывает, что выполнившая этот вызов задача готова дпя рандеву с другои задачей, имеющей указанный вход.
Вызываемая задача готова принять вызов входа, когда ее выполнение достигает соответствующего оператора принятия, который определяет выполняемые далее действия. После завершения рандеву обе задачи, как вызывающая, так и имеющая вход, продолжают свое параллельное выполнение. Одна из форм оператора отбора допускает отбор с ожиданием для одного из нескольких альтернативных рандеву. Другие формы оператора отбора допускают условные или временные вызовы входа. Выполнение программного модуля может привести к ошибочным ситуациям, вследствие чего продолжение нормального выполнения программы невозможно; например, когда результат арифметического вычисления превышает максимально допустимое числовое значение или когда делается попытка доступа к компоненте массива с неправильным значением индекса.
Дпя работы с такими ошибочными ситуациями текстуально за операторами программного мо. дуля могут следовать обработчики исключений, определяющие предпринимаемые при возник. новении ошибочных ситуаций действия. Исключения могут быть возбуждены и явно оператором возбуждения. Типы данных Каждый объект языка имеет тип, характеризующий множество значении и множество применимых к ним операций. Основные классы типов — это скалярные типы (включающие перечислимые и числовые типы), составные, ссылочные и личные типы.
Перечиспимыи тип определяет упорядоченное множество различных литералов перечнспения, например список состоянии нпи перечень символов. Перечиспимые типы ВООЕЕАН и СНАЯАСТЕВ предопределены. Числовые типы обеспечивают средства выполнения точных или приближенных числовых вычислений. Для точных вычислений используются целые типы, которые обозначают множе- Вве ение ства последовательных целых чисел. В приближенных вычислениях используются либо фиксированные типы (типы чисел с фиксированной точкой), представимые с абсолютной погрешностью, либо плавающие типы (типы чисел с плавающей точкой), представимые с относительной погрешностью.
Числовые типы )НТЕОЕЯ, ГБОАТ и О()ЯАТЮН предопределены. Составные типы допускают определения структурных объектов из сгруппированных компонент. Составные типы в языке представлены массивами и записями. Массив — это объект с индексируемыми компонентами одного и того же типа. Запись — это объект с именованными компонентами, возможно, различных типов. Индексируемыи тип ВТЯ)НВ предопределен. Запись может иметь специальные компоненты, называемые дискриминантами. В записях можно определить альтернативные структуры, зависящие от значений дискриминантов. Ссылочные типы позволяют вычислением генератора создавать связанные ссылками структуры данных. Они позволяют нескольким переменным ссылочного типа указывать на один и тот же объект, а компонентам одного объекта указывать на тот же самый ипи другие объекты. Элементы такой связаннои ссылками структуры данных и их связи с другими эле.
ментами могут быть изменены во время выполнения программы. Личные типы могут быть определены в пакете, скрывающем внутреннюю структуру, несущественную вне пакета. Пользователю таких типов видны логически существенные их свойства (включая дискриминанты). Концепция типа уточняется концепцией подтипа, благодаря чему пользователь может ограничить множество допустимых значении данного типа. Подтипы могут быть использованы для определения поддиапазонов скалярных типов, массивов с ограниченным множеством значений индексов, а также именованных и личных типов с конкретными значениями дискриминантов.
ДРугие свойства языка Для определения отображения типов на архитектуру объектной машины можно использовать спецификаторы представления. Например, пользователь может задать число битов для представления объектов данного типа или размещение в памяти машины компонент записи. Другие свойства языка допускают управляемое использование особенностей, связанных с низ. ким уровнем, непереносимостью или зависимостью от реализиции, включая прямое использо. ванне машинного кода.