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

Содержание:

Языки и надежность программ

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

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

В первую очередь, конечно, инструмент не должен делать работу человека сложнее, чем она и так есть. Когда Министерство обороны США разрабатывало требования к новому языку для конкурса, в котором победила ада, они в первую очередь упомянули об этом. Документ с требованиями известен как Steelman и содержит, например, такую фразу: «Одни и те же символы и ключевые слова не должны иметь разные значения в разном контексте». Почти вся первая часть рассказывает о необходимости однозначности синтаксиса, удобочитаемости кода, определенности семантики и поведения (вспомним ).

Но и требования к выразительным средствам для своего времени там передовые. Любопытно, что обработка исключений и средства обобщенного программирования были еще в первой редакции, задолго до С++.

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

Ответы на вопросы

После выступления протоиерею Александру задали несколько вопросов:

– На каком языке говорил Адам?

– Сложно сказать. С одной стороны, язык меняется, пока он жив. Но никто не знает, не было ли это новым свойством языков, которое появилось после строительства Вавилонской башни.

Но, в любом случае, язык Адама, вероятно, был непохож ни на какой из существующих языков, в том числе древнееврейский.

– Ведётся ли сейчас полемика о переводе богослужения на русский язык?

– Эта идея обсуждалась ещё до революции, и была отчасти скомпрометирована обновленцами. Они все по-русски не служили, но идея была ими поддержана.

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

Существуют отдельные случаи использования русского языка – по-русски изначально написана молитва Оптинских старцев и акафист «Слава Богу за всё».

Остальных переводов так много, и нюансов при их выполнении возникнет столько, что проще тексты несколько русифицировать, чем перевести.

Стихийно этот процесс давно идёт. Иногда возникают казусы: например, в «Чине венчания» двойственное число иногда неожиданно заменено множественным, а в современных акафистах употреблено непоследовательно.

– Как участвует в образовании разных языков Божественный Промысл?

– Язык существует помимо человеческой воли. Человек может создать эсперанто, но естественные языки существуют по своим законам.

Кирилл и Мефодий переводили на церковнославянский по вдохновению свыше, но и по той модели, которая к тому времени была.

По вдохновению свыше, записывая Евангелия по-гречески, апостолы заложили идею переводимости Евангелия.

Подготовила Дарья Менделеева

Больше параллельности!

Много новых возможностей связаны с упрощением распараллеливанием программ.

Параллельные циклы и блоки

AI12-0119-1 AI12-0251-1

Вводится новое ключевое слово parallel. Оно используется в написании двух новых операторов.

Параллельный блок:

