Ада (язык программирования) - Ada (programming language)


Из Википедии, свободной энциклопедии
Ada
Ад Mascot с лозунгом
парадигма Мульти-парадигма
Разработано
  • MIL-STD-1815 / Ada 83: Ишбиа
  • Ada 95: Tucker Taft
  • Ada 2005: Tucker Taft
  • Ada 2012: Tucker Taft
Во-первых появился Февраль 1980 ; 39 лет назад ( 1980-02 )
Стабильная версия
Ada 2012 ТС1 / 1 февраля 2016 ; 3 года назад ( 2016-02-01 )
релиз Preview
Ada 2012 ТС1 / апрель 2015 ; 3 года назад ( 2015-04 )
Typing дисциплины Статическая , сильный , безопасный , именительный
Операционные системы Кросс-платформенная (мультиплатформенный)
расширения файлов .adb, .ads
Веб-сайт WWW .adaic .org
Основные реализации
AdaCore ВНСТ (скачать бесплатно: http://libre.adacore.com/download ),
Green Hills Software Оптимизация Ada 95 компилятора,
PTC, Inc. PTC ApexAda и PTC ObjectAda,
"MapuSoft Ada-C / C ++ чейнджер" ., Ранее известный как "AdaMagic с C Intermediate",
DDC-я оценка
Диалекты
СПАРК , профиль Ravenscar
Под влиянием
Алгол 68 , Паскаль , С ++ (Ada 95), Smalltalk (Ada 95), Модуле-2 (Ada 95) Java (Ада 2005), Эйфелева (Ada 2012)
Под влиянием
C ++ , Chapel , "Драго" ., Eiffel , "Грифон" ., Java , Nim , летать на парашюте за катером , PL / SQL , PL / PgSQL , рубин , Seed7 , "SPARforte" ., Sparkel , SQL / PSM , VHDL

Ада является структурированным , статический типизированным , необходим , и объектно-ориентированным высокоуровневым компьютерным языком программирования , простирался от Паскаля и других языков. Он имеет встроенную поддержку языка для дизайна-по-контракт , чрезвычайно сильной типизации, явного параллелизм, задачи, синхронной передачи сообщений, защищенных объектов и индетерминизма . Ada повышает безопасность кода и ремонтопригодность с использованием компилятора для поиска ошибок в пользу ошибок во время выполнения. Ада является международным стандартом; текущая версия (известная как Ada 2012) определяется стандартом ISO / IEC 8652: 2012.

Ада была первоначально разработана командой под руководством Ишбиа из CII Honeywell Bull по контракту на Министерство обороны США (DoD) с 1977 по 1983 году, чтобы заменить более 450 языков программирования , используемых в Министерстве обороны в то время. Ада была названа в честь Ады Лавлейс (1815-1852), который был зачисляется в качестве первого программиста.

Характеристики

Ада была изначально ориентирована на внедренную и в режиме реального времени системы. Редакция Ada 95, разработанный С. Tucker Taft из Intermetrics между 1992 и 1995, улучшена поддержка систем, численных, финансовых и объектно-ориентированного программирования (ООП).

Особенности Ada включают в себя: сильные печатать , модульность механизмы (пакеты), во время выполнения проверки , параллельной обработки ( задачи , синхронные передачи сообщений , защищенных объектов и недетерминированных операторов выбора ), обработку исключений и дженерики . Ада 95 добавлена поддержка объектно-ориентированного программирования , в том числе динамической диспетчеризации .

Синтаксис Ada минимизирует выбор способов выполнения основных операций, и предпочитает английские ключевые слова (например, «или же» и « а затем») в символы (такие как «||» и «&&»). Ада использует основные арифметические операторы «+», «-», «*» и «/», но избегает использования других символов. Блоки кода ограничивается словами , такие как «объявить», «начать» и «конец», где «конец» (в большинстве случаев) следует идентификатор блока он закрывает (например, если конец , если ... , петля ... конец цикла ). В случае условных блоков это позволяет избежать оборванных еще , что может спариваться с неправильным вложенным if-выражения в других языках , таких как C или Java.

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

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

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

Динамическое Ады управление памятью является высоким уровнем и типа-сейф. Ада не имеет общие или нетипизированные указатели ; и не неявно объявить любой тип указателя. Вместо этого, все динамическое распределение памяти и освобождение должно происходить через явно объявленных типов доступа . Каждый тип доступа имеет соответствующий пул устройств хранения данных , который обрабатывает низкоуровневые детали управления памятью; программист может использовать либо пул хранения по умолчанию или определить новые (это особенно актуально для Non-Uniform Memory Access ). Можно даже объявить несколько различных типов доступа , которые все обозначают один и тот же тип , но используют различные пулы хранения. Кроме того , язык обеспечивает доступности проверок , как во время компиляции и во время выполнения, что гарантирует , что стоимость доступа не может изгладить тип объекта он указывает.

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

Удвоение тир ( «-»), напоминающий длинный тир , обозначает текст комментария. Комментарии остановка в конце строки, чтобы предотвратить незакрытые комментарии от случайного опорожнять целые секции исходного кода. Отключение целый блок кода требует теперь Префикс каждой строки (или столбца) в индивидуальном порядке с «-». Хотя ясно обозначив инвалид код с колонкой неоднократным «-» вниз страниц это делает экспериментальный Дис / повторные ВОЗМОЖНОСТИ больших блоков более вытянутым процесс.

Точка с запятой ( «;») является утверждением терминатора , и нуль или отсутствия операций утверждения null;. Один ;без заявления о прекращении не допускается.

В отличии от большинства ISO стандартов, определение языка Ада (известное как Ada Reference Manual или ARM , или иногда в Language Reference Manual или LRM ) является содержанием свободным . Таким образом, общая ссылка на Ada программистов и не только программист , реализующих компилятор Ada. Помимо справочника, существует также обширное Обоснование документ , который объясняет дизайн языка и использование различных языковых конструкций. Этот документ также широко используется программистами. Когда язык был пересмотрен, новый Обоснованием документ был написан.

Заметный свободный программное обеспечение инструмент , который используется многими программистами Ада , чтобы помочь им в письменной форме Ada исходного кода является GNAT программирование студии .

история

В 1970 году Министерство обороны США (DoD) обеспокоен количеством различных языков программирования, используемых для его встроенных системных проектов компьютерных, многие из которых были устаревшими или аппаратно-зависимыми, и ни один из которых не поддерживается безопасное модульное программирование. В 1975 годе рабочая группа , то высокий порядок Язык Рабочей группа (HOLWG), была создана с целью , чтобы уменьшить это число нахождения или создание языка программирования , как правило , пригодный для Департамента и в Министерстве обороны Великобритании требований. После многих итераций , начиная с оригинальным человеком предложением Стро в конечном итоге язык программирования был назван Адом. Общее число языков программирования высокого уровня в использовании таких проектов снизилась с более чем 450 в 1983 году до 37 к 1996 году.

Рабочая группа HOLWG обработала требование SteelMan языка , ряд документов , в котором указываются требования по их мнению , язык программирования должен удовлетворять. Многие существующие языки были официально рассмотрены, но группа пришла к выводу , что в 1977 году ни одна из существующих языков не соответствовали техническим требованиям.

Выдавались запросы предложений на новом языке программирования и четыре подрядчиков были наняты , чтобы разработать свои предложения под названиями Red ( Intermetrics под руководством Бенджамина Brosgol), зеленый ( CII Honeywell Bull , во главе с Ишбиа ), Blue ( SOFTECH , во главе с Джон Goodenough) и желтый ( SRI International , во главе с Джеем Spitzen). В апреле 1978 года, после того, как общественности, красный и зеленый предложения прошли к следующему этапу. В мае 1979 года Грин предложение, разработанное Ишбиа в CII Honeywell Bull, было выбрано и получило имя Ад-после Августа Ада, графиня Лавлейс . Это предложение зависит от языка программирования LIS , которые развитые Ichbiah и его группы в 1970 - х годах. Предварительное Ada справочное руководство было опубликовано в ACM SIGPLAN извещений в июне 1979 г. Справочное руководство по военному стандарту был утвержден 10 декабря 1980 года ( Ада Лавлейс день рождения «s), и учитывая количество MIL-STD-1815 в честь рождения Ады Лавлейс год. В 1981 году Хоар воспользовался своей премии Тьюринга речи критиковать Аду за то , что слишком сложным и , следовательно , ненадежной, но впоследствии , казалось, отречься в предисловии он писал для учебника Ada.

Ада привлекает большое внимание со стороны сообщества программистов в целом в течение первых дней. Его сторонники и другие предсказывали , что это может стать доминирующим языком программирования общего назначения , а не только обороны , связанными с работой. Ichbiah публично заявила , что в течение десяти лет, только остался бы два языка программирования, Ada и Lisp . Ранние компиляторы Ada изо всех сил , чтобы реализовать большой, сложный язык, и как во время компиляции и время выполнения производительность имели тенденцию быть медленным и инструменты примитивно. Производители компиляторов израсходованы большая частью своих усилий при прохождении массивную языка соответствие-тестирование, правительство требуется аттестационный пакет «ACVC» , который был необходим в другой новой особенности усилий Ada языка. Жаргон Файл , словарь компьютерного хакера жаргона происходящего в 1975-1983, отмечает в записи на Ada , что «это именно то , что можно было бы ожидать , учитывая , что вид одобрения приказном, разработанный комитетом ... трудно использовать, и общий катастрофический, несколько миллиардов долларов ... бесполезный труд Ад Лавлейс ... почти наверняка бланшируют при использовании ее имя было недавно поставленным, добрейшей вещь , что было сказано о нем , что, вероятно, хорошем маленьком язык кричать , чтобы выйти из внутри своего обширного, {} слоновьей навалом.»

Первым подтверждена реализация Ада была переводчиком NYU Ada / Ed, сертифицированный по 11 апреля 1983 г. Нью - Йоркский университет Ada / Ed реализуется в высоком уровне множества языков Setl . Ряд коммерческих компаний стали предлагать компиляторы Ada и связанные с ними инструменты разработки, в том числе ALSYS , Telesoft , DDC-I , Advanced вычислительной техники , шотландка Laboratories , TLD Systems , Verdix и другие.

Августа Ада Кинг , графиня Лавлейс.

В 1991 году Министерство обороны США начали требовать использования Ада ( мандат Ada ) для всего программного обеспечения, хотя исключения из этого правила часто само собой разумеющееся. Департамент обороны Ada мандат был эффективно удален в 1997 году, как DoD начал принимать COTS технологии. Аналогичные требования существуют и в других натовских стран: Ada требуется для систем НАТО с участием командования и управления и другие функции, и Ада была уполномочена или предпочтительный язык для связанных с обороной применения в таких странах, как Швеция, Германия и Канада.

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

Из - за Ады безопасности критически важных функций поддержки, в настоящее время используется не только для военных целей, но и в коммерческих проектах , где ошибка программного обеспечения может иметь серьезные последствия, например, авионики и управления воздушным движением , коммерческие ракеты , такие как Ariane 4 и 5 , спутники и другие космические системы, железнодорожный транспорт и банковское дело. Например, информационная система управления самолета , то летать по проводам системы программного обеспечения в Boeing 777 , была написана в Аде. Разработано Honeywell Системы воздушного транспорта в сотрудничестве с консультантами из DDC-I , он стал , пожалуй, самым известным из любого проекта Ada, гражданского или военного. Канадская Автоматизированная система воздушного движения была написана на 1 млн строк Ada ( SLOC счет). Он показал передовую распределенную обработку, распределенную базу данных Ада и объектно-ориентированное проектирование. Ада также используется в других системах воздушного движения, например, промежуточный инструмент будущего Область управления Поддержка (iFACTS) система управления воздушным движением нового поколения в Великобритании разработан и реализован с использованием СПАРК Ада. Он также используется в французском TVM не- кабины сигнализации системы на TGV системы высокоскоростной железнодорожной, и метро пригородных поездов в Париже, Лондоне, Гонконге и Нью - Йорке.

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

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

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

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

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

Языковые конструкции

Ада является Алгол -как язык программирования с участием управляющих структур с зарезервированными словами, как если , то , иначе , в то время как , для , и так далее. Однако, Ада также имеет много структурирования данных объектов и другие абстракции , которые не были включены в первоначальном Алголе 60 , например, определения типов , записи , указатели , перечисления . Такие конструкции были частично унаследованы от или вдохновлены Pascal .

"Привет, мир!" в Ada

Типичным примером такого языка в синтаксисе является Привет мир программа : (hello.adb)

with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
  Put_Line ("Hello, world!");
end Hello;

Эта программа может быть составлена с использованием свободно распространяемого с открытым исходным кодом компилятора GNAT , выполнив

gnatmake hello.adb

Типы данных

Система типа Ады не на основе набора предопределенных примитивных типов , но позволяет пользователям объявлять свои собственные типы. Это заявление , в свою очередь , не основано на внутреннем представлении типа , но на описание цели , которая должна быть достигнута. Это позволяет компилятору , чтобы определить подходящий размер памяти для данного типа, и для проверки наличия нарушения определения типа во время компиляции и времени выполнения (т.е. нарушение диапазона, переполнение буфера, типа консистенция и т.д.). Ада поддерживает числовые типы , определенные в диапазоне, по модулю типов, агрегатные тип (записи и массивы), а также тип перечисления. Типы доступа определить ссылку на экземпляр указанного типа; нетипизированных указатели не разрешены. Специальные типы , предоставляемые на языке типов задач и охраняемые виды.

Например, дата может быть представлена ​​в виде:

type Day_type   is range    1 ..   31;
type Month_type is range    1 ..   12;
type Year_type  is range 1800 .. 2100;
type Hours is mod 24;
type Weekday is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

type Date is
   record
     Day   : Day_type;
     Month : Month_type;
     Year  : Year_type;
   end record;

Типы могут быть уточнены путем объявления подтипов:

subtype Working_Hours is Hours range 0 .. 12;            -- at most 12 Hours to work a day
subtype Working_Day is Weekday range Monday .. Friday;   -- Days to work

Work_Load: constant array(Working_Day) of Working_Hours  -- implicit type declaration
   := (Friday => 6, Monday => 4, others => 10);           -- lookup table for working hours with initialization

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

Управляющие структуры

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

-- while a is not equal to b, loop.
while a /= b loop
  Ada.Text_IO.Put_Line ("Waiting");
end loop;

if a > b then
  Ada.Text_IO.Put_Line ("Condition met");
else
  Ada.Text_IO.Put_Line ("Condition not met");
end if;

for i in 1 .. 10 loop
  Ada.Text_IO.Put ("Iteration: ");
  Ada.Text_IO.Put (i);
  Ada.Text_IO.Put_Line;
end loop;

loop
  a := a + 1;
  exit when a = 10;
end loop;

case i is
  when 0 => Ada.Text_IO.Put ("zero");
  when 1 => Ada.Text_IO.Put ("one");
  when 2 => Ada.Text_IO.Put ("two");
  -- case statements have to cover all possible cases:
  when others => Ada.Text_IO.Put ("none of the above");
end case;

for aWeekday in Weekday'Range loop               -- loop over an enumeration
   Put_Line ( Weekday'Image(aWeekday) );         -- output string representation of an enumeration
   if aWeekday in Working_Day then               -- check of a subtype of an enumeration
      Put_Line ( " to work for " &
               Working_Hours'Image (Work_Load(aWeekday)) ); -- access into a lookup table
   end if;
end loop;

Пакеты, процедуры и функции

Среди частей программы Ада являются пакеты, процедуры и функции.

Пример: спецификация пакета (example.ads)

package Example is
     type Number is range 1 .. 11;
     procedure Print_and_Increment (j: in out Number);
end Example;

Тело пакета (example.adb)

with Ada.Text_IO;
package body Example is

  i : Number := Number'First;

  procedure Print_and_Increment (j: in out Number) is

    function Next (k: in Number) return Number is
    begin
      return k + 1;
    end Next;

  begin
    Ada.Text_IO.Put_Line ( "The total is: " & Number'Image(j) );
    j := Next (j);
  end Print_and_Increment;

-- package initialization executed when the package is elaborated
begin
  while i < Number'Last loop
    Print_and_Increment (i);
  end loop;
end Example;

Эта программа может быть составлена, например, с использованием свободно распространяемого с открытым исходным кодом компилятора GNAT , выполнив

gnatmake -z example.adb

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

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

совпадение

Ада имеет поддержку языка для задач на основе параллелизма. Фундаментальная одновременно единица в Ada является задачей , которая является встроенным ограниченным типом. Задачи определены в двух частях - декларация задачи определяет интерфейс задачи ( по аналогии с описанием типа), тело задачи определяет выполнение задачи. В зависимости от реализации, задачи Ada либо отображаются в операционной системе потоков или процессов, или планируется внутренне выполнения Ada.

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

Ада также предлагает защищенные объекты для взаимного исключения . Защищенные объекты являются монитор, как конструкция, но и использовать защитные вместо условных переменных для сигнализации (аналогично условных критических областей). Охраняемые объекты сочетают инкапсуляцию данных и безопасное взаимное исключение из мониторов, а также въездные охранник из условных критических областей. Главное преимущество по сравнению с классическими мониторами является то , что условные переменные не требуется для передачи сигналов, избегая потенциальные тупики из - за неправильную запирающих семантику. Как и задачи, защищаемый объект является встроенным ограниченным типом, и он также имеет декларацию часть и тело.

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

Защищенные данные объекта аналогичны процедурам, но дополнительно имеют охрану . Если охранник оценивается как ложное, задача вызова блокируется , и добавляется в очередь этой записи; Теперь другая задача может быть допущен к защищаемому объекту, так как ни одна из задач не выполняется в данный момент внутри защищаемого объекта. Охранники переоценены всякий раз , когда задача выходит из охраняемого объекта, так как это единственный раз , когда оценка охранников может быть изменена.

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

Выберите оператор в Ada может быть использован для реализации неблокируемых вызовов входа и принимает, недетерминирован выбор записей (также с охраной), время ожидания и прерывает.

Следующий пример иллюстрирует некоторые концепции параллельного программирования в Ada.

with Ada.Text_IO; use Ada.Text_IO;

procedure Traffic is

   type Airplane_ID is range 1..10;             -- 10 airplanes

   task type Airplane (ID: Airplane_ID);        -- task representing airplanes, with ID as initialisation parameter
   type Airplane_Access is access Airplane;     -- reference type to Airplane

   protected type Runway is                     -- the shared runway (protected to allow concurrent access)
      entry Assign_Aircraft (ID: Airplane_ID);  -- all entries are guaranteed mutually exclusive
      entry Cleared_Runway (ID: Airplane_ID);
      entry Wait_For_Clear;
   private
      Clear: Boolean := True;                   -- protected private data - generally more than just a flag...
   end Runway;
   type Runway_Access is access all Runway;

   -- the air traffic controller task takes requests for takeoff and landing
   task type Controller (My_Runway: Runway_Access) is
      -- task entries for synchronous message passing
      entry Request_Takeoff (ID: in Airplane_ID; Takeoff: out Runway_Access);
      entry Request_Approach(ID: in Airplane_ID; Approach: out Runway_Access);
   end Controller;

   --  allocation of instances
   Runway1    : aliased Runway;              -- instantiate a runway
   Controller1: Controller (Runway1'Access); -- and a controller to manage it

   ------ the implementations of the above types ------
   protected body Runway is
      entry Assign_Aircraft (ID: Airplane_ID)
 when Clear is   -- the entry guard - calling tasks are blocked until the condition is true
      begin
       Clear := False;
       Put_Line (Airplane_ID'Image (ID) & " on runway ");
      end;

      entry Cleared_Runway (ID: Airplane_ID)
 when not Clear is
      begin
         Clear := True;
         Put_Line (Airplane_ID'Image (ID) & " cleared runway ");
      end;

      entry Wait_For_Clear
 when Clear is
      begin
         null;      -- no need to do anything here - a task can only enter if "Clear" is true
      end;
   end Runway;

   task body Controller is
   begin
      loop
         My_Runway.Wait_For_Clear;   -- wait until runway is available (blocking call)
         select                      -- wait for two types of requests (whichever is runnable first)
            when Request_Approach'count = 0 =>  -- guard statement - only accept if there are no tasks queuing on Request_Approach
             accept Request_Takeoff (ID: in Airplane_ID; Takeoff: out Runway_Access)
             do                                 -- start of synchronized part
               My_Runway.Assign_Aircraft (ID);  -- reserve runway (potentially blocking call if protected object busy or entry guard false)
               Takeoff := My_Runway;            -- assign "out" parameter value to tell airplane which runway
             end Request_Takeoff;               -- end of the synchronised part
         or
            accept Request_Approach (ID: in Airplane_ID; Approach: out Runway_Access) do
               My_Runway.Assign_Aircraft (ID);
               Approach := My_Runway;
            end Request_Approach;
         or                          -- terminate if no tasks left who could call
            terminate;
         end select;
      end loop;
   end;

   task body Airplane is
      Rwy : Runway_Access;
   begin
      Controller1.Request_Takeoff (ID, Rwy); -- This call blocks until Controller task accepts and completes the accept block
      Put_Line (Airplane_ID'Image (ID) & "  taking off...");
      delay 2.0;
      Rwy.Cleared_Runway (ID);               -- call will not block as "Clear" in Rwy is now false and no other tasks should be inside protected object
      delay 5.0; -- fly around a bit...
      loop
         select   -- try to request a runway
            Controller1.Request_Approach (ID, Rwy); -- this is a blocking call - will run on controller reaching accept block and return on completion
            exit; -- if call returned we're clear for landing - leave select block and proceed...
         or
            delay 3.0;  -- timeout - if no answer in 3 seconds, do something else (everything in following block)
            Put_Line (Airplane_ID'Image (ID) & "   in holding pattern");  -- simply print a message
         end select;
      end loop;
      delay 4.0;  -- do landing approach...
      Put_Line (Airplane_ID'Image (ID) & "            touched down!");
      Rwy.Cleared_Runway (ID);  -- notify runway that we're done here.
   end;

   New_Airplane: Airplane_Access;

begin
   for I in Airplane_ID'Range loop  -- create a few airplane tasks
      New_Airplane := new Airplane (I); -- will start running directly after creation
      delay 4.0;
   end loop;
end Traffic;

Прагмы

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

Примеры общего использования компилятора прагм будут отключать определенные функции, такие как проверка типов времени выполнения или индекс массива проверка граничной, или поручить компилятор, чтобы вставить код объекта вместо вызова функции (в C / C ++ делает с инлайн функции).

Смотрите также

  • APSE - спецификация для среды программирования для поддержки разработки программного обеспечения в Ada
  • Ravenscar профиль - это подмножество функций Ada многозадачных , предназначенных для обеспечения безопасности критически важных жесткого реального времени вычислений
  • СПАРК (язык программирования) - язык программирования , состоящий из весьма ограниченного подмножества Ada, аннотированные с мета - информацией , описывающей желаемое поведение компонента и индивидуальных требований во время выполнения

Рекомендации

Международные стандарты

обоснование

(Эти документы были опубликованы в различных формах, включая печать.)

книги

  • Буча, Грейди (1987), Software Engineering с Адой , Калифорния: The Benjamin / Cummings Publishing Company, Inc., ISBN  0-8053-0604-8
  • Ян Skansholm: Ada 95 с самого начала , Addison-Wesley, ISBN  0-201-40376-5
  • Geoff Гилпин: Ada: Обзорный тур и руководство , Prentice зал, ISBN  978-0-13-004045-9
  • Джон Барнс : Программирование в Аде 2005 , Addison-Wesley, 2006, ISBN  0-321-34078-7
  • Джон Барнс: Программирование в Ada плюс Language Reference Manual , Addison-Wesley, ISBN  0-201-56539-0
  • Джон Барнс: Программирование в Ada 95 , Addison-Wesley, ISBN  0-201-34293-6
  • Джон Барнс: High Integrity Ada: искровой подход , Addison-Wesley, 1997, ISBN  0-201-17517-7
  • Джон Барнс: High Integrity Программное обеспечение: SPARK подход к обеспечению безопасности и , Addison-Wesley, 2003, ISBN  0-321-13616-0
  • Джон Beidler: Структуры данных и алгоритмы: подход объектно-ориентированного Использование Ada 95 , Springer-Verlag, 1997, ISBN  0-387-94834-1
  • Дин В. Гонсалес : Руководство Ada программиста , Benjamin-Cummings Publishing Company, 1991, ISBN  0-8053-2529-8
  • М. Бен-Ари : Ada для инженеров программного обеспечения , John Wiley & Sons, 1998, ISBN  0-471-97912-0
  • Norman Cohen: Ada в качестве второго языка , McGraw-Hill наука / инженерия / Math, ISBN  0-07-011607-5
  • Алан Бернс , Энди Wellings : Системы реального времени и Языки программирования. Ada 95, в режиме реального времени Java и в режиме реального времени POSIX. , Addison-Wesley, ISBN  0-201-72988-1
  • Алан Бернс , Энди Wellings : Параллелизм в Аде , Cambridge University Press, 1995, ISBN  0-521-62911-X
  • Колин Аткинсон: объектно-ориентированный Многократный, параллелизм и распределение: Ada-ориентированный подход , Addison-Wesley, ISBN  0-201-56527-7
  • Гради Буч , Дуг Брайан: Software Engineering с Адой , Addison-Wesley, ISBN  0-8053-0608-0
  • Сделай Хотя Джонс: Ada в действии: практические примеры программирования , John Wiley & Sons Inc, ISBN  0-471-60708-8
  • Даниэль Стаббс, Нил У. Webre: Структуры данных с типами данных Аннотации и Ada , Брукс Коул, ISBN  0-534-14448-9
  • Паскаль Ledru: распределенное программирование на Аде с защитой объектов , Dissertation.com, ISBN  1-58112-034-6
  • Fintan Culwin: Ад, Развивающая подход , Prentice Hall, ISBN  0-13-264680-3
  • Джон английский, Fintan Culwin: Ada 95 Ремесло объектно - ориентированного программирования , Prentice Hall, ISBN  0-13-230350-7
  • Дэвид Р. Массер, Александр Степанов : Ад Generic Library: Пакеты Linear Список обработка , Springer-Verlag, ISBN  0-387-97133-5
  • Майкл Б. Фельдман: Программное обеспечение Строительство и структуры данных с Ada 95 , Addison-Wesley, ISBN  0-201-88795-9
  • Саймон Джонстон : Ада 95 для C ++ и C Программисты , Addison-Wesley, ISBN  0-201-40363-3
  • " Ад:. Решение проблем и разработка программ " Фельдман, Michael B. & Коффман, Эллиот Б., ISBN  0-201-52279-9 . Addison-Wesley Publishing Company; 1992 и 1993. 795 страниц.
  • Майкл Б. Фельдман, Эллиот Б. Коффман : Ada 95 , Addison-Wesley, ISBN  0-201-36123-X
  • Нелл Б. Дейл , Чип Weems, Джон Маккормик: Программирование и решение проблем с Ada 95 , Jones & Bartlett Publishers, ISBN  0-7637-0293-5
  • Нелл Б. Дейл, Джон Маккормик: Структуры Ada Plus данных: объектно-ориентированный подход, второе издание , Jones & Bartlett Publishers, ISBN  0-7637-3794-1
  • Брюс С. Крелл: Разработка С Ada: Life-Cycle методы , Bantam Dell Pub Group, ISBN  0-553-09102-6
  • Джуди Бишоп: Распределенные Ada: события и опыт , Cambridge University Press, ISBN  0-521-39251-9
  • Bo Sanden: Программное обеспечение системы Строительство с примерами в Ada , Prentice Hall, ISBN  0-13-030834-X
  • Брюс Hillam: Введение в абстрактные типы данных с использованием Ada , Prentice Hall, ISBN  0-13-045949-6
  • Дэвид Радд: Введение в программное обеспечение проектирования и разработки с Адой , Брукс Коул, ISBN  0-314-02829-3
  • Ian C. Пайл: Разработка систем безопасности: Руководство Использование Ada , Prentice Hall, ISBN  0-13-204298-3
  • Луис Бейкер: Искусственный интеллект с Адой , McGraw-Hill, ISBN  0-07-003350-1
  • Алан Бернс , Энди Wellings : HRT-HOOD: Структурный метод Дизайн для жесткого реального времени Ada Systems , North-Holland, ISBN  0-444-82164-3
  • Уолтер Савич, Чарльз Петерсон: Ад: Введение в искусство и науку программирования , Benjamin-Cummings Publishing Company, ISBN  0-8053-7070-6
  • Марк Аллен Вайс: Структуры данных и анализ алгоритма в Аде , Benjamin-Cummings Publishing Company, ISBN  0-8053-9055-3
  • Генри Ledgard: ADA: Введение (второе издание), Springer-Verlag, ISBN  0-387-90814-5
  • Дайнс Бьорнер; Оле Н. Oest (ред.): На пути к формальному описанию Ada , London: Springer-Verlag, 1980. ISBN  3-540-10283-3

архив

  • Ада Язык программирования Материалы, 1981-1990 . Чарльз Бэббидж институт , Университет Миннесоты. Включает в себя литературу по программным продуктам , предназначенных для языка Ada; Публикации правительства США, в том числе отчетов Ada 9X проектов, технических отчетов, рабочих документов, информационных бюллетеней; и информация о группе пользователей.

внешняя ссылка