Почему вам стоит использовать язык Ада для программирования вашей системы

«Универсальные» языки программирования (Basic, Pascal, C++ и другие)

Универсальный язык, или Язык общего назначения, — язык программирования, ориентированный на решение задач практически из любой области и объединяющий на единой методической основе наиболее существенные свойства и средства современных машино- и проблемноориентированных языков программирования (например, язык ассемблера , ПЛ/1 и др.).

Содержание

Универсальный язык, или Язык общего назначения, — язык программирования, ориентированный на решение задач практически из любой области и объединяющий на единой методической основе наиболее существенные свойства и средства современных машино- и проблемноориентированных языков программирования (например, язык ассемблера , ПЛ/1 и др.).

Появление к началу 1960-х годов большого числа специализированных языков и успешное распространение некоторых из них породили мечты о создании универсального языка, пригодного для решения самых разнообразных задач.

Классическими примерами универсального ЯП могут служить язык ассемблера ЕС или ПЛ/1. В свое время на эту роль претендовали Алгол’60, Симула’67, Алгол’68. Реально ее играют также Фортран, в частности его стандарты – Фортран’66 (ГОСТ) и Фортран’77 (стандарт ИСО), Бейсик (в особенности его развитые модификации), Паскаль (в особенности диалекты, допускающие раздельную трансляцию), менее известные у нас такие ЯП, как Корал (стандарт МО Великобритании), Джовиал (стандарт ВВС США), а также отечественный Эль’76.

Планирование военного качества

Чтобы выбрать новый язык программирования, минобороны собрала «рабочую группу языков высшего порядка» [High Order Language Working Group (HOLWG)], состоявшую из военных и учёных экспертов, в задачи которой входило составление списка запросов и выбор языков-кандидатов. В итоге были составлены т.н. «запросы Стилмана»:

Главными пунктами запросов были:

  • Гибкая схема работы общего назначения, адаптирующаяся к нуждам встроенных вычислительных приложений.
  • Надёжность. Язык должен способствовать проектированию и разработке надёжных программ.
  • Лёгкость поддержки. Код должен быть читаемым, а программные решения — ясными.
  • Лёгкость производства эффективного кода. Должна быть возможность легко определять неэффективные конструкции.
  • Отсутствие ненужной сложности. Семантическая структура должна быть последовательной, и минимизировать количество концепций.
  • Независимость от машины. Язык не должен быть привязан к каким-то деталям ОС или оборудования.
  • Полное определение. Все части языка должны быть полностью и недвусмысленно определены.

Группа заключила, что хотя среди существовавших на тот момент языков ни один не подходил для нужд минобороны, было вполне реально создать новый язык, подходящий под все указанные вопросы. Четырём проектировщикам получили это сделать. Промежуточный процесс выбора подобрал два наиболее подходящих метода работы, и в итоге лишь один язык победил в конкурсе и получил название «Ада».

Сборка и запуск программ с помощью GPS

Если вы ищите интегрированную среду разработки для Ada, вам следует обратить внимание на интегрированную среду разработки GPS ( gnat_gps ), которая использовалась при создании иллюстраций к данной статье.

Для компиляции файла исходного кода с помощью GPS вы в первую очередь должны добавить этот файл в проект. Для этого следует перейти по меню окна интегрированной среды разработки GPS «Project — Edit Project Properties» и открыть вкладку «Main Files». Теперь нужно нажать на кнопку «Add», выбрать файл (например, hello.adb ) и нажать на кнопку «OK». После добавления файла в проект следует перейти по меню окна «Build — Project — hello.adb «. После этого вы увидите окно параметров сборки, в котором не стоит ничего менять, ведь, как правило, стандартные параметры сборки являются наиболее оптимальными.

Далее вы можете осуществить переход по меню «Build — Run — hello» для запуска программы либо в окне GPS (как на иллюстрации ниже), либо в отдельном окне терминала.

Сборка и запуск программы средствами GPS

Сборка и запуск программы средствами GPS.

Совет: Если вам нужно сослаться на процедуру A из процедуры B , процедура A должна быть объявлена до процедуры B , иначе компилятор GNAT не сможет найти ее.