procedure Traverse (T Expr_Ptr) is
begin
if T /= null
and then
T.all in Binary_Operation'Class 
then 
parallel do
Traverse (T.Left);
and
Traverse (T.Right);
and
Ada.Text_IO.Put_Line
("Processing " & Ada.Tags.Expanded_Name (T'Tag));
end do;
end if;
end Traverse;

Параллельный цикл:

parallel for I in Grid'Range(1) loop
Grid(I, 1) := (for all J in Grid'Range(2) => Grid(I,J) = True);
end loop;

Для параллельного цикла можно задать количество параллельно исполняемых отрезков указав его как выражение либо как спецификацию индекса:

parallel (Num_CPUs) for I in Arr'Range loop
A(I) := B(I) + C(I);
end loop;

declare
Partial_Sum array (1 .. Num_CPUs) of Integer := (others => );
begin
parallel (Chunk in Partial_Sum'Range) for I in Arr'Range loop

Partial_Sum (Chunk) := @ + some_complicated_computation;
end loop;

Sum := Partial_Sum'Reduce ("+", );
end;

Поддержка Map-Reduce

AI12-0262-1 AI12-0242-1

Техника программирования Map-Reduce широко распространена. (Подробнее.) В место того, чтобы писать подпрограммы и циклы, необходим другой механизм при котором входные и промежуточные значения существуют в виде потока значений. Это позволит задействовать все параллельные устройства машины. Вводится новый атрибут Reduce:

V'Reduce(Reducer, Initial_Value) 

Где в качестве V может выступать одно из

  • массив
  • контейнер
  • специальная конструкция value_sequence, синтаксис которой сходен с агрегатом контейнеров
value_sequence ::=
  '] iterated_component_association ']'

В итоге программа переберет все элементы V и начальное значение Initial_Value выполнит над ними подпрограмму Reducer, которая может быть функцией или процедурой:

function Reducer
(Accumulator Accum_Type;
Value      Value_Type) return Accum_Type;

procedure Reducer
(Accumulator in out Accum_Type;
Value       in Value_Type);

Вот пример вычисления факториала таким образом:

function Factorial(N Natural) return Natural is
(for J in 1 .. N => J'Reduce("*", 1));

Аспект Nonblocking

Чтобы компилятор мог использовать параллельность по полной нужно гарантировать некоторые свойства программы. К ним относится наличие блокировок по ходу исполнения кода.

На этапе описания подпрограммы можно указать, что она не содержит блокирующих операций. Работает и на уровне пакетов:

package Ada.Calendar with Nonblocking is
type Time is private;

Описание побочных эффектов

Другим важным свойством связанным с распаралелливанием является отсутствие побочных эффектов исполнения кода. Для их описания вводится новый аспект Global. Синтаксис его не так прост. Можно

  • указывать „всё“ или «ничего»
  • перечислить глобальные переменные, которые подпрограмма читает и/или пишет
  • указать что используются переменные из заданного пакета или его приватной части
  • ссылочный тип
  • указать режим доступа (in, out, in out)
procedure X
with Global => (in null,   
out all);  

procedure Y
with Global => (in private of My_Package,
out access Integer);

Атомарные операции

AI12-0234-1 AI12-0321-1

Для упрощения реализации неблокирующих алгоритмов добавили

  • настраиваемый пакет System.Atomic_Operations.Exchange
    • функцию Atomic_Exchange
    • функцию Atomic_Compare_And_Exchange
  • пакет System.Atomic_Operations.Test_And_Set
    • функцию Atomic_Test_And_Set
    • функцию Atomic_Clear
  • функции проверки наличия функциональности Is_Lock_Free в обоих пакетах

Пример использования:

declare
type Atomic_Boolean is new Boolean with Atomic;

package Exchange is new 
Atomic_Operations.Exchange (Atomic_Type => Atomic_Boolean);

Lock aliased Atomic_Boolean := False;

begin

while Exchange.Atomic_Exchange (Item => Lock, Value => True) loop
null;
end loop

... 

Lock := False; 
end;

Операционные системы

На Аде написан ряд операционных систем, среди них MaRTE, RTEMS (система с открытым исходным кодом, разработанная DARPA МО США, используется в ракетных системах и на борту автоматической межпланетной станции Mars Reconnaissance Orbiter, как управляющая радиомодулем «Electra»), , RTOS-32. В разработке находится ещё несколько проектов создания операционных систем на Аде, среди них AuroraUX — проект по переписыванию ядра OpenSolaris, а потом DragonFly BSD, а также проект по созданию на микроядре L4 системы Lovelace.

Ранее существовали и другие операционные системы, написанные на Аде, среди них BiiN, Pulse, AdaOS.

В настоящее время развивается операционная система Muen, написанная на Ada и SPARK, используются учебные ОС Ada Bare bones, Microkernel Ada (TAMP).

Новости

12.04.2019 Выступление Сергея Игоревича на Оберон конференции «Язык Ада в современной программной индустрии». Слайды можно посмотреть на Google Drive или скачать у нас.

https://youtube.com/watch?v=vnpjtUYSads

09.08.2018 Краткий обзор изменений уже приняты в грядущий стандарт языка Ада 202x.

07.06.2018 Выпуск инструментария для языка Ада GNAT Community 2018.

14.01.2018 Нашу почтовую рассылку теперь можно использовать как обычный форум. Для создания новых тем и отправки сообщений необходимо зарегистрироваться. В данный момент работает регистрация с использованием OAuth2 учетных записей Google, Facebook и GitHub.

10.01.2018 Новая группа в telegram — adalang.

29.12.2017 Статья 10 причин выучить Аду.

08.02.2017 Доступен перевод брошюры «Безопасное и надежное программное обеспечение на примере языка Ада 2012, SPARK 2014» Джона Барнса.

31.01.2017 Новая статья «Механизм сигналов‐слотов» в которой рассматривается реализация данного приема на языке Ада.

24.07.2014 Доступен кросс‐компилятор «GNAT GPL for Bare Board ARM» для платформ Linux, Mac OS X и Windows. Он позволяет вести разработку для процессоров ARM Cortex. Пакет включает студию разработки GPS, а также несколько разновидностей системных библиотек — минимальную версию (Small Footprint Profile) и Ravenscar Profile. Обе дают возможность исполнять Ада код без ОС. Ravenscar версия предоставляет эффективную, легкую, предсказуемую поддержку многозадачных систем. Скачать можно на сайте libre.adacore.com

07.07.2014 Опубликован перевод презентации Эда Шомберга «Introduction to Ada 2012».

10.06.2013 Обзорная статья Что нового в Ада 2012 раскрывает новые возможности языка Ада стандарта 2012 года, такие как поддержка контрактного программирования, новые типы выражений, расширение стандартной библиотеки и прочее.

29.05.2013 Вышла новая версия средств разработки GNAT GPL 2013. Скачать можно на сайте libre.adacore.com.

15.12.2012 Принят и опубликован новый стандарт языка Ада 2012. Скачать руководство по языку и обзор нововведений (Ada 2012 Rationale) можно на сайте www.adaic.org. Развернутую презентация на английском можно посмотреть тут. Ведет ее Эд Шомберг, один из ведущих специалистов по языку Ада.

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

06.05.2011 Мы разместили Gentoo ada_ru Overlay с пакетами для языка Ада на нашем сайте и планируем его постепенно пополнять. Более того, у нас теперь открыт хостинг Git репозиториев проектов связанных с языком Ада.

11.11.2010 О том, как работать с портами ввода/вывода в ОС Linux из программе на Аде рассказывает Александр Гавва.

17.08.2010 Мы объявляем конкурс студенческих работ Ada-GUI-2010. Подробнее…

25.06.2010 Вышла новая версия GNAT GPL 2010. Скачать можно на сайте libre.adacore.com.

18.09.2009 Приглашаем принять участие в Международной выставке «Перспективные технологии и системы» PTS-2009, где планируется выставочный блок сообщества Ada-ru.

11.06.2008 Вышла новая версия GNAT GPL 2008. Скачать можно на сайте libre.adacore.com и на нашем FTP зеркале.

07.04.2008 Теперь на тему языка Ада можно пообщаться в Jabber‐чате по адресу ada-ru@conference.jabber.ru

04.10.2007 Для ускорения развития сайта мы вводим Wiki. Это позволит легче и оперативней размещать материалы. Например, сразу появилась страничка с бинарными пакетами для Windows. В период перехода возможна небольшая рассинхронизация индекса страниц.

Объектно‐ориентированное программирование

К расширениям в области ООП относятся: интерфейсы, новая нотация вызовов операций, вложенные расширения типов, родовой конструктор.

Интерфейсы

Во время разработки стандарта Ада 95 было много споров о необходимости введения возможности множественного наследования, но из‐за чрезмерной сложности реализации решено было оставить лишь простое наследование. С тех пор удалось найти удачный компромисс — механизм интерфейсов. При его использовании разрешается иметь множественное наследование для спецификаций, но единичное для реализации. Интерфейс предоставляет только определения операций, без их реализации. Такие определения выполнены либо как абстрактные, либо как пустые (null) подпрограммы. Тип может реализовывать несколько интерфейсов, но наследовать реализацию может только от одного родительского типа. Таким образом достигается удобство множественного наследования при минимальной трудности реализации.

type Widget is tagged record
Object Gtk.Widget.Gtk_Widget;
end record;

procedure Draw (Object Widget) is abstract;

type Observer is interface;

procedure Notify
(Object Observer;
Cause  access Widget'Class) is null;

type Container is interface;

procedure Add
(Object in out Container;
Item   access Widget'Class) is abstract;

type Window is new Widget and Observer and Container with private;

procedure Draw (Object Window);

procedure Add
(Object in out Window;
Item   access Widget'Class);

procedure Notify
(Object Window;
Cause  access Widget'Class);

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

Кроме обычных (процедурных) интерфейсов вводятся также синхронные. Синхронные интерфейсы могут быть реализованы только задачными и защищенными типами.

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

generic
with procedure Start_Document is null;
with procedure End_Document is null;
with procedure Start_Element (Name String; Attr Attributes) is null;
with procedure End_Element (Name String) is null;
package SAX_Parser is
...
end SAX_Parser;

package My_Parser is new SAX_Parser (End_Element => Process_End_Element);

Новая нотация вызовов операций

Теперь в языке поддерживается новая нотация вызова операций, часто используемая в других ООП языках. Вызов может быть записан в форме ОБЪЕКТ.ОПЕРАЦИЯ (Аргументы). Для использования этой нотации в описании примитивной операции тэгового типа управляющий аргумент должен стоять первым.

Использование новой нотации может улучшить читаемость программ. При использовании старой нотации часто приходилось явно указывать пакет, в котором описана операция или использовать спецификатор use. Это приводило в первом случае к громоздкой записи вызова операций, во втором — к чрезмерному использованию спецификаторов видимости. Зачастую определить пакет, где определена данная операция, бывает трудно, т.к. наследуемые операции могут определяться неявно, а надклассовые операции часто описаны вместе с базовым типом, а не с производным.

Расширения типов во вложенных структурах

По правилам языка Ада 95 расширение типа должно находиться на том же лексическом уровне, что и описание родительского типа. В новом стандарте это ограничение ослаблено, и введены необходимые проверки, чтобы нельзя было вернуть объект нового типа (или указатель на него) из подпрограммы, где этот тип описан.

Настраиваемый конструктор тэговых типов

Новая настраиваемая функция Ada.Tags.Generic_Dispatching_Constructor позволяет создавать тип из заданной иерархии тэговых типов по заданному тэгу типа. Это полезно при чтении данных из внешних источников, потоков, XML файлов и т.д. Конкретизация данной функции исполняет роль, аналогичную методам «factory» в других ООП языках.

Все славяне понимали Библию?

Писание было принесено к нашим предкам не по-русски. Кирилл и Мефодий – солунские греки – разработали новый письменный язык на основании разговорного языка солунских славян.

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

Если мы предположим, что славянским племенам несколько тысяч лет назад было проще договориться между собой, чем современным славянским народам, то будем правы – языки были ближе. Но это не значит, что перевод Писания, сделанный Кириллом и Мефодием, был более понятен киевлянам и новгородцам, – письменный литературный язык был другой.

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

Иногда древнерусские аналоги и вовсе выпадали – «благо» и «болого» в названии «Бологое»; «шелом», который есть только в былинах, в отличие от «шлема».

Особенности

В исходном варианте, стандартизованном в 1983 году, Ада — это структурный, модульный язык программирования, содержащий высокоуровневые средства программирования параллельных процессов. Синтаксис Ады унаследован от языков типа Algol или Паскаль, но расширен, а также сделан более строгим и логичным. Ада — язык со строгой типизацией, в нём исключена работа с объектами, не имеющими типов, а автоматические преобразования типов сведены к абсолютному минимуму[источник не указан 1863 дня]. В стандарте 1995 года в язык были добавлены базовые средства объектно-ориентированного программирования, в стандарте 2007 эти средства были дополнены, поэтому современная Ада — объектно-ориентированный язык программирования.

1. Особенности языка

В исходном варианте, стандартизованном в 1983 году, Ада — это структурный, модульный язык программирования, содержащий высокоуровневые средства программирования параллельных процессов. Синтаксис Ады унаследован от языков типа Algol или Паскаль, но расширен, а также сделан более строгим и логичным. Ада — язык со строгой типизацией, в нём исключена работа с объектами, не имеющими типов, а автоматические преобразования типов сведены к абсолютному минимуму. В стандарте 1995 года в язык были добавлены базовые средства объектно-ориентированного программирования, в стандарте 2007 эти средства были дополнены, поэтому современная Ада — объектно-ориентированный язык программирования.

Из особенностей синтаксиса можно отметить:

  • Язык регистро-независимый.
  • Программы модульные, механизм контроля импорта-экспорта описаний между модулями включает две разные директивы: одну для подключения другого модуля (with), другую — для импорта его описаний (use). Также существует возможность переименовать модуль при импорте (rename) — этот вариант позволяет использовать для обозначения пакета более удобные программисту идентификаторы.
  • Пакеты (один из типов модулей) могут содержать заголовок и личную часть — то, что содержится в ней, не экспортируется и другим модулям недоступно.
  • Поддерживается механизм обобщённых (настраиваемых) модулей: пакетов, процедур и функций, позволяющих описывать обобщённые алгоритмы обработки данных без указания конкретного типа.
  • Развитая система типов, как встроенных, так и порождаемых программистом. Есть множество способов создания новых типов, язык поддерживает два разных понятия: «подтип» и «производный тип». Переменные типа и подтипа совместимы, переменные типа и его производного типа — нет.
  • Средства обработки исключений.
  • Развитые средства обращения к процедурам и функциям: поддерживаются входные и выходные параметры, передача фактических параметров в произвольном порядке с указанием имён формальных, параметры со значениями по умолчанию.
  • Поддерживается переопределение процедур, функций и операторов — создание нескольких вариантов процедуры, функции или оператора с одним и тем же именем, но различными сигнатурами (типами и количеством параметров).
  • Встроенные в язык конструкции поддержки параллельного программирования: поддерживаются понятия «задача» (параллельно выполняемый фрагмент программы), «вход задачи» (средство синхронизации и коммуникации параллельно выполняющихся задач), поддерживается механизм «рандеву» (протокол взаимодействия параллельно выполняемых задач через вход одной из них), имеется оператор выбора SELECT для организации условного межпотокового взаимодействия (выбора параллельной задачи, с которой следует взаимодействовать, в зависимости от готовности к рандеву и некоторых других условий). В принципе, имеющихся в языке средств параллельного программирования достаточно для решения большого класса задач, требующих параллельной обработки, без обращения к внешним средствам, таким как дополнительные библиотеки или API операционной системы.

Для удовлетворения требованиям надёжности язык построен таким образом, чтобы как можно большее количество ошибок обнаруживалось на этапе компиляции. Кроме того, одним из требований при разработке языка была максимально лёгкая читаемость текстов программ, даже в ущерб лёгкости написания. Результатом такого подхода стал несколько «тяжеловесный» синтаксис и множество ограничений, отсутствующих в наиболее распространённых промышленных языках (С и C++) и часто воспринимаемых профессиональными программистами как избыточные, например, та же строгая типизация. Это привело к формированию представления об Аде как о сложном, малопонятном и неудобном в использовании языке.

Компиляторы Ада

Название Компания Версия Целевые платформы Сайт
Компиляторы проекта DragonLace (GNAT AUX и будущие компиляторы DRACO Ada) проект сообщества Ада — все версии языка; версии компиляторов: 4.9.х или 6.3.х (для различных платформ) LLVM, DragonFly, FreeBSD, NetBSD, OpenBSD, OmniOS, Android
Ada-C/C++ Changer (на технологии AdaMagic) MapuSoft Ада 83, Ада 95, подмножество Ада 2005 Си, C++
Ada/Ed Нью-Йоркский университет Ада 83 MS-DOS x86, UnixWare
AdaMagic SofCheck Ада 95 ?
AdaMULTI Green Hills Software Ада 83, Ада 95, Си, Си++, Фортран Solaris SPARC, GNU/Linux x86, Windows
DEC Ada Hewlett Packard Ада 83 OpenVMS
GNAT AdaCore Ада 83, Ада 95, Ада 2005, Ада 2012, Си Solaris SPARC, Linux x86/x86-64, Windows, Java Virtual Machine, другие
ICC Irvine Compiler Corporation Ада 83, Ада 95 DEC VAX/VMS, HP 9000/700, Solaris SPARC, DEC Alpha OSF/1, PC Linux, SGI IRIX, Windows
Janus/Ada RR Software Ада 83, Ада 95 SCO, UnixWare, Interactive, MS-DOS, Windows
MAXAda Concurrent Ада 95 Linux/Xeon, PowerPC
ObjectAda PTC Ада 95, Ravenskar (англ.)русск. Solaris SPARC, VxWorks, HP-UX, IBM AIX, Linux, Windows, Java Virtual Machine / Java с поддержкой браузеров
PowerAda OC Systems Ада 83, Ада 95 Linux, AIX (Ада 95); IBM System 370/390 (Ада 83)
Rational Apex IBM Rational Ада 83, Си, Си++ Solaris SPARC, Linux
SCORE DDC-I Ада 83, Ада 95, Си, Фортран Solaris SPARC, Windows
XD Ada SWEP-EDS Ада 83 OpenVMS Alpha/VAX
XGC Ada XGC Software Ада 83, Ада 95, Си Solaris SPARC, PC Linux, Windows (Cygwin)
LLVM (Low Level Virtual Machine) LLVM Developer Group на большинство UNIX-подобных систем и Windows llvm.org
A# (порт Ada на платформу Microsoft .NET) Академия ВВС США (GNU) Windows

За исключением LLVM, GNAT и XGC (для некоторых платформ) вышеперечисленные компиляторы являются платными. Некоторые фирмы, например Aonix, предлагают бесплатные демонстрационные версии, ограниченные либо по времени использования, либо по функциональности.

Среды разработки NetBeans и Eclipse имеют плагины для работы с Ада.

Вызов функций из библиотек на C

Иногда самый простой способ определения гипервизора требует выполнения команд ОС. Например, в FreeBSD информацию о Xen можно получить через . Но для этого нам надо научиться выполнять внешние программы. Это можно было бы сделать встроенными средствами через пакет , но для простоты и демонстрационной ценности мы используем функцию из libc.

Ада предоставляет простые и развитые средства FFI и не требует libffi для их работы. Можно импортировать функции из библиотек на C, C++ и Fortran, экспортировать функции из ады и создавать библиотеки для этих языков. Мы рассмотрим самый простой вариант применения.

Для взаимодействия с библиотеками на C используется пакет Interfaces.C. Для преобразования символьных и строковых типов там определены функции и . Например, эквивалент там называется . Поскольку ада не использует нулевой байт как признак конца строки, передача строк без преобразования может привести к самым неожиданным результатам.

Перед тем как импортировать функцию, нужно написать ее объявление. Сам импорт функций производится с помощью директивы компилятора . Она принимает три аргумента: конвенцию вызовов, имя функции, каким оно будет видно в аде, и имя функции из библиотеки. В нашем случае для импорта из libc потребуется .

Вот пример простейшей программы, которая вызывает и выводит код возврата, если он не равен нулю:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

with Ada.Text_IO;

with Interfaces.C;useInterfaces.C;

procedure Call_Uname is

functionSystem(ArgChar_Array)returnInteger;

pragma Import(C,System,»system»);

RetvalInteger;

begin

Retval=System(To_C(«uname -a»));

ifRetval/=then

Ada.Text_IO.Put_Line(«Exit code:»& (Integer’Image (Retval)));

endif;

endCall_Uname;

В hvinfo этот подход используется в функциях и из .

История

Разработка языка была проведена в рамках международного конкурса, организованного и профинансированного министерством обороны США.
Целью разработки было получение языка программирования, который мог бы стать единым для разработки проектов по заказам военного ведомства, главным образом, для разработки встроенных систем военного назначения и для больших военных компьютеров (на базе процессора iAPX 432 от Intel). Работа началась в 1975 году с формирования набора требований к языку, который бы в полной мере удовлетворил разработчиков систем указанного типа. Первоначальный список требований, выпущенный под кодовым наименованием «Strawman» («Соломенный»), был представлен на рецензию в ряд организаций и фирм, в течение двух лет последовательно уточнялся, пройдя через «Woodenman» («Деревянный»), «Tinman» («Оловянный»), «Ironman» («Железный») и в конечном счёте превратившись в итоговый документ под названием «Steelman» («Стальной»). «Steelman» был выпущен в июне 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 принят и опубликован новый стандарт языка.

Литература

  •  (недоступная ссылка)

John Barnes. Ada 2012 Rationale. — 2011,2013. — С. 215.

  • Роберт В Себеста. Основные концепции языков программирования = Concepts of Programming Languages. — 5-е изд. — М.: «Вильямс», 2001. — С. 672. — ISBN 5-8459-0192-8.
  • Языки программирования Ада, Си, Паскаль = Comparing and Assessong Programming Languages Ada, C, and Pascal / А.Фьюэр, Н.Джехани. — М.: Радио и Связь, 1989. — 368 с. — 50 000 экз. — ISBN 5-256-00309-7.
  • . Ada Resource Association.
  • Генерация случайных чисел в Ada 9X.
Стандарты
  • ISO/IEC 8652:1987 — Programming languages — Ada
  • ГОСТ 27831-88 — «Язык программирования АДА» (соответствует стандарту ISO 8652:1987)
  • ISO/IEC 8652:1995 — Information technology — Programming languages — Ada (Ada95)
  • ISO/IEC 8652:2012 — Information technology — Programming languages — Ada (текущая редакция стандарта)
  1. . ftp.mcs.anl.gov. Дата обращения 4 февраля 2019.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *