Введение
Язык программирования высокого уровня Ada, впервые выпущенный в 1980 году, — это структурированный, статически типизированный, императивный и объектно-ориентированный язык программирования высокого уровня, вдохновлённый Паскалем и другими языками. Он обладает встроенной поддержкой проектирования по контракту (DbC), чрезвычайно строгой типизацией, явной поддержкой параллелизма, задачами, синхронной передачей сообщений, защищёнными объектами и недетерминированностью. Ada повышает безопасность и поддерживаемость кода, используя компилятор для выявления ошибок на этапе компиляции, а не во время выполнения. Ada является международным техническим стандартом, совместно разработанным Международной организацией по стандартизации (ISO) и Международной электротехнической комиссией (IEC). По состоянию на май 2023 года стандарт, неформально называемый Ada 2022, имеет номер ISO/IEC 8652:2023. Изначально Ada была разработана командой под руководством французского учёного-компьютерщика Жана Ичбиа из Honeywell по заказу Министерства обороны США (DoD) в период с 1977 по 1983 год для замены более 450 языков программирования, использовавшихся Министерством обороны в то время. Язык был назван в честь Ады Лавлейс (1815–1852), которую считают первым программистом.
Ada is a structured, statically typed, imperative, and object oriented high level programming language, inspired by Pascal and other languages. It has built in language support for design by contract (DbC), extremely strong typing, explicit concurrency, tasks, synchronous message passing, protected objects, and non determinism. Ada improves code safety and maintainability by using the compiler to find errors in favor of runtime errors. Ada is an international technical standard, jointly defined by the International Organization for Standardization (ISO), and the International Electrotechnical Commission (IEC). as of May 2023, the standard, called Ada 2022 informally, is ISO/IEC 8652:2023. Ada was originally designed by a team led by French computer scientist Jean Ichbiah of Honeywell under contract to the United States Department of Defense (DoD) from 1977 to 1983 to supersede over 450 programming languages used by the DoD at that time. Ada was named after Ada Lovelace (1815–1852), who has been credited as the first computer programmer.
Особенности
Ada первоначально была разработана для встраиваемых и систем реального времени. Ревизия Ada 95, разработанная S. Tucker Taft из Intermetrics в период с 1992 по 1995 год, улучшила поддержку системного, численного, финансового и объектно-ориентированного программирования (ООП). Особенности Ada включают в себя: строгую типизацию, модульные механизмы программирования (пакеты), проверку во время выполнения, параллельную обработку (задачи, синхронный обмен сообщениями, защищенные объекты и недетерминированные операторы выбора), обработку исключений и обобщенные типы (generics). 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 (интерфейс пакета) также могут быть скомпилированы отдельно без реализации для проверки согласованности. Это позволяет обнаруживать проблемы на ранней стадии проектирования, до начала реализации. Поддерживается большое количество проверок времени компиляции, чтобы помочь избежать ошибок, которые не будут обнаружены до времени выполнения в некоторых других языках или потребуют явных проверок, добавляемых в исходный код. Например, синтаксис требует явного именования закрытия блоков для предотвращения ошибок из-за несоответствующих конечных маркеров. Соблюдение строгой типизации позволяет обнаруживать многие распространенные программные ошибки (неправильные параметры, нарушения диапазона, недействительные ссылки, несоответствующие типы и т.д.) либо во время компиляции, либо во время выполнения. Поскольку конкурентность является частью спецификации языка, компилятор в некоторых случаях может обнаруживать потенциальные взаимные блокировки (deadlocks). Компиляторы также обычно проверяют наличие опечаток в идентификаторах, видимость пакетов, избыточные объявления и т.д. и могут предоставлять предупреждения и полезные предложения о том, как исправить ошибку. Ada также поддерживает проверки во время выполнения для защиты от доступа к невыделенной памяти, ошибок переполнения буфера, нарушений диапазона, ошибок "off-by-one", ошибок доступа к массивам и других обнаруживаемых ошибок. Эти проверки могут быть отключены в целях повышения эффективности во время выполнения, но часто могут быть скомпилированы эффективно. Она также включает средства для помощи в верификации программ. По этим причинам Ada иногда используется в критически важных системах, где любое отклонение может привести к очень серьезным последствиям, например, к случайной смерти, травме или серьезным финансовым потерям. Примеры систем, в которых используется Ada, включают авионику, управление воздушным движением, железнодорожный транспорт, банковское дело, военные технологии и космические технологии. Динамическое управление памятью в Ada имеет высокий уровень и является типобезопасным. В Ada нет обобщенных или нетипизированных указателей; она также не объявляет какие-либо типы указателей неявно. Вместо этого все выделение и освобождение динамической памяти должно происходить через явно объявленные типы доступа (access types). Каждый тип доступа имеет связанный пул хранения, который обрабатывает детали управления памятью на низком уровне; программист может использовать пул хранения по умолчанию или определить новые (это особенно актуально для систем с неравномерным доступом к памяти - NUMA). Даже возможно объявить несколько различных типов доступа, которые все указывают на один и тот же тип, но используют разные пулы хранения. Кроме того, язык обеспечивает проверки доступности как во время компиляции, так и во время выполнения, которые гарантируют, что значение доступа не переживет тип объекта, на который оно указывает. Хотя семантика языка допускает автоматическую сборку мусора для недоступных объектов, большинство реализаций не поддерживают ее по умолчанию, поскольку это может привести к непредсказуемому поведению в системах реального времени. Ada поддерживает ограниченную форму управления памятью на основе областей (regions); также, творческое использование пулов хранения может обеспечить ограниченную форму автоматической сборки мусора, поскольку уничтожение пула хранения также уничтожает все объекты в пуле. Двойной дефис ("--") обозначает текст комментария. Комментарии заканчиваются в конце строки; намеренно нет способа сделать комментарий многострочным, чтобы предотвратить незакрытые комментарии, случайно аннулирующие целые разделы исходного кода. Отключение целого блока кода, следовательно, требует добавления префикса к каждой строке (или столбцу) отдельно символом "--". Хотя это четко обозначает отключенный код, создавая столбец повторяющихся "--" по странице, это также делает экспериментальное включение/отключение больших блоков более трудоемким процессом в редакторах, не поддерживающих блочное комментирование. Точка с запятой (";") является завершителем оператора, а оператор null или no-operation является null;. Одиночная ";" без оператора для завершения не допускается. В отличие от большинства стандартов ISO, определение языка Ada (известное как Ada Reference Manual или ARM, или иногда Language Reference Manual или LRM) является контентом с открытым доступом. Таким образом, это распространенная ссылка для программистов Ada, а не только для программистов, реализующих компиляторы Ada. Помимо справочного руководства, существует также обширный документ с обоснованием, который объясняет дизайн языка и использование различных конструкций языка. Этот документ также широко используется программистами. При пересмотре языка был написан новый документ с обоснованием. Одним из заметных инструментов с открытым исходным кодом, который используется многими программистами Ada для помощи в написании исходного кода Ada, является GNAT Programming Studio и GNAT, который является частью GNU Compiler Collection.
История
В 1970-х годах Министерство обороны США (DoD) выразило обеспокоенность по поводу количества различных языков программирования, используемых в проектах встроенных компьютерных систем, многие из которых устарели или зависели от аппаратного обеспечения, и ни один из них не поддерживал безопасное модульное программирование. В 1975 году была сформирована рабочая группа High Order Language Working Group (HOLWG) с целью сократить это число путем поиска или создания языка программирования, подходящего для нужд министерства и Министерства обороны Великобритании. После многочисленных итераций, начиная с первоначального концептуального предложения, язык программирования был назван Ada. Общее количество языков программирования высокого уровня, используемых в таких проектах, сократилось с более чем 450 в 1983 году до 37 к 1996 году. HOLWG разработала требования к языку Steelman – серию документов, определяющих необходимые характеристики языка программирования. Многие существующие языки были формально рассмотрены, но в 1977 году команда пришла к выводу, что ни один из них не соответствует спецификациям. Были выпущены запросы предложений на разработку нового языка программирования, и четыре подрядчика были наняты для разработки своих предложений под кодовыми именами Red (Intermetrics под руководством Бенджамина Бросгола), Green (Honeywell под руководством Жана Ичбиа), Blue (SofTech под руководством Джона Гуденофа) и Yellow (SRI International под руководством Джея Спитцена). В апреле 1978 года, после публичного обсуждения, предложения Red и Green перешли на следующий этап. В мае 1979 года было выбрано предложение Green, разработанное Жаном Ичбиа в Honeywell, и ему было присвоено имя Ada – в честь Августы Ады Кинг, графини Лавлейс, обычно известной как Ада Лавлейс. На это предложение повлиял язык LIS, разработанный Ичбиа и его группой в 1970-х годах. Предварительное руководство по языку Ada было опубликовано в ACM SIGPLAN Notices в июне 1979 года. Эталонное руководство по военному стандарту было утверждено 10 декабря 1980 года (в день рождения Ады Лавлейс) и получило номер MIL STD 1815 в честь года рождения Ады Лавлейс. В 1981 году Тони Хоар использовал свою речь при вручении премии Тьюринга, чтобы раскритиковать Ada за чрезмерную сложность и, следовательно, ненадежность, но впоследствии, по-видимому, отказался от этой критики во введении к учебнику по Ada. В первые годы Ada привлекло большое внимание со стороны всего программистского сообщества. Его сторонники и другие предсказывали, что он может стать доминирующим языком для программирования общего назначения, а не только для оборонных целей. Ранние компиляторы Ada испытывали трудности с реализацией большого и сложного языка, и производительность как во время компиляции, так и во время выполнения, как правило, была низкой, а инструменты – примитивными. Первой валидированной реализацией Ada стал транслятор NYU Ada/Ed, сертифицированный 11 апреля 1983 года. NYU Ada/Ed реализован на языке высокого уровня SETL. Несколько коммерческих компаний начали предлагать компиляторы Ada и связанные с ними инструменты разработки, включая Alsys, TeleSoft, DDC I, Advanced Computer Techniques, Tartan Laboratories, Irvine Compiler, TLD Systems и Verdix. Производители компьютеров, имевшие значительный бизнес в оборонной, аэрокосмической или смежных отраслях, также предлагали компиляторы и инструменты Ada для своих платформ, в том числе Concurrent Computer Corporation, Cray Research, Inc., Digital Equipment Corporation, Harris Computer Systems и Siemens Nixdorf Informationssysteme AG, хотя часто предоставлялись исключения из этого правила. Аналогичные требования существовали и в других странах НАТО: Ada требовалось для систем НАТО, включающих управление и контроль, а также другие функции, и являлось обязательным или предпочтительным языком для оборонных приложений в таких странах, как Швеция, Германия и Канада. К концу 1980-х и началу 1990-х годов компиляторы Ada улучшили свою производительность, но все еще существовали препятствия для полного использования возможностей Ada, включая модель задач, отличную от той, к которой привыкли большинство программистов систем реального времени. Saab Gripen, Lockheed Martin F-22 Raptor и система замены системы управления полетом DFCS для Grumman F-14 Tomcat. Канадская автоматизированная система управления воздушным движением была написана на 1 миллионе строк Ada (количество строк кода – SLOC). Она включала расширенную распределенную обработку, распределенную базу данных Ada и объектно-ориентированный дизайн. Ada также используется в других системах управления воздушным движением, например, в Великобритании система управления воздушным движением следующего поколения Interim Future Area Control Tools Support разработана и реализована с использованием SPARK Ada. Она также используется во французской системе сигнализации в кабине TVM на высокоскоростной железной дороге TGV, а также в пригородных поездах метро в Париже, Лондоне, Гонконге и Нью-Йорке.
Прагма
Прагма — это директива компилятора, передающая информацию компилятору для управления процессом компиляции и оптимизации выходного кода. Некоторые прагмы являются частью языка, а другие зависят от конкретной реализации компилятора. Типичные примеры использования прагм компилятора включают отключение определенных функций, таких как проверка типов во время выполнения или проверка границ массивов, или указание компилятору вставлять машинный код непосредственно вместо вызова функции (как это делают C и C++ со встроенными функциями).
Обоснование
Эти документы были опубликованы в различных формах, включая печатные издания. Также доступны приложения на dtic.mil в формате PDF.