Стандартизация

Этот язык стал стандартом ANSI в 1983 году ( ANSI / MIL-STD 1815A ), а после перевода на французский язык и без дальнейших изменений на английский язык стал стандартом ISO в 1987 году (ISO-8652: 1987). Эта версия языка широко известна как Ada 83 с даты ее принятия ANSI, но иногда также упоминается как Ada 87 с даты ее принятия ISO.

Ada 95, совместный стандарт ISO / ANSI ( ISO-8652: 1995 ), был опубликован в феврале 1995 года, что сделало Ada 95 первым объектно-ориентированным языком программирования стандарта ISO. Чтобы помочь с пересмотром стандарта и его принятием в будущем, ВВС США профинансировали разработку компилятора GNAT . В настоящее время компилятор GNAT является частью коллекции компиляторов GNU .

Продолжалась работа по улучшению и обновлению технического содержания языка Ада. Техническое исправление к Ada 95 было опубликовано в октябре 2001 года, а основная поправка, ISO / IEC 8652: 1995 / Amd 1: 2007, была опубликована 9 марта 2007 года. На конференции Ada-Europe 2012 в Стокгольме Ada Resource Association (ARA) и Ada-Europe объявили о завершении разработки последней версии языка Ada и отправке справочного руководства в Международную организацию по стандартизации (ISO) на утверждение. ISO / IEC 8652: 2012 был опубликован в декабре 2012 года.

Другие связанные стандарты включают ISO 8651 -3: 1988 Системы обработки информации — Компьютерная графика — Привязки языков графической системы ядра (GKS) — Часть 3: Ada .

Первая программа

Традиционный Hello world дает очень мало представлений о языке, поэтому для первой программы мы возьмем что-нибудь более реалистичное, например алгоритм Пардо — Кнута. Дональд Кнут и Луис Трабб Пардо предложили его как раз для этой цели.

  1. Прочитать одиннадцать чисел со стандартного ввода.
  2. Применить к ним всем некоторую функцию и вывести результаты в обратном порядке.
  3. Если применение функции вызвало переполнение, вывести сообщение об ошибке.

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

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

Вот наша программа. Ее нужно будет сохранить в файл с названием pardo_knuth . adb . Несовпадение имени файла с именем основной процедуры, которая служит точкой входа, вызовет предупреждение компилятора.

Скомпилировать программу можно командой gnatmake pardo_knuth . adb . Созданный исполняемый файл будет называться pardo_knuth .

Замечу, что синтаксис ады нечувствителен к регистру символов. В стандартной библиотеке GNAT по каким-то причинам укоренился непривычный Смешанный _ Регистр , и я следую стилю стандартной библиотеки. Но если кому-то он кажется неэстетичным, можно использовать любой другой по вкусу — на работу программ это не повлияет.

Заголовок программы

Перед началом программы находится комментарий. Все комментарии в аде однострочные и начинаются с символов — .

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

Ключевое слово use делает модули видимыми в пространстве имен программы. Например, после with Ada . Text_IO мы могли бы вызывать процедуру Ada . Text_IO . Put_Line по ее полному имени. Но мы использовали конструкцию use Ada . Text_IO , которая импортирует все публичные символы этого модуля в наше пространство имен, поэтому мы можем вызвать Put_Line , Put и New_Line без имени модуля.

Распространенные функции из Ada.Text_IO

  • Put_Line — выводит данные с символом новой строки на конце.
  • Put — выводит данные без переноса строки.
  • New_Line — выводит символ переноса строки.

Модули Ada . Strings . Unbounded и Ada . Text_IO . Unbounded_IO предназначены для работы со строками произвольной длины. По умолчанию строки в аде фиксированной длины, что не всегда удобно для обработки пользовательского ввода. Строки произвольной длины легко преобразовать в фиксированные, что нередко приходится делать, потому что многие функции стандартной библиотеки ожидают именно фиксированные.

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

Внутри нашей процедуры мы переименовали модули с длинными именами для удобства, аналогично import foo as bar в Python. Теперь мы сможем вызывать, к примеру, Ada . Strings . Unbounded . To_String как US . To_String .

