Ada — это структурированный , статически типизированный , императивный и объектно-ориентированный язык программирования высокого уровня , вдохновленный Pascal и другими языками. Он имеет встроенную языковую поддержку для проектирования по контракту (DbC), чрезвычайно строгую типизацию , явный параллелизм, задачи, синхронную передачу сообщений, защищенные объекты и недетерминизм . Ada повышает безопасность кода и удобство обслуживания, используя компилятор для поиска ошибок в пользу ошибок времени выполнения . Ada — это международный технический стандарт , совместно определенный Международной организацией по стандартизации (ISO) и Международной электротехнической комиссией (IEC). По состоянию на май 2023 года [обновлять]стандарт, неофициально называемый Ada 2022, является ISO/IEC 8652:2023. [11]
Первоначально Ada была разработана командой под руководством французского учёного-компьютерщика Жана Ичбиа из Honeywell по контракту с Министерством обороны США (DoD) с 1977 по 1983 год для замены более 450 языков программирования, используемых в то время Министерством обороны. [12] Ada была названа в честь Ады Лавлейс (1815–1852), которая была признана первым программистом. [13]
Ada изначально была разработана для встроенных систем и систем реального времени . Версия Ada 95, разработанная С. Такером Тафтом из Intermetrics между 1992 и 1995 годами, улучшила поддержку системного, численного, финансового и объектно-ориентированного программирования (ООП).
Возможности Ada включают: строгую типизацию , модульные механизмы программирования (пакеты), проверку во время выполнения , параллельную обработку ( задачи , синхронная передача сообщений , защищенные объекты и недетерминированные операторы выбора ), обработку исключений и обобщения . В Ada 95 добавлена поддержка объектно-ориентированного программирования , включая динамическую диспетчеризацию .
Синтаксис Ada сводит к минимуму выбор способов выполнения основных операций и предпочитает английские ключевые слова (такие как "or else" и "and then") символам (таким как "||" и "&&"). Ada использует основные арифметические операторы "+", "-", "*" и "/", но избегает использования других символов. Блоки кода разграничиваются такими словами, как "declare", "begin" и "end", где за "end" (в большинстве случаев) следует идентификатор блока, который он закрывает (например, if ... end if , loop ... end loop ). В случае условных блоков это позволяет избежать висячего else , который может спариваться с неправильным вложенным выражением if в других языках, таких как C или Java.
Ada предназначена для разработки очень больших программных систем. Пакеты Ada могут быть скомпилированы отдельно. Спецификации пакетов Ada (интерфейс пакета) также могут быть скомпилированы отдельно без реализации для проверки согласованности. Это позволяет обнаруживать проблемы на ранней стадии проектирования, до начала реализации.
Поддерживается большое количество проверок во время компиляции , чтобы помочь избежать ошибок, которые не были бы обнаружены до времени выполнения в некоторых других языках или потребовали бы явных проверок, которые были бы добавлены в исходный код. Например, синтаксис требует явно именованного закрытия блоков, чтобы предотвратить ошибки из-за несовпадающих конечных токенов. Соблюдение строгой типизации позволяет обнаруживать многие распространенные ошибки программного обеспечения (неправильные параметры, нарушения диапазона, недействительные ссылки, несовпадающие типы и т. д.) либо во время компиляции, либо иным образом во время выполнения. Поскольку параллелизм является частью спецификации языка, компилятор может в некоторых случаях обнаруживать потенциальные взаимоблокировки. [14] Компиляторы также обычно проверяют неправильно написанные идентификаторы , видимость пакетов, избыточные объявления и т. д. и могут предоставлять предупреждения и полезные предложения о том, как исправить ошибку.
Ada также поддерживает проверки во время выполнения для защиты от доступа к нераспределенной памяти, ошибок переполнения буфера , нарушений диапазона, ошибок за пределами на единицу , ошибок доступа к массиву и других обнаруживаемых ошибок. Эти проверки могут быть отключены в интересах эффективности выполнения, но часто могут быть эффективно скомпилированы. Он также включает средства для помощи в проверке программ . По этим причинам Ada иногда используется в критических системах, где любая аномалия может привести к очень серьезным последствиям, например, случайной смерти, травме или серьезным финансовым потерям. Примерами систем, где используется Ada, являются авионика , управление воздушным движением , железные дороги , банковское дело, военные и космические технологии . [15] [16]
Управление динамической памятью в Ada является высокоуровневым и типобезопасным. В Ada нет универсальных или нетипизированных указателей ; также в ней неявно не объявляется какой-либо тип указателя. Вместо этого все динамическое выделение и освобождение памяти должно происходить через явно объявленные типы доступа . Каждый тип доступа имеет связанный пул хранения , который обрабатывает низкоуровневые детали управления памятью; программист может либо использовать пул хранения по умолчанию, либо определить новые (это особенно актуально для доступа к неоднородной памяти ). Можно даже объявить несколько различных типов доступа, которые все обозначают один и тот же тип, но используют разные пулы хранения. Кроме того, язык обеспечивает проверки доступности как во время компиляции, так и во время выполнения, что гарантирует, что значение доступа не может пережить тип объекта, на который оно указывает. [17]
Хотя семантика языка допускает автоматическую сборку мусора недоступных объектов, большинство реализаций не поддерживают ее по умолчанию, так как это приведет к непредсказуемому поведению в системах реального времени. Ada поддерживает ограниченную форму управления памятью на основе регионов ; также творческое использование пулов хранения может обеспечить ограниченную форму автоматической сборки мусора, поскольку уничтожение пула хранения также уничтожает все объекты в пуле.
Двойное тире ("--"), напоминающее длинное тире , обозначает текст комментария. Комментарии останавливаются в конце строки; намеренно не предусмотрено возможности сделать комментарий охватывающим несколько строк, чтобы предотвратить случайное аннулирование целых разделов исходного кода незакрытыми комментариями. Таким образом, отключение целого блока кода требует добавления префикса "--" к каждой строке (или столбцу) по отдельности. Хотя это явно обозначает отключенный код, создавая столбец повторяющихся "--" вниз по странице, это также делает экспериментальное отключение/повторное включение больших блоков более затянутым процессом в редакторах без поддержки блочного комментирования.
Точка с запятой (";") является терминатором оператора , а нулевой или недействующий оператор — null;
. Одиночный ;
без завершающего оператора не допускается.
В отличие от большинства стандартов ISO , определение языка Ada (известное как Ada Reference Manual или ARM , или иногда Language Reference Manual или LRM ) является свободным контентом . Таким образом, это общий справочник для программистов Ada, а не только для программистов, реализующих компиляторы Ada. Помимо справочного руководства, существует также обширный документ с обоснованием, который объясняет структуру языка и использование различных языковых конструкций. Этот документ также широко используется программистами. Когда язык был пересмотрен, был написан новый документ с обоснованием.
Одним из примечательных бесплатных программных инструментов, используемых многими программистами на языке Ada для написания исходного кода на языке Ada, является GNAT Programming Studio, а также GNAT , входящий в коллекцию компиляторов GNU .
В 1970-х годах Министерство обороны США (DoD) стало обеспокоено количеством различных языков программирования, используемых для его проектов встроенных компьютерных систем, многие из которых были устаревшими или зависели от оборудования, и ни один из них не поддерживал безопасное модульное программирование. В 1975 году была сформирована рабочая группа High Order Language Working Group ( HOLWG) с намерением сократить это число путем поиска или создания языка программирования, в целом подходящего для требований министерства и Министерства обороны Великобритании . После многих итераций, начавшихся с первоначального предложения-соломенного человека [18], окончательный язык программирования был назван Ada. Общее количество языков программирования высокого уровня, используемых для таких проектов, сократилось с более чем 450 в 1983 году до 37 к 1996 году.
HOLWG разработала требования к языку Steelman — серию документов, в которых излагались требования, которым, по их мнению, должен был удовлетворять язык программирования. Было официально рассмотрено множество существующих языков, но в 1977 году команда пришла к выводу, что ни один из существующих языков не соответствует спецификациям.
Были опубликованы запросы на предложения по новому языку программирования, и были наняты четыре подрядчика для разработки своих предложений под названиями Red ( Intermetrics под руководством Бенджамина Бросгола), Green ( Honeywell под руководством Джина Ичбиа ), Blue ( SofTech под руководством Джона Гуденафа) [19] и Yellow ( SRI International под руководством Джея Спитцена). В апреле 1978 года после общественного обсуждения предложения Red и Green перешли на следующую стадию. В мае 1979 года предложение Green, разработанное Джин Ичбиа из Honeywell, было выбрано и получило название Ada — в честь Августы Ады Кинг, графини Лавлейс, обычно известной как Ада Лавлейс . Это предложение было создано под влиянием языка LIS, который Ичбиа и его группа разработали в 1970-х годах. Предварительное справочное руководство по Ada было опубликовано в ACM SIGPLAN Notices в июне 1979 года. Справочное руководство по Military Standard было одобрено 10 декабря 1980 года (в день рождения Ады Лавлейс) и получило номер MIL-STD-1815 в честь года рождения Ады Лавлейс. В 1981 году Тони Хоар воспользовался своей речью на вручении премии Тьюринга, чтобы раскритиковать Ada за чрезмерную сложность и, следовательно, ненадежность, [20] но впоследствии, похоже, отказался от своих слов в предисловии, которое он написал для учебника по Ada. [21]
Ada привлекла большое внимание всего сообщества программистов в первые дни своего существования. Его сторонники и другие предсказывали, что он может стать доминирующим языком для программирования общего назначения, а не только для работы, связанной с обороной. [22] Ичбиа публично заявил, что в течение десяти лет останется только два языка программирования: Ada и Lisp . [23] Ранние компиляторы Ada изо всех сил пытались реализовать большой, сложный язык, и производительность как во время компиляции, так и во время выполнения, как правило, была медленной, а инструменты примитивными. [22] Поставщики компиляторов потратили большую часть своих усилий на прохождение массивного, требуемого правительством набора проверок Ada Compiler Validation Capability (ACVC) для тестирования соответствия языка, который требовался в другой новой функции языка Ada. [23]
Первой проверенной реализацией Ada был транслятор NYU Ada/Ed, [24] сертифицированный 11 апреля 1983 года. NYU Ada/Ed реализован на языке наборов высокого уровня SETL . [25] Несколько коммерческих компаний начали предлагать компиляторы Ada и связанные с ними инструменты разработки, включая Alsys , TeleSoft , DDC-I , Advanced Computer Techniques , Tartan Laboratories , Irvine Compiler, TLD Systems и Verdix . [26] Производители компьютеров, имевшие значительный бизнес в оборонной, аэрокосмической или смежных отраслях, также предлагали компиляторы Ada и инструменты на своих платформах; к ним относились Concurrent Computer Corporation , Cray Research, Inc. , Digital Equipment Corporation , Harris Computer Systems и Siemens Nixdorf Informationssysteme AG . [26]
В 1991 году Министерство обороны США начало требовать использования Ada ( мандат Ada ) для всего программного обеспечения, [27] хотя исключения из этого правила часто допускались. [22] Мандат Ada Министерства обороны был фактически отменен в 1997 году, когда Министерство обороны начало внедрять готовые коммерческие технологии (COTS). [22] Аналогичные требования существовали и в других странах НАТО : Ada требовался для систем НАТО, включающих командование и управление , а также другие функции, и Ada был обязательным или предпочтительным языком для оборонных приложений в таких странах, как Швеция, Германия и Канада. [28]
К концу 1980-х и началу 1990-х годов производительность компиляторов Ada улучшилась, но все еще оставались препятствия для полного использования возможностей Ada, включая модель задач, которая отличалась от той, к которой привыкло большинство программистов реального времени. [23]
Из-за критически важных для безопасности функций поддержки Ada , теперь он используется не только для военных приложений, но и в коммерческих проектах, где ошибка в программном обеспечении может иметь серьезные последствия, например, авионика и управление воздушным движением , коммерческие ракеты, такие как Ariane 4 и 5 , спутники и другие космические системы, железнодорожный транспорт и банковское дело. [16] Например, основная система управления полетом, программное обеспечение системы управления по проводам в Boeing 777 , была написана на Ada, как и системы управления по проводам для аэродинамически нестабильных Eurofighter Typhoon , [29] Saab Gripen , [30] Lockheed Martin F-22 Raptor и заменяющая система управления полетом DFCS для Grumman F-14 Tomcat . Канадская автоматизированная система управления воздушным движением была написана на 1 миллионе строк Ada ( количество SLOC ). Она отличалась расширенной распределенной обработкой , распределенной базой данных Ada и объектно-ориентированным дизайном. Ada также используется в других системах воздушного движения, например, система управления воздушным движением следующего поколения Interim Future Area Control Tools Support (iFACTS) в Великобритании разработана и реализована с использованием SPARK Ada. [31] Она также используется во французской системе сигнализации TVM в кабине на высокоскоростной железнодорожной системе TGV и в пригородных поездах метро в Париже, Лондоне, Гонконге и Нью-Йорке. [16] [32]
Предварительный вариант Ada можно найти в ACM Sigplan Notices Vol 14, No 6, June 1979 [33]
Ada был впервые опубликован в 1980 году как стандарт ANSI ANSI/ MIL-STD 1815. Поскольку эта самая первая версия содержала много ошибок и несоответствий, [a] пересмотренное издание было опубликовано в 1983 году как ANSI/MIL-STD 1815A. Без каких-либо дальнейших изменений он стал стандартом ISO в 1987 году. [35] Эта версия языка обычно известна как Ada 83 , с даты ее принятия ANSI, но иногда ее также называют Ada 87 , с даты ее принятия ISO. [36] Существует также французский перевод; DIN перевел его на немецкий язык как DIN 66268 в 1988 году.
Ada 95 , совместный стандарт ISO/IEC/ANSI ISO/IEC 8652:1995 [37] [38] был опубликован в феврале 1995 года, что сделало его первым стандартом ISO объектно-ориентированного языка программирования. Чтобы помочь с пересмотром стандарта и будущим принятием, ВВС США профинансировали разработку компилятора GNAT . В настоящее время компилятор GNAT является частью коллекции компиляторов GNU .
Продолжалась работа по улучшению и обновлению технического содержания языка Ada. Техническое исправление к Ada 95 было опубликовано в октябре 2001 года, [39] [40] а основная поправка, ISO/IEC 8652:1995/Amd 1:2007 [41] [42], была опубликована 9 марта 2007 года, обычно известная как Ada 2005, поскольку работа над новым стандартом была завершена в том году.
На конференции Ada-Europe 2012 в Стокгольме Ассоциация ресурсов Ada (ARA) и Ada-Europe объявили о завершении разработки последней версии языка Ada и представлении справочного руководства в ISO/IEC JTC 1/SC 22 /WG 9 Международной организации по стандартизации (ISO) и Международной электротехнической комиссии (IEC) для утверждения. ISO/IEC 8652:2012 [43] (см. Ada 2012 RM) был опубликован в декабре 2012 года, известный как Ada 2012. Техническое исправление, ISO/IEC 8652:2012/COR 1:2016, было опубликовано [44] (см. RM 2012 с TC 1).
2 мая 2023 года сообщество Ada получило официальное одобрение публикации стандарта языка программирования Ada 2022. [11]
Несмотря на названия Ada 83, 95 и т. д., юридически существует только один стандарт Ada, один из последних стандартов ISO/IEC: с принятием новой версии стандарта предыдущая становится отозванной. Остальные названия являются просто неформальными, ссылающимися на определенную редакцию.
Другие связанные стандарты включают ISO/IEC 8651 -3:1988 Системы обработки информации — Компьютерная графика — Языковые привязки графического ядра системы (GKS) — Часть 3: Ada .
Ada — это язык программирования, подобный ALGOL, в котором используются управляющие структуры с зарезервированными словами, такими как if , then , else , while , for и т. д. Однако в Ada также есть много возможностей структурирования данных и других абстракций, которые не были включены в исходный ALGOL 60 , например, определения типов , записи , указатели , перечисления . Такие конструкции были частично унаследованы или вдохновлены Pascal .
Типичным примером синтаксиса языка является программа Hello world : (hello.adb)
с Ada.Text_IO ;процедура Привет этоначинать Ada.Text_IO.Put_Line ( " Привет , мир! " ) ; конец Привет ;
Эту программу можно скомпилировать с помощью свободно распространяемого компилятора с открытым исходным кодом GNAT , выполнив команду
gnatmake привет.adb
Система типов Ada не основана на наборе предопределенных примитивных типов , но позволяет пользователям объявлять свои собственные типы. Это объявление, в свою очередь, основано не на внутреннем представлении типа, а на описании цели, которая должна быть достигнута. Это позволяет компилятору определить подходящий размер памяти для типа и проверить наличие нарушений определения типа во время компиляции и выполнения (т. е. нарушения диапазона, переполнения буфера, согласованности типов и т. д.). Ada поддерживает числовые типы, определяемые диапазоном, типы по модулю, агрегатные типы (записи и массивы) и типы перечисления. Типы доступа определяют ссылку на экземпляр указанного типа; нетипизированные указатели не допускаются. Специальные типы, предоставляемые языком, — это типы задач и защищенные типы.
Например, дата может быть представлена как:
тип Day_type находится в диапазоне 1 .. 31 ;тип Month_type находится в диапазоне 1 .. 12 ;тип Year_type находится в диапазоне 1800 .. 2100 ;тип Hours — mod 24 ;Тип дня недели ( понедельник , вторник , среда , четверг , пятница , суббота , воскресенье ) ;Тип Дата записывать День : Тип_дня ; Месяц : Тип_месяца ; Год : Тип_года ; конец записи ;
Важно отметить: Day_type, Month_type, Year_type, Hours — несовместимые типы, что означает, что, например, следующее выражение является недопустимым:
Сегодня : Day_type := 4 ;Текущий_месяц : Тип_месяца := 10 ;... Сегодня + Текущий_Месяц ... -- незаконно
Предопределенный оператор «плюс» может складывать только значения одного типа, поэтому выражение недопустимо.
Типы можно уточнить, объявив подтипы :
подтип Working_Hours — диапазон часов 0 .. 12 ; — максимум 12 часов работы в день подтип Working_Day — диапазон рабочих дней : понедельник .. пятница ; — рабочие дни Work_Load : константный массив ( Working_Day ) из Working_Hours — неявное объявление типа := ( Пятница => 6 , Понедельник => 4 , остальные => 10 ); -- таблица поиска рабочих часов с инициализацией
Типы могут иметь модификаторы, такие как ограниченный, абстрактный, закрытый и т. д. Закрытые типы не показывают свою внутреннюю структуру; объекты ограниченных типов не могут быть скопированы. [45] Ada 95 добавляет дополнительные возможности для объектно-ориентированного расширения типов.
Ada — это структурированный язык программирования , что означает, что поток управления структурирован в стандартные операторы. Поддерживаются все стандартные конструкции и ранний выход глубокого уровня, поэтому использование также поддерживаемых команд « go to » требуется редко.
-- пока a не равно b, цикл.в то время как a /= b цикл Ada.Text_IO.Put_Line ( " Ожидание " ) ; конец цикла ;если а > б, то Ada.Text_IO.Put_Line ( " Условие выполнено " ) ; еще Ada.Text_IO.Put_Line ( " Условие не выполнено " ) ; конец, если ;для i в 1 .. 10 петле Ada.Text_IO.Put ( " Итерация : " ) ; Ada.Text_IO.Put ( i ) ; Ада.Текст_IO.Пут_Линия ;конец цикла ;петля а := а + 1 ; выход, когда a = 10 ;конец цикла ;случай i когда 0 = > Ada.Text_IO.Put ( " ноль " ) ; когда 1 = > Ada.Text_IO.Put ( " один " ) ; когда 2 = > Ada.Text_IO.Put ( " два " ) ; -- утверждения о случаях должны охватывать все возможные случаи: когда другие => Ada.Text_IO.Put ( " ничего из вышеперечисленного" ) ; конечный случай ;for aWeekday in Weekday ' Range loop -- цикл по перечислению Put_Line ( Weekday ' Image ( aWeekday ) ); -- выходное строковое представление перечисления если aWeekday in Working_Day then -- проверка подтипа перечисления Put_Line ( " работать на " & Working_Hours ' Image ( Work_Load ( aWeekday ) ); -- доступ к таблице поиска конец, если ;конец цикла ;
Частью программы на языке Ada являются пакеты, процедуры и функции.
Функции отличаются от процедур тем, что они должны возвращать значение. Вызовы функций не могут использоваться «как оператор», а их результат должен быть назначен переменной. Однако, начиная с Ada 2012, функции не обязаны быть чистыми и могут изменять свои соответствующим образом объявленные параметры или глобальное состояние. [46]
Пример: спецификация пакета (example.ads)
Пример пакета : Тип Число находится в диапазоне 1 .. 11 ; процедура Print_and_Increment ( j : in out Number );конец Примера ;
Тело пакета (example.adb)
с Ada.Text_IO ; Пример тела пакета : i : Число := Число ' Первое ; процедура Print_and_Increment ( j : in out Number ) — это функция Next ( k : in Number ) возвращает Number начинать вернуть k + 1 ; конец Далее ; начинать Ada.Text_IO.Put_Line ( " Итого : " & Number ' Image ( j ) ) ; j := Следующий ( j ); конец Print_and_Increment ;-- инициализация пакета выполняется при разработке пакетаначинать пока i < Номер ' Последний цикл Печать_и_увеличение ( i ); конец цикла ;конец Примера ;
Эту программу можно скомпилировать, например, с помощью свободно распространяемого компилятора с открытым исходным кодом GNAT , выполнив
gnatmake -z пример.adb
Пакеты, процедуры и функции могут быть вложенными на любую глубину, и каждый из них может быть логически самым внешним блоком.
Каждый пакет, процедура или функция могут иметь собственные объявления констант, типов, переменных и других процедур, функций и пакетов, которые могут быть объявлены в любом порядке.
Прагма — это директива компилятора , которая передает информацию компилятору, чтобы разрешить определенные манипуляции с скомпилированным выводом. [47] Некоторые прагмы встроены в язык, [48] в то время как другие зависят от реализации.
Примерами общего использования прагм компилятора могут быть отключение определенных функций, таких как проверка типов во время выполнения или проверка границ индекса массива, или указание компилятору вставлять объектный код вместо вызова функции (как это делается в C/C++ со встроенными функциями ).
Ada имеет обобщения с момента своего первого проектирования в 1977–1980 годах. Стандартная библиотека использует обобщения для предоставления множества услуг. Ada 2005 добавляет в стандартную библиотеку комплексную библиотеку обобщенных контейнеров, которая была вдохновлена стандартной библиотекой шаблонов C++ .
Универсальный модуль — это пакет или подпрограмма, которая принимает один или несколько универсальных формальных параметров . [49]
Универсальный формальный параметр — это значение, переменная, константа, тип, подпрограмма или даже экземпляр другой, обозначенной, универсальной единицы. Для универсальных формальных типов синтаксис различает дискретные, с плавающей точкой, с фиксированной точкой, типы доступа (указатели) и т. д. Некоторые формальные параметры могут иметь значения по умолчанию.
Чтобы создать экземпляр универсального модуля, программист передает фактические параметры для каждого формального. Затем универсальный экземпляр ведет себя так же, как и любой другой модуль. Возможно создавать экземпляры универсальных модулей во время выполнения , например, внутри цикла.{{cite journal}}
: CS1 maint: DOI неактивен по состоянию на ноябрь 2024 г. ( ссылка )Эти документы были опубликованы в различных формах, в том числе в печатном виде.