А́да (Ada) — язык программирования, созданный в 1979—1980 годах в ходе проекта Министерства обороны США с целью разработать единый язык программирования для встроенных систем (то есть систем управления автоматизированными комплексами, функционирующими в реальном времени). Имелись в виду прежде всего бортовые системы управления военными объектами (кораблями, самолётами, танками, ракетами, снарядами и т. п.). Перед разработчиками не стояло задачи создать универсальный язык, поэтому решения, принятые авторами Ады, нужно воспринимать в контексте особенностей выбранной предметной области. Язык назван в честь Ады Лавлейс.
Особенности В исходном варианте, стандартизованном в 1983 году, Ада — это структурный, модульный язык программирования, содержащий высокоуровневые средства программирования параллельных процессов. Синтаксис Ады унаследован от языков типа Algol или Паскаль, но расширен, а также сделан более строгим и логичным. Ада — язык со строгой типизацией, в нём исключена работа с объектами, не имеющими типов, а автоматические преобразования типов сведены к абсолютному минимуму: допускается неявное приведение значения общего целого или вещественного числового типа к совместимому числовому типу. В стандарте 1995 года в язык были добавлены базовые средства объектно-ориентированного программирования, в стандарте 2007 эти средства были дополнены, поэтому современный Ада — объектно-ориентированный язык программирования.
Синтаксис Язык регистро-независим. Синтаксис — алголоподобный, в духе языков конца 1970-х годов: все управляющие конструкции, начинающиеся на ключевое слово, заканчиваются ключевым словом и позволяют размещать внутри любое число операторов, что устраняет часто критикуемый недостаток, свойственный Алголу-60 и Паскалю: необходимость частого использования «операторных скобок» begin-end. Детали синтаксиса разработаны так, чтобы снизить вероятность случайных ошибок. Например, в идентификаторах запрещено использовать несколько знаков подчёркивания подряд. Завершающие ключевые слова для разных управляющих конструкций различны: условный оператор if заканчивается комбинацией end if, циклы — комбинацией end loop, оператор множественного выбора — end case и т. д. На уровне синтаксиса языка поддерживается структурная обработка исключений.
Язык имеет развитую систему типов как встроенных, так и порождаемых программистом. Есть множество способов создания новых типов, язык поддерживает два разных понятия: «подтип» и «производный тип». Переменные типа и подтипа совместимы, переменные типа и его производного типа — нет.
В процедурах и функциях поддерживаются входные и выходные параметры, передача параметров по имени, параметры со значениями по умолчанию. Поддерживается переопределение процедур, функций и операторов — создание нескольких вариантов процедуры, функции или оператора с одним и тем же именем, но различными сигнатурами (типами и количеством параметров).
Программы — модульные, механизм контроля импорта-экспорта описаний между модулями включает две разные директивы: одну для подключения другого модуля (with), другую — для импорта его описаний (use). Также существует возможность переименовать модуль при импорте (rename) — этот вариант позволяет использовать для обозначения пакета более удобные программисту идентификаторы. Пакеты (один из типов модулей) могут содержать заголовок и приватную часть — то, что содержится в ней, не экспортируется и другим модулям недоступно. Поддерживается механизм обобщённых (generic) модулей: пакетов, процедур и функций, позволяющих описывать алгоритмы обработки данных без указания конкретного типа.
В язык встроены конструкции поддержки параллельного программирования: поддерживаются понятия «задача» (параллельно выполняемый фрагмент программы), «вход задачи» (средство синхронизации и коммуникации параллельно выполняющихся задач), поддерживается механизм «рандеву» (протокол взаимодействия параллельно выполняемых задач через вход одной из них), имеется оператор выбора SELECT для организации условного межпотокового взаимодействия (выбора параллельной задачи, с которой следует взаимодействовать, в зависимости от готовности к рандеву и некоторых других условий). В принципе, имеющихся в языке средств параллельного программирования достаточно для решения большого класса задач, требующих параллельной обработки, без обращения к внешним средствам, таким как дополнительные библиотеки или API операционной системы.
Для удовлетворения требованиям надёжности язык построен таким образом, чтобы как можно большее количество ошибок обнаруживалось на этапе компиляции. Кроме того, одним из требований при разработке языка была максимально лёгкая читаемость текстов программ, даже в ущерб лёгкости написания. Результатом такого подхода стал несколько «тяжеловесный» синтаксис и множество ограничений, отсутствующих в наиболее распространённых языках общего назначения (таких как Си и C++), например, та же строгая типизация. Это привело к формированию представления об Аде как о сложном, малопонятном и неудобном в использовании языке.
Примеры программ
Пример программы «Hello, world!»:
with Ada.Text_IO;
procedure Hello is use Ada.Text_IO; begin Put_Line("Hello, world!"); end Hello;
Здесь для применения функции Put_Line содержащий её пакет Ada.Text_IO импортируется с помощью конструкции use, что даёт возможность вызывать функцию по имени без квалификации — указания в вызове имени пакета, содержащего функцию.
Объявление нового типа данных Degrees, объявление переменной Temperature, операторы управления:
with Ada.Text_IO; use Ada.Text_IO; ... type Degrees is new Float range -273.15 .. Float'Last; ... Temperature : Degrees; ... if Temperature >= 40.0 then Put_Line("Wow!"); Put_Line("It's extremely hot"); elsif Temperature >= 30.0 then Put_Line("It's hot"); elsif Temperature >= 20.0 then Put_Line("It's warm"); elsif Temperature >= 10.0 then Put_Line("It's cool"); elsif Temperature >= 0.0 then Put_Line("It's cold"); else Put_Line("It's freezing"); end if;
Объявление пользовательских исключений и обработка исключений:
with Ada.Exceptions; use Ada.Exceptions; ... High_Pressure, High_Temperature : exception; ... exception when Error: High_Pressure | High_Temperature => Put("Exception: "); Put_Line(Exception_Name (Error)); Put(Exception_Message (Error)); when Error: others => Put("Unexpected exception: "); Put_Line(Exception_Information(Error)); end;
Объявление модуля с объявленными процедурами и пользовательскими исключениями:
package Directory_Enquiries is
procedure Insert (New_Name : in Name; New_Number : in Number);
procedure Lookup (Given_Name : in Name; Corr_Number : out Number);
Name_Duplicated : exception; Name_Absent : exception; Directory_Full : exception;
end Directory_Enquiries;
Объектно-ориентированное программирование:
package Person is type Object is tagged private; procedure Put (O : Object); private type Object is tagged record Name : String (1 .. 10); Gender : Gender_Type; end record; end Person;
История Разработка языка была проведена в рамках международного конкурса, организованного и профинансированного министерством обороны США. Целью разработки было получение языка программирования, который мог бы стать единым для разработки проектов по заказам военного ведомства, главным образом, для разработки встроенных систем военного назначения и для больших военных компьютеров (на базе процессора iAPX 432 от Intel). Работа началась в 1975 году с формирования набора требований к языку, который бы в полной мере удовлетворил разработчиков систем указанного типа. Первоначальный список требований, выпущенный под кодовым наименованием «Strawman» («Соломенный»), был представлен на рецензию в ряд организаций и фирм, в течение двух лет последовательно уточнялся, пройдя через «Woodenman» («Деревянный»), «Tinman» («Оловянный»), «Ironman» («Железный») и в конечном счёте превратившись в итоговый документ под названием «Steelman» («Стальной»). «Steelman» был выпущен в июне 1978 года [DoD 1978].
Ещё до окончательного завершения формирования требований анализ показал, что ни один из имеющихся языков программирования не удовлетворяет требованиям в достаточной мере, так что было принято решение разработать новый язык. Конкурс на его создание был объявлен в 1977 году, разработчикам было предложено базироваться на одном из трёх языков: Паскаль, Алгол-68 или ПЛ/1. Из представленных на конкурс 15 проектов было отобрано 4 (все основаны на Паскале). Эти проекты были отправлены на дальнейшую доработку. На следующем этапе из 4 проектов отобрали два, из которых, после очередной доработки, был выбран один. Этот язык получил наименование «Ада» — разработавшая его группа под руководством француза Жана Ишбиа дала языку название в честь Августы Ады Кинг Лавлейс (1815—1852), дочери поэта Джорджа Байрона, которая занималась разработкой программ для вычислительной машины Бэббиджа и считается первым программистом в мире.
В 1983 году язык был официально стандартизован ANSI. Стандарт языка ANSI/MIL-STD-1815-A-1983 был утверждён 17 февраля 1983 года. Министерство обороны США сделало наименование «Ada» зарегистрированной торговой маркой, запретив выпускать трансляторы языка, не прошедшие официальную процедуру тестирования на соответствие стандартам. Процедура состояла в прогоне через тестируемый компилятор большого количества (более 1000) тестовых программ (так называемый комплект ACVC), для каждой из которых был однозначно определён результат тестирования: либо удачная компиляция, либо выдача вполне конкретного сообщения об ошибке. Тестирование проводилось по принципу «всё или ничего» — при ошибке в обработке хотя бы одного тестового примера компилятор считался не прошедшим тест, причём тестирование было действительно только на той аппаратной и программной платформе, на которой оно проводилось. Таким образом была в зародыше подавлена возможность образования диалектов языка Ада.
В 1987 году язык Ада был официально стандартизован ISO. С этого момента Министерство обороны США перевело язык в общественное достояние.
К 1990 году в мире существовало уже около 200 компиляторов, соответствовавших стандарту языка Ада.
В 1995 году был принят новый стандарт Ады, известный как Ada95. В язык были введены средства объектного программирования. Кроме того, язык был дополнен более развитыми средствами для взаимодействия с программами, написанными на других языках.
В марте 2007 года опубликованы изменения в стандарте Ады. Они коснулись, в основном, возможностей объектно-ориентированного программирования: введены интерфейсы, принят обычный для большинства гибридных языков синтаксис вызова метода, внесён ещё ряд дополнений.
В 2012 году ISO принят и опубликован новый стандарт языка.
Ада в СССР и России
В 1980-х годах была организована рабочая группа по языку Ада при Госкомитете СССР по науке и технике. Группа занималась изучением всех открытых (а также, по слухам, добытых разведкой закрытых) данных по языку Ада и исследовала возможность и целесообразность развития и использования Ады в СССР. Деятельность этой группы привела к концу 1980-х годов к разработке компиляторов Ады для практически всех применявшихся в СССР компьютеров. Было выпущено несколько книг по языку Ада на русском языке.
В МГУ проводилась работа по созданию собственных пакетов тестирования ада-трансляторов на соответствие стандартам. В ЛГУ для создания ада-системы была использована ранее разрабатывавшаяся для реализации Алгола-68 система «Паллада», которую перевели на Аду. Система содержит интегрированную среду разработки, компилятор, текстовый редактор, отладчик, библиотеки, систему контроля версий и командный интерпретатор.