Алгоритм Пардо — Кнута требует сообщать пользователю о переполнении. Чтобы упростить появление переполнений, мы создали намеренно ограниченный тип-диапазон Small_Float , с возможными значениями от -100.0 до +100.0. Для таких типов у ады есть встроенные проверки: присвоение недопустимой константы в коде приведет к ошибке компиляции, а появление недопустимых значений в ходе работы программы вызовет исключение.

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

Строка package Float_IO is new Ada . Text_IO . Float_IO ( Small_Float ) заслуживает отдельного внимания. Это уже не простое переименование, а специализация обобщенного (generic) модуля для нашего типа Small_Float .

В аде нет аналога printf , что бывает очень неудобным, но для ее целей выглядит оправданным — типобезопасный форматированный вывод возможен только в языках с совершенно другой системой типов. В С printf ( «%d» , «foo» ) вызовет segmentation fault, в Go аналогичная конструкция приведет к ошибке времени выполнения — ни то ни другое в критичной по надежности программе не принесет пользователю особой радости. Поэтому хотя бы для относительного удобства авторы стандартной библиотеки ады написали несколько модулей для ввода и вывода значений распространенных типов.

Для алгоритма Пардо — Кнута нам требуется определенная пользователем функция. Функции и процедуры в аде могут быть вложенными, чем мы и воспользуемся и определим простейшую функцию Square в заголовке основной процедуры нашей программы. Тип возвращаемых значений указан с помощью return Small_Float . Это обязательная часть синтаксиса — еще раз отметим, что создать функцию, которая не возвращает значений, невозможно, для этой цели нужно использовать процедуры.

Далее идут объявления переменных. В аде все переменные должны быть объявлены перед использованием. Глобальных переменных в смысле C в ней нет, их область видимости всегда чем-то ограничена: пакетом (то есть модулем), процедурой, функцией или блоком declare , который мы рассмотрим позже. Видимые внутри всей процедуры переменные должны быть объявлены в ее заголовке, что мы и сделаем.

С помощью Input : Array ( 0 . . 10 ) of Small_Float мы объявляем массив Input , где будут храниться введенные пользователем значения. Мы используем диапазон индексов от 0 до 10, но вообще индексы могут быть любыми, в том числе отрицательными, например от -5 до 5. Еще вместо явных индексов можно было бы создать целочисленный тип-диапазон и сослаться на него.

Переменная Index , очевидно, будет использоваться как индекс элемента массива в цикле — мы могли бы объявить ее позже, но для демонстрации оставим ее здесь. Ее начальное значение — ноль, присваивается одновременно с объявлением переменной. Все присваивания в языке производятся с помощью оператора : = , оператор = используется только для проверки равенства.

Для оператора «не равно» используется символ /= . Вполне вероятно, что Haskell заимствовал его из ады.

Переменная Debug будет служить только для демонстрации условного оператора. Она имеет тип Boolean с возможными значениями True и False . Условный оператор в аде требует выражения логического типа и никакого другого, привычное в C-подобных языках if ( 0 ) вызовет ошибку — никакие неоднозначности, связанные с интерпретацией произвольных значений в логическом контексте, в этом языке возникнуть не могут.

Заголовок основной процедуры нашей программы наконец закончился — переходим к ее телу.

Тело программы

Мы начинаем программу с довольно глупой демонстрации условного оператора — выводим другое приветствие, если переменная Debug выставлена в True . Этого не произойдет, если не поменять ее начальное значение руками, но суть не в этом, а в синтаксисе. Условный оператор имеет вид if < условие >then < высказывание >else < высказывание >end if . Часть про end if обязательна. Вообще, в аде почти нигде нельзя написать просто end , не указав, что именно здесь закончилось. Читать такой исходный код куда проще, хоть писать и дольше, но правильная настройка редактора решает эту проблему. В объявлении функции Square мы уже видели, что она кончается словами end Square , хоть и не заостряли на этом внимание.

Компилятор удаляет заведомо недостижимый код, как внутри if Debug , из исполняемых файлов, но только после проверки всех типов и всего прочего, что можно проверить на этапе компиляции. Такие константы — стандартный способ реализации feature toggles и отладочного кода, куда более безопасная альтернатива условной компиляции с помощью препроцессора. Конечно, такой подход не работает для машинно зависимого кода, который просто не скомпилируется вне его целевой платформы. В этом случае можно использовать внешний препроцессор — gnatprep.

Для циклов можно даже указать имена: цикл ввода переменных объявлен с помощью Input_Loop : while . . . loop и закончен end loop Input_Loop . Перепутать границы вложенных циклов при таком подходе очень сложно. Синтаксис циклов радует своим единообразием — циклы с предусловием и циклы с параметром отличаются только словами перед ключевым словом loop .

См. Также [ править ]

    — спецификация среды программирования для поддержки разработки программного обеспечения на Ada. — подмножество функций задач Ada, разработанных для критически важных для безопасности вычислений в реальном времени. — язык программирования, состоящий из строго ограниченного подмножества Ada, аннотированный метаинформацией, описывающей желаемое поведение компонентов и индивидуальные требования времени выполнения.
  1. ^«Техническое исправление для Ada 2012, опубликованное ISO» . Ассоциация ресурсов Ada. 2016-01-29 . Проверено 23 февраля 2016 .
  2. ^«Сводное справочное руководство по языку Ada 2012» . Орган по оценке соответствия Ada. Архивировано из оригинала на 2016-03-03 . Проверено 23 февраля 2016 .
  3. ^«Техническое исправление 1 для Ada 2012» . Орган по оценке соответствия Ada. Архивировано из оригинала на 2016-03-02 . Проверено 23 февраля 2016 .
  4. ^«PTC ObjectAda» . PTC.com . Проверено 27 января 2014 .
  5. ^«AdaMagic с сертификатом C Intermediate» .
  6. ^«Спецификация часовни (Благодарности)» (PDF) . Cray Inc. 2015-10-01 . Проверено 14 января 2016 .
  7. ^ Ganssle, Джек (2013-05-29). «Ada Resource Association — Новости и ресурс по языку программирования Ada» . Adaic.org . Проверено 14 июня 2013 .
  8. ^ ab«ISO / IEC 8652: 2012Информационные технологии — Языки программирования — Ада» . Международная организация по стандартизации . Проверено 23 декабря 2012 .
  9. ^«Язык программирования Ада» . Университет штата Мичиган . Архивировано из оригинала на 2016-05-22 . Проверено 27 мая 2016 .
  10. ^ Fuegi, J; Фрэнсис, J (2003). «Лавлейс и Бэббидж и создание 1843„ноты “ ». IEEE Annals of the History of Computing . 25 (4): 16–26. DOI : 10.1109 / MAHC.2003.1253887 . S2CID40077111 .
  11. ^ Тафт, С. Такер; Олсен, Флоренция (1999-06-30). «Ада помогает выпускать менее ошибочный код» . Правительственные компьютерные новости. С. 2–3 . Проверено 14 сентября 2010 .
  12. ^ abc Фельдман, Майкл. «Кто использует Аду?» . Рабочая группа SIGAda Education.
  13. ^Нет безопасного управления динамической памятью в ADA , в: Написание модулей ядра Linux в Safe Rust — Джеффри Томас и Алекс Гейнор, The Linux Foundation, 2019-10-02
  14. ^«Джон Гуденаф | Профиль персонала SEI» . Sei.cmu.edu . Проверено 27 января 2014 .
  15. Перейти↑ CAR, Hoare (1981). «Старая одежда императора» (PDF) . Коммуникации ACM . Ассоциация вычислительной техники . 24 (2): 75–83. DOI : 10.1145 / 358549.358561 . S2CID97895 .
  16. ^ Ватт, DA; Wichmann, BA; Финдли, В. (1987). Ада: язык и методология . Прентис-Холл.
  17. ^ abcd Sward, Рики Э. (ноябрь 2010 г.). «Взлет, падение и упорство Ады». SIGAda ’10: Материалы ежегодной международной конференции ACM SIGAda, посвященной SIGAda . С. 71–74. DOI : 10.1145 / 1879063.1879081 .
  18. ^ abc Розен, JP. (Август 2009 г.). «Парадокс Ады». Письма Ады . ACM SIGAda. 24 (2): 28–35. DOI : 10.1145 / 1620593.1620597 . S2CID608405 .
  19. ^ SofTech Inc. (1983-04-11). «Сводный отчет о проверке компилятора Ada: NYU Ada / ED, версия 19.7 V-001» . Уолтем, Массачусетс. Архивировано из оригинала на 2012-03-12 . Проверено 16 декабря 2010 .
  20. ^ Дьюар, Роберт Б.К .; Фишер, Джеральд А. Младший; Шенберг, Эдмонд; Froelich, Роберт; Брайант, Стивен; Госс, Клинтон Ф .; Берк, Майкл (ноябрь 1980). «Переводчик и устный переводчик Ada NYU». Уведомления ACM SIGPLAN — Материалы симпозиума ACM-SIGPLAN по языку программирования Ada . 15 (11): 194–201. DOI : 10.1145 / 948632.948659 . ISBN
  21. 0-89791-030-3 . S2CID10586359 .
  22. ^ «Список проверенных компиляторов Ada». Информационный центр Ada. 1 июля 1992 г. С. 1–36.
  23. ^ Информационный центр Ada (1983-04-11). «Мандат Ады Конгресса» . Архивировано из оригинала на 2016-03-04 . Проверено 7 июня 2015 .
  24. ^ Бабяк, Nicholas J. (1989). Ада, компьютерный язык новой системы вооружения Министерства обороны — Панацея или Бедствие (PDF) . Воздушный университет (ВВС США) . С. 39–40.
  25. ^ ab Ремер, Карл (2009). «Команда HADS». В Stellman, Эндрю; Грин, Дженнифер (ред.). Красивые команды: вдохновляющие и поучительные истории от опытных руководителей команд . Севастополь, Калифорния: О’Рейли. С. 299–312.
  26. ^ ab Вулф, Александр (октябрь 2004 г.). «В Аде еще осталось немного жизни» . Очередь ACM . 2 (7): 28–31. DOI : 10.1145 / 1035594.1035608 .
  27. ^ AdaCore. «GNAT Pro выбран для британской системы УВД нового поколения» . Архивировано из оригинала на 2010-12-24 . Проверено 1 марта 2011 .
  28. ^ AdaCore. «Посмотрите, кто использует Аду» . Архивировано из оригинала на 2010-12-24 . Проверено 1 марта 2011 .
  29. ^«Карта синтаксиса Ada» (PDF) . Архивировано из оригинального (PDF) 6 июля 2011 года . Проверено 28 февраля 2011 года .
  30. ^«Ada 83 LRM, раздел 2.8: Pragmas» . Archive.adaic.com . Проверено 27 января 2014 .
  31. ^«Ada 83 LRM, Приложение / Приложение B: Предопределенные языковые прагмы» . Archive.adaic.com. Архивировано из оригинала на 2012-02-06 . Проверено 27 января 2014 .

Международные стандарты [ править ]

    : Информационные технологии. Языки программирования. Ада. : Информационные технологии — Языки программирования — Спецификация семантического интерфейса Ada ( ASIS ) : Информационные технологии — Языки программирования — Ada: Оценка соответствия языкового процессора ( ACATS ) , привязка POSIX Ada , то CORBAязык описания интерфейсов (IDL) для отображения Ada

Обоснование [ править ]

Эти документы опубликованы в различных формах, в том числе в печатном виде.

Язык программирования «Ада»

В 1979-1980 годах, в рамках проекта Министерства Обороны США был создан объектно-ориентированный язык программирования «Ада», названный в честь Лавлейс. Этот язык имеет компиляторы под практически любую операционную систему. В него включены поддержки параллельного исполнения, настройка модулей, обработка исключений. Синтаксис у «Ады» вполне читаемый:

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

Оцените статью
Fobosworld.ru
Добавить комментарий

Adblock
detector