Язык АДА

Ада Августа Байрон

(Род. 10 декабря 1815 года )

Даже граждане бывшего СССР уже знают, что 10 декабря - День прав человека, учреждённый ООН в честь принятия в 1948 году Всеобщей декларации прав человека (в советские времена само существование этой декларации замалчивалось). Общеизвестно также, что с 1901 года именно 10 декабря вручаются ежегодные Нобелевские премии в память об их учредителе Альфреде Нобеле, умершем в этот день в 1896 году. Но есть и ещё одно, менее известное, определение для этой даты, имеющее, однако, самое прямое отношение к роду занятий многих наших читателей, - 10 декабря названо Днём программиста в честь родившейся также в этот день первой представительницы этой не слишком древней профессии Ады Августы Лавлейс, единственной дочери прославленного английского поэта Джорджа Гордона Байрона и его супруги Аннабеллы Милбэнк. 



Даже граждане бывшего СССР уже знают, что 10 декабря - День прав человека, учреждённый ООН в честь принятия в 1948 году Всеобщей декларации прав человека (в советские времена само существование этой декларации замалчивалось). Общеизвестно также, что с 1901 года именно 10 декабря вручаются ежегодные Нобелевские премии в память об их учредителе Альфреде Нобеле, умершем в этот день в 1896 году. Порывшись в календарях, энциклопедиях, справочниках, а также попутешествовав по Интернету, можно обнаружить, что 10 декабря 1799 года Франция перешла на метрическую систему мер (в чём за ней до сих пор никак не могут последовать Соединённые Штаты Америки), в 1828 году был основан Санкт-Петербургский технологический институт, что в этот день родились русский поэт Николай Некрасов, американская поэтесса Эмили Диккинсон и украинская писательница Марко Вовчок, французские писатель Эжен Сю и композитор Цезарь Франк, британский фельдмаршал Харолд Александер, получивший титул "Тунисский", и советский "государственный деятель" недоброй памяти Андрей Вышинский, лауреат Нобелевской премии по литературе шведско-немецкая поэтесса Нелли Закс, клоун Карандаш, хоккейный тренер Анатолий Тарасов, дирижёр Юрий Темирканов, литературовед и философ Сергей Аверинцев и многие другие. Но есть и ещё одно, менее известное, определение для этой даты, имеющее, однако, самое прямое отношение к роду занятий

многих наших читателей, - 10 декабря названо Днём программиста в честь родившейся также в этот день первой представительницы этой не слишком древней профессии Ады Августы Лавлейс, единственной дочери прославленного английского поэта Джорджа Гордона Байрона и его супруги Аннабеллы Милбэнк.

Ада Августа Байрон родилась 10 декабря 1815 года; родители её расстались, когда девочке было два месяца, и больше своего отца она не видела. Байрон посвятил дочери несколько трогательных строк в "Паломничестве Чайльд Гарольда", но при этом в письме к своей кузине заранее беспокоился: "Надеюсь, что Бог наградит её чем угодно, но только не поэтическим даром..." Ещё менее намерена была способствовать развитию у дочери литературных наклонностей мать, которую в свете за увлечённость точными науками прозвали "принцессой параллелограммов". Ада получила прекрасное образование, в том числе и в области математики. К 1834 году относится её первое знакомство с выдающимся математиком и изобретателем Чарльзом Бэбиджем (1791-1871), создателем первой цифровой вычислительной машины с программным управлением, названной им "аналитической".

Машина Бэбиджа была задумана как чисто механическое устройство с возможным приводом от парового двигателя, но содержала ряд фундаментальных идей, характерных для современных компьютеров. В ней предусматривалась работа с адресами и кодами команд, данные вводились с помощью перфокарт. Основы программирования также были заложены Бэбиджем. Несмотря на почти сорокалетний труд своего создателя, машина так и не была достроена, опережая не только потребности, но и технические возможности своего времени. Многие из идей Бэбиджа просто не могли быть реализованы на базе механических устройств и оказались востребованы только спустя столетие, с разработкой первых электронных вычислительных машин. Понятно, что современники относились к работам Бэбиджа как к, по крайней мере, экстравагантному чудачеству. Супруга известного английского математика того времени де Моргана, под руководством которого Ада Августа изучала математику, так описывала их первый визит к Бэбиджу: "Пока часть гостей в изумлении глядела на это удивительное устройство с таким чувством, с каким, говорят, дикари первый раз видят зеркальце или слышат выстрел из ружья, мисс Байрон, совсем ещё юная, смогла понять работу машины и оценила большое достоинство изобретения". Бэбидж нашёл в Аде не только благодарную слушательницу, но и верного помощника. Он искренне привязался к девушке, бывшей почти ровесницей его рано умершей дочери.

В 1835 г. Ада Байрон вышла замуж за Уильяма, восемнадцатого лорда Кинга, ставшего впоследствии первым графом Лавлейс. (В некоторых русских публикациях с титулом семейства Лавлейс связывается слово ловелас; это ошибка: Ловелас - имя героя популярного в начале прошлого века романа Ричардсона "Кларисса Гарло", ставшее нарицательным для обозначения волокиты, соблазнителя). Муж не имел ничего против научных занятий супруги и даже поощрял её в них. Правда, высоко ценя её умственные способности, он сокрушался: "Каким отличным генералом ты могла бы стать!" Появление детей на время отвлекло Аду от занятий математикой, но в начале 1841 г. она пишет Бэбиджу: "Я надеюсь, что моя голова может оказаться полезной Вам в реализации Ваших целей и планов в течении ближайших трёх-четырёх, а может быть, и более лет".

По просьбе Бэбиджа, Ада занялась переводом очерка итальянского военного инженера Луи Фредерико Менабреа (в будущем профессора механики Туринского университета, одного из лидеров борьбы за объединение Италии, с 1867 г. - её премьер-министра и министра иностранных дел). Менабреа в 1840 г., слушая в Турине лекции Бэбиджа, подробно записал их, и в своём очерке впервые дал полное описание аналитической машины Бэбиджа и его идей программирования вычислений. Он писал: "Сам процесс вычисления осуществляется с помощью алгебраических формул, записанных на перфорированных картах, аналогичных тем, что используются в ткацких станках Жаккара. Вся умственная работа сводится к написанию формул, пригодных для вычислений, производимых машиной, и неких простых указаний, в какой последовательности эти вычисления должны производиться".

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

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



Книга Менабреа с комментариями, подписанными инициалами A. A. L. (Ada Augusta Lovelace), вышла в свет в августе 1843 года. Отдавая должное обоим авторам, Бэбидж писал: "Совокупность этих работ (Менабреа и Лавлейс) представляет для тех, кто способен следовать ходу их рассуждений, наглядную демонстрацию того, что практически любые операции математического анализа могут быть выполнены с помощью машины". При этом Бэбидж так до конца и не примирился с концепцией Ады, которую впоследствии Тьюринг именовал шестым постулатом противников идеи мыслящей машины: "Аналитическая машина не претендует на то, чтобы создавать что-то действительно новое. Машина может выполнять лишь то, что мы умеем ей предписать".

В комментариях Лавлейс были приведены три первые в мире вычислительные программы, составленные ею для машины Бэббиджа. Самая простая из них и наиболее подробно описанная - программа решения системы двух линейных алгебраических уравнений с двумя неизвестными. При разборе этой программы было впервые введено понятие рабочих ячеек (рабочих переменных) и использована идея последовательного изменения их содержания. От этой идеи остаётся один шаг до оператора присвоения - одной из основополагающих операций всех языков программирования, включая машинные. Вторая программа была составлена для вычисления значений тригонометрической функции с многократным повторением заданной последовательности вычислительных операций; для этой процедуры Лавлейс ввела понятие цикла - одной из фундаментальных конструкций структурного программирования. В третьей программе, предназначенной для вычисления чисел Бернулли, были уже использованы рекуррентные вложенные циклы. В своих комментариях Лавлейс высказала также великолепную догадку о том, что вычислительные операции могут выполняться не только с числами, но и с другими объектами, без чего вычислительные машины так бы и остались всего лишь мощными быстродействующими калькуляторами.

После завершения работы над переводом и комментариями Ада предложила Бэбиджу, что она будет консультировать лиц, заинтересованных в использовании вычислительных машин, дабы Бэбидж не отвлекался от основной работы по доведению своей аналитической машины. Но время для вычислительных машин ещё не пришло, толпы пользователей не спешили получить консультацию у леди Лавлейс, более того - в 1842 г. правительство Британии отказало Бэбиджу в финансовой поддержке его разработок. Бэбидж был готов на всё, чтобы раздобыть необходимые деньги. В частности, вместе с супругами Лавлейс он увлёкся идеей создания "подлинно научной, математической" системы ставок на бегах, которая давала бы верный выигрыш. Как и следовало ожидать, "система" не сработала и принесла не только разочарование, но и большие финансовые потери. Самым стойким её приверженцем оказалась графиня Лавлейс - она продолжала упорно играть, часто даже втайне от мужа и Бэбиджа, пытаясь усовершенствовать систему. На этом она потеряла почти все свои личные средства. К тому же, в начале 50-х годов её здоровье неожиданно и резко ухудшилось, и в 1852 г. Ада Лавлейс скончалась в возрасте 37 лет, как и её отец, и была похоронена рядом с ним в фамильном склепе Байронов.

Имя Ады Лавлейс воскресло из небытия в середине 1930-х годов в связи с работами английского математика Алана Тьюринга, введшего понятие логической алгоритмической структуры, получившей название машины Тьюринга, а также последующим созданием первых электронных вычислительных машин.

К концу 1970-х годов исследования, проведенные в министерстве обороны США, выявили отсутствие языка программирования высокого уровня, который бы поддерживал все основные этапы создания программного обеспечения. Применение же различных языков программирования в разных приложениях приводило к несовместимости разрабатываемых программ, дублированию разработок и другим нежелательным явлениям, включая рост стоимости программного обеспечения, многократно превышающей стоимость самой вычислительной техники. Выход из кризиса виделся в разработке единых языка программирования, среды его поддержки и методологии применения. Все три составляющие этого проекта разрабатывались очень тщательно с привлечением наиболее квалифицированных специалистов разных стран. В мае 1979 г. победителем в конкурсе разработки языков был признан язык Ада, названный в честь Ады Августы Лавлейс, и предложенный группой под руководством француза Жана Ишбиа. Прототипом этого языка явился язык программирования, названный в честь Блеза Паскаля, который еще в возрасте девятнадцати лет, в 1624 г., разработал проект "Паскалины" или, по-другому, "Паскалева колеса" - первой механической вычислительной машины. С появлением и широким распространением персональных компьютеров язык Ада во многом утратил свою значимость, однако до сих пор используется как язык высокого уровня для разработки программ, работающих в реальном масштабе времени.

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

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

В деле разработки новых языков программирования много спор- ных моментов, примером которых может служить ADA - новейшее средство программирования, разработанное Министерством обороны США и отличающееся черезвычайно большими возможностями. Язык програмирования ADA, как известно, был разработан с целью замены устаревших и все менее используемых языков, таких как COBOL и FORTRAN. Трудности заключаются в том, что цикл замены одного языка программирования другим охватывает период времени от 20 до 30 лет и не начинается до тех пор, пока мы не убедимся на деле, что ныне существующие языки больше не отвечают нашим требовани- ям. Мы можем ускорить этот процесс, начав немедленную замену устаревших языков языком ADA. При этом, когда мы придем к выводу, что ADA уже устарел, замена на него только только успеет завершиться. У нового поколения разработчиков языков программирования появилась тенденция называть разработанные ими языки именами реальных людей, а не прибегать к обычным акронимам. Так язык PASCAL получил наименование в честь первого создателя счетных машин, а язык ADA назван в честь первого программиста. ADA
Язык ADA назван в честь Августы Ады Байрон (Augusta Ada Byron), использовался практически исключительно Министерством обороны и другими правительственными органами США. Эксперты относили ADA к посредственным языкам, поскольку он сложен для изучения (правительство не всегда руководствовалось логикой). Данный язык был принят стандартом в правительственных органах США и был утверждён Министерством обороны в 1979 году.
Разновидности: Atree ADA, Janus ADA, Meridian ADA.


 В деле  разработки новых языков программирования много спор-

ных  моментов,  примером  которых  может служить ADA - новейшее

средство программирования, разработанное  Министерством обороны

США  и  отличающееся черезвычайно большими возможностями.  Язык

програмирования  ADA,  как  известно,  был  разработан  с целью

замены  устаревших  и  все менее используемых языков, таких как

COBOL и FORTRAN.



   Трудности  заключаются  в том,  что цикл замены одного языка

программирования другим охватывает период времени  от 20  до 30

лет  и  не начинается  до тех пор, пока мы не убедимся на деле,

что ныне существующие языки больше не отвечают нашим требовани-

ям.  Мы  можем  ускорить этот процесс, начав немедленную замену

устаревших  языков  языком  ADA.  При  этом,  когда мы придем к

выводу,  что  ADA  уже  устарел,  замена  на него только только

успеет завершиться.



   У  нового  поколения  разработчиков  языков программирования

появилась  тенденция  называть  разработанные ими языки именами

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

PASCAL  получил наименование  в честь первого создателя счетных

машин, а язык ADA назван в честь  первого  программиста.  Решив

назвать  свой  новый  язык  в  честь  какого-либо  человека, мы

выбрали  Чарльза  Баббиджа,  который  умер  в бедности, пытаясь

закончить  создание  первой  ЭВМ.  Новый  язык,  таким образом,

назван  в честь  первого  разработчика систем, и его разработка

проводится,  подобно  разработкам самого Баббиджа,  без опреде-

ленной  финансовой  поддержки,   что,   естественно,  несколько

тормозит работу.



   Язык  BABBAGE  основан  на  элементах  языков,  которые были

открыты после  того,  как было  завершено  создание  языка ADA.

К.А.Р.Хоор  в своей лекции,  за которую  Ассоциация по вычисли-

тельной  технике  в  1980 году  присудила  ему премию Тьюринга,

говорил о двух путях разработкт программного обеспечения.  Один

путь  заключается  в  том,  чтобы  сделать  программу настолько

простой,  что  становится  полностью очевидно отсутствие каких-

либо  недостатков.  А  другой путь состоит в том, чтобы сделать

программу  настолько  сложной,  что  это  исключало  бы  всякую

возможность каких-либо погрешностей. Разработчики языка BABBAGE

выбрали третий путь, т.е. создать язык, который содержит только

явные недостатки. Программы на BABBAGE отличаются  такой низкой

надежностью,  что  процедуры  профилактического  контроля можно

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

Это  служит  гарантией  постоянного  роста  спроса на продукцию

разработчиков на рынке сбыта в области обработки данных.



   Как  и  в  языке  PASCAL  в  языке ADA  используется принцип

"строгой печати"  с целью  избежать  появления  ошибок, которые

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

Разработчики  языка  BABBAGE   выступили   в   защиту  принципа

"надежной печати"  с тем, чтобы избежать ошибок, появляющихся в

результате  неправильного  написания слов в программе пользова-

теля.  В  последующих  версиях  языка BABBAGE  станет возможным

применение  "печати по слепому методу", что позволит удовлетво-

рить давно назревшие требования пользователей.



   Спорным вопросом,  правильность решения которого обсуждается

многими разработчиками языков программирования,  является метод

передачи   параметров   в  подфункции.  Некоторые  разработчики

выступают  в  защиту  "вызова  по имени",  другие  предпочитают

"вызов по значению". В языке BABBAGE используется новый метод -

"вызов по телефону".  Этот метод  оказался особенно эффективным

при  передачи  параметров  в  процессе  дистанционной обработки

данных.



   В  основу  языка ADA положена идея портативности. В процессе

разработки  языка  BABBAGE  разработчиками  учитывается  прежде

всего портативность аппаратуры. В конце концов, какая польза от

ЭВМ,  если  заказчик  не может постоянно иметь машину под рукой

или прграммное обеспечение оказывается непереносимым.



   Известно,  что  разработка  языка  программирования проходит

успешно,  если  она  находит  финансовую  поддержку  со стороны

правительства. Разработка  языка COBOL,  например, финансирова-

лась правительством, а языка ADA - Министерством обороны. После

долгих  переговоров  Министерство  Здравоохранения  согласилась

оказать финансовую поддержку разработчикам языка BABBAGE.



   В  языке ADA  долго не допускалось использования подъязыков.

В основу языка BABBAGE,  для  увеличения  его гибкости положена

возможность  расширения  языка.  Каждый  пользователь  может  и

должен  сам  определить  размер  своей  версии языка программы.

Спорный  вопрос  о  размере  BABBAGE  отпадает,  так как каждый

пользователь  сам  определяет размер языка в соответствии с его

требованиями. BABBAGE, таким образом, является идеальным языком

для  генерации  версии  компилятора  в каждом отдельном случае.

Ниже   приведены   примеры,   которые   могут   дать  некоторое

представление о языке BABBAGE.



   В  структурных  языках  программирования  запрещалась замена

операторов  передачи  управления  GOTO  и многоходовых условных

переходов  более  простой  структурой  IF-THEN-ELSE.   В  языке

BABBAGE  имеется несколько новых операторов условного перехода,

которые выполняют  роль  конечных  термов в структуре программы

пользователя:



WHAT IF (что если)

      используется  в языках программирования; переход выполня-

      ется перед проверкой контролируемого условия;



OR ELSE (иначе)

      наличие варианта,  как,  например, в фразе "Прибавить эти

      два числа, OR ELSE (или иначе)";



WHY NOT? (почему нет?)

      выполняет код который следует в безразлично каком порядке;



WHO ELSE? (кто еще?)

      используется для опроса во время операций ввода/вывода;



ELSEWHERE (где-то в другом месте)

      используется  для  того,  чтобы  указать,  что  программа

      пользователя находится где-то в другом месте,  тогда  как

      он полагает, что она здесь;



GOING GOING GONE (иду иду ушел)

      используется для записи неструктурных программ; выполняет

      произвольный переход к другой части программы пользовате-

      ля; выполняет работу 10-ти операторов GOTO.



   В  течении  многих лет в языках использовались операторы FOR

(в течении),  DO UNTIL  (выполнять до тех пор, пока),  DO WHILE

(выполнять в то время, как) и др. для обозначения цикла (LOOP).

Исследуя это направление, разработчики языка BABBAGE предлогают

нижеуказанные операторы, обозначающие цикл программы:



DON'N DO WHILE NOT (не выполнять несмотря на)

      этот цикл не выполняется,  если контролируемое условие не

      является ложным (или если это полдень в Пятницу);



DIDN'T DO (не выполнялось)

      цикл   выполняется   один  раз  и  прекращает  дальнейшее

      выполнение каких-либо циклов;



CAN'T DO (невозможно делать)

      выполнение цикла не может продолжаться;



WON'T DO (отказ выполнять)

      центральный  процессор  приостанавливает  выполнение про-

      граммы,  так как обнаруживает погрешности в коде выполня-

      емого  цикла  программы;  выполнение программы может быть

      возобновлено,  если  на  пульте  будет  набрано  "May I?"

      ("Можно мне?");



WIGHT DO (можно не выполнять)

      зависит  от того  какое решение будет принято центральным

      процессором;  выполнение,  если  CPU  находится в рабочем

      состоянии; прекращение выполнения,  если  CPU в состоянии

      останова, или если CPU в состоянии останова по ошибке;



DO ONTO OTHERS (во всем,  как хотите,  чтобы  поступали с вами,

      так поступайте и вы с другими)

      используется  при  записи основного цикла систем, работа-

      ющих в режиме разделения времени,  с целью  использования

      в этих  системах единого способа реализации взаимоотноше-

      ний между отдельными пользователями;



DO BACH (изобразить Баха)

      используется  для  записи  временных  циклов  для музыки,

      генерируемой с помощью ЭВМ (определение нужного ритма).



   В  каждом  структурном  языке,  отвечающем  самым  последним

требованиям, имеется оператор CASE для реализации многоходового

ветвления. Так в языке ALGOL имеется опретор CASE с индексацией,

а в языке PASCAL оператор с идентификацией.  Т.е. в этих языках

выбор не очень велик.  В языке BABBAGE, напротив, имеется целый

ряд операторов этого класса:



JUST IN CASE (на всякмй случай)

      предназначен  для обработки запасных пояснений и вводимых

      в  последнюю   минуту  сведений;  разрешает  пользователю

      выполнять  умножение  на  ноль  с целью исправления, если

      случайно  выпонено  деление  на  ноль;  разрешается также

      выполнение   обратного  (восстанавливающего)  действия  и

      после случайного выполненитя умножения;



BRIFF CASE (случай краткой записи)

      предназначен для обеспечения краткости программы;



OPEN AND SHUT CASE (случай "открыть и закрыть")

      при использовании этого оператора никакого доказательства

      правильности не требуется;



IN ANY CASE (в любом случае)

      этот оператор всегда означает рабочее состояние;



HOPELESS CASE (безнадежный случай)

      этот оператор всегда означает нерабочее состояние;



BASKET CASE (безвыходное состояние)

      оператор действительно означает безвыходное состояние.



   Сотрудники,  входящие  в  группу  разработки  языка BABBAGE,

постоянно  работают  над новыми  особенностями языка, что будет

способствовать беспрерывному росту уровня эффективности данного

языка при его использования заказчиками. Например, разработчики

языка BABBAGE  в настоящее время  заняты работой над оператором

ALMOST EQUAL SIGN  ("почти с одинаковым знаком"),  используемым

для сравнения двух чисел с плавающей запятой. В работе над этим

новым нюансом уже удалось преодолеть значительные трудности.



   Ни  один  язык,  неважно  каким  он  является, не может быть

использован  сам  по  себе.  И  для  языка  BABBAGE  совершенно

необходима детально разхработанная операционная система.  После

нескольких попыток использовать существующие системы сотрудники

группы решили написать собственную  "виртуальную"  операционную

систему.   Любому  известна  операционная  системя  виртуальной

памяти.  Но  сотрудники  группы  по  разработке  языка  BABBAGE

сделали попытку  найти несколько иное решение,  зайдя подальше.

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

виртуального времени (VTOS). В то время как системы виртуальной

памяти  обеспечивают  виртуальные  свойства  памяти  ЭВМ,  VTOS

выполняет ту же функцию по отношению ко времени процессора.



   В результате  ЭВМ может одновременно работать с неограничен-

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

которая  физическм  хранит  часть  данных  в ЗУ на дисках, VTOS

должна также применять некоторые ухищрения для достижения своей

цели. Хотя пользователь уверен, что все его задания выполняются

в  текущий момент времени, некоторые из этих заданий в действи-

тельности будут выполняться на следующей неделе.



   Как  можно видеть,  язык BABBAGE  все еще находится в стадии

разработки.  Группа  сотрудников  по  разработке  языка BABBAGE

нуждается  в  предложениях  специалистов по новым средствам для

этого  нового  мощного  языка  программирования.  Автор статьи,

являясь  одним из сотрудников группы разработки,  обращается ко

всем,  кто  работает  в области обработки данных с помощью ЭВМ,

с  просьбой  оказать поддержку группе в разработке нового языка

программирования  (будут  приняты  все предложения от всех лиц,

желающих принять участие в работе группы).



Краткое введение в язык Ада

Eric DeArment, Team Ada 
ejd@efn.org

Возможно, у вас уже возник вопрос: "Зачем знать и использовать Аду?". В ответ на этот вопрос Я могу привести как минимум три хороших причины: 

	Это просто! Я запомнил программу типа "Hello World" за несколько минут. 

	Это мощно! Ада была разработана таким способом, чтобы обеспечить все запросы программиста и пригодна для решения практически любых задач. 

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

Предыстория Ады

В далеком 1957, ученый Джон Бэкас (John Backus) работавший в то время в IBM разработал новый язык программирования, с целью облегчить решение математических и научных проблем для инженеров, ученых и математиков. Этот язык называный FORTRAN, что является сокращением слов FORmula TRANslation (трансляция формул), имел и имеет огромный успех; даже в настоящее время, спустя cорок лет, он все так же активно используется в разработке программ и продолжает развиватся. 

По другую же сторону Атлантики, в Европе, несколько ученых, которые знали о существовании Фортрана сформировали комитет для создания собственного языка способного заменить его. Спустя всего лишь месяц, в 1958 году, была завершена разработка нового языка программирования известного теперь под именем ALGOL, что является сокращением от слов ALGOrithmic Language (язык алгоритмов). Вслед за этим он был очень быстро стандартизован. 

Так как существует традиция называть стандарт языка по году в который он был создан, то и создатели Алгола решили от нее не отходить назвав его Алгол 58. Впоследствии люди со всей Европы продолжили работу над Алголом, и спустя два года появился новый улучшенный вариант — Алгол 60. 

Алгол 60 съиграл очень важную роль в истории нескольких языков используемых в настоящее время, в число которых входит Ада. Из Алгола 60 впоследствии вышли три семейства языков: 

	SIMULA, созданный учеными из университета города Осло в Норвегии. 

	CPL, созданного Кеном Томпсоном (Ken Thompson) из AT&T Bell Laboratories как инструмента для написания ОС MULTICS, которая стала предшественницей Unix. CPL также является непосредственным предком С. 

	Последним, что вовсе не значит худшим, был Паскаль, написаный Никлаусом Виртом (Niklaus Wirth) из Швейцарского Федерального Института Технологий в Цюрихе с целью обучения студентов в колледже. Из которого в последствии мы и получили Аду. 

Итак, теперь мы знаем достаточно о предшественниках Ады, потому приступим к непосредственной истории создания этого прекрасного языка. 

Конкурс

В 60е-70е годы Министерство Обороны США (the United States Department of Defense) использовало для своих нужд более чем 2000 различных языков программирования (в основном для систем повышенной надежности). По большей части это были языки разработаные для выполнения какого-то конкретного задания. В результате Министерством Обороны была сформирована Рабочая Группа по Языкам Высокого Уровня (High-Order Language Working Group (HOLWG)), целью которой было найти решение создавшемуся в то время, так назваемому, "кризису программного обеспечения" 

Члены Рабочей Группы постановили, что для выхода из создавшейся ситуации необходимо создание языка программирования, с помощью которого можно будет сделать практически все, будь то системное программирование, искусственный интеллект, и, что наиболее важно, системы работающие в реальном времени и встроенные системы. Системы реального времени это программы используемые для таких вещей как управление светофорами на дорогах, самонаводящихся ракет, и сканнеров штрих-кодов. Встроенными же называются системы такие как маленькие компьютеры встраеваемые в большинство современных машин, самолеты, и даже магнитофоны. 

Вместо того чтобы создавать новый язык самим, было решено провести конкурс. Было образовано несколько команд, каждой из них был присвоен свой цвет. По случайному стечению обстоятельств все команды создали свои язык использовав Паскаль в качестве основы. В результате победила зеленая команда -- фирма Ханейвелл-Балл (Honeywell-Bull) из Франции. Познее, язык был назван "Ада" в честь леди Ады Августы Лавлейс (Lady Ada Augusta Lovelace), дочери известного поэта Байрона и ассистентки математика Чарльза Байбиджа (Charles Babbage), который изобрел Аналитическую Машину. Леди Аду принято считать первым программистом. 

В 1979, МО США создало первый черновой вариант документации по Аде, затем язык был стандартизован в 1983 году. Сейчас этот стандарт принято называть "Ада83", первоначально он находился под полным контролем со стороны МО США, и ни кто не мог создать компилятор с языка без авторизации оного со стороны Министерства Обороны. 

Однако все изменилось в 1987 году, когда МО США предоставило Аду в публичное распоряжение, и на язык был создан стандарт Международного Института по Стандартизации (International Standards Organization (ISO)). К 1990 году появилось более 200 проверенных на соответсвие стандарту компиляторов с этого языка, еще познее в 1995 году появился новый стандарт назваемый Ада95. Ада в редакции 95го года стала полностью объектно-ориетированым языком, а также оснащена очень удобными средствами взаимодействия с кодом написаным на Си, Фортране, Коболе и прочих языках. 

Где взять Аду?

Скорее всего вы думаете, что компилятор для такого мощного как Ада языка стоит очень и очень дорого, однако вы заблуждаетесь, вы наверное удивитесь, но один из наиболее мощных и популярных компиляторов с Ады95, GNAT (Gnu/New york University Ada Translator) не будет стоить вам ни копейки (за исключением технической поддержки, но только в том случае если вы захотите ее иметь). 

GNAT можно скачать с FTP-сервера Нью-Йоркского Университета ftp://cs.nyu.edu из каталога /pub/gnat. В нем содержатся различные версии GNAT'а для различных ОС например Unix, включая SunOS/Solaris, Linux, NetBSD, SGI IRIX, IBM's AIX, DEC's Digital Unix. 

Так же там существуют версии GNAT'a для WinNT, Win95, MacOS, и даже версия для DOS называемая "EZ2Load". 

Учебник

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

Сперва Я хочу чтобы читатель узнал что же такое Ада. Так же как и ее предшествинник Паскаль и ее кузен Си, Ада это структурый язык. Другими словами, программа на Аде это организованная последовательность различных секций, в то время как в неструктурных языках таких как Бейсик, вы можете писать что угодно и где угодно. 

Также, Аде присуща своя собственная терминология, и Я далее буду использовать несколько таких слов, со значением которых вы возможно не знакомы: 

пакет (package), файл искодного кода программы в котором хранится определенный набор связанных по смыслу команд, которые делают например такие вещи как печать текста, математические вычисления, и т.д. Они в чем-то похожи на заголовки в языке Си, но не являются прямой аналогией.
(прим перев: они ближе к модулям в Турбо Паскале (хотя точнее на оборот, они слизаны с Ады) 

переменная (variable), это именованая область памяти в которой может хранится некоторое значение, например число, символ, или слово. 

предложение или инструкция (statement), команда для выполнения специфического действия. 

Все программы на Аде имеют следующую базовую структуру: 

	     with Имя_Пакета; use Имя_Пакета;

	

	     procedure Имя_Процедуры

	

	       Переменная : Некоторый_Тип_Значений;

	

	     begin

	

	       Предложение_1;

	       Предложение_2;

	

	     end Имя_Процедуры;

Имя_Процедуры часто является и именем программы.
(прим перев: В отличие от Паскале здесь нет выделенного блока begin - end, программой может считатся любая процедура библиотечного уровня (т.е. не вложеная в другую процедуру/функцию) без параметров). 

Место где написано Переменная : Некоторый_Тип_Значений является объявлением переменной. Возможно вы спросите, а что значит "Некоторый_Тип_Значений"? Это означает какого типа значения могут хранится в переменной. Другими словами, если вы хотите иметь переменную для целых чисел вам необходимо написать Variable : Integer;. Если вам нужны числа с пляавающей запятой, то Variable : Float; и т.д. 

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

Инструкция begin начинает последовательность настоящих команд программы. 

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

Предлоджение end Имя_Процедуры; завершает последовательность команд программы. Теперь Я могу сказать вам, что эта маленькая "демо" програмка была нужна, чтобы просто показать вам структуру программы, но теперь мы можем посмотреть и на настоящую рабочую программу. По традиции ей будет, можно сказать, классическая ;-) программа выводящая "Hello World", которая обычно и используется при первом знакомстве с новым языком. 

	     with Ada.Text_IO; use Ada.Text_IO;

	

	     procedure Hello_World is

	

	       -- А переменные нам здесь не нужны :)

	

	     begin

	

	       Put ("Hello world!");

	

	     end Hello_World;

Пакет "Text_IO" содержит множество функций для операций ввода/вывода;
он используется программами которым необходим вывод и получение текста.
(прим перев: как и в Си по множеству причин здесь нет "встроенных" операций для ввода/вывода, но есть стандартный пакет таких операций).
Так же Я должен заметить за чем нужно писать "Ada." перед "Text_IO". Поскольку Ада может взаимодествовать со множеством языков -- например вы можете связать со своей программой процедуры на Си или Коболе -- и может случится так что у вас будет множество библиотек с сотнями пакетов, поэтому необходимо указывать откуда их брать.
(прим перев: в Аде можно организовать набор пакетов в определенную иерархическую структуру со взаимными связями между кодом в них. В данном случает Text_IO это дочерний пакет от пакета Ada). 

Процедура (и программа в данном случае) называется "Hello_World." Предложения "with" и "use" позволяют использовать команды из них в нашей программе. Если вы хотите запустить эту программу, вы можете сохранить ее под именем hello_world.ada. Замечание: если вы используете GNAT вы должны сохранить ее как hello_world.adb. 

Поскольку эта программа не делает ничего кроме печати нескольких слов на экране, нам не потребовалось объявлять ни каких переменных, поэтому место в котором это обычно делается осталось пустым. Обратите так же внимание на двойной прочерк (--) перед "А переменные нам здесь не нужны :)". Эти прочерки говорят компилятору, что эта строка комментарий. Комментарий это строка текста программы которую компилятор проигнорирует. Поэтому если вы хотите добавить строку "А переменные нам здесь не нужны :)" в программу и затем запустить ее, вы обязаны добавить перед ней двойной прочерк, иначе компилятор подумает, что вы хотели использовать "А переменные нам здесь не нужны :)" как описание переменной, естесственно ничего не поймет и выдаст вам сообщение об ошибке. Предложение Put ("Hello world!"); служит собственно для печати текста на экране. 

Даже если вам кажется, что использование скобок усложняет дело, они все равно нужны. Вы неможете просто взять и написать "Put "Hello world!";"! 

Так же заметте, что многи имена начинаются с заглавных букв Notice also that many of the names begin with capital letters ("Text_IO" например). Это-го не требуется делать в обязательном порядке, но все же желательно делать так для удобства чтения ваших исходников. 

Следующая программа несколько сложнее предыдущей. Она спрашивает у пользователя его/ее имя и затем печатает его на экране наряду с другим текстом: 

	     with Ada.Text_IO; use Ada.Text_IO;

	

	     procedure Get_Name is

	

	       Name   : String (1..80);

	       Length : Integer;

	

	     begin

	

	       Put ("Введите ваше имя> ");

	       Get_Line (Name, Length);

	       New_Line;

	       Put ("Привет ");

	       Put (Name (1..Length));

	       Put (", Я думаю вам понравиться изучать Аду!");

	

	     end Get_Name;

Как это все работает? Мы уже знаем, что такое Text_IO, а предложение procedure Get_Name is говорит само за себя 

Переменная Name содержит имя введенное пользователем, а тип String (1..80) говорит компилятору о том, что Name это строковая переменная с длинной до 80 символов. Вторая переменная, Length, это целое число используемое для хранения действительной длинны строки введенной пользователем. 

А теперь об остальном: когда программа выполняется, она печатает "Введите ваше имя> ", а затем ждет его ввода от пользователя. после того как он введет имя и нажмет Enter программа пропускает строку (New_Line;) и печатает "Привет [имя пользователя], Я думаю вам понравиться изучать Аду!". 

Визуальное программирование на Аде?

Возможно у вас возник вопрос "А есть ли к Аде графическая среда разработки программ (IDE)?". Да, такие есть, одна из них, под названием ObjectAda, поставляется компанией Aonix, www.aonix.com (Прим. перев: Данный продукт построен в духе IDE от Microsoft для Visual С++) 

ObjectAda существует в двух вариантах как для MS Windows, так и для X-Windows (X-Windows это стандартная оконная графическая система ОС Unix.) 

Однако учтите, что это коммерческий продукт, правда он доступен для свободного скачивания в облегченном варианте и весит около 60~70Mb. 



Ada -- это доведенный до логического завершения ( на данном этапе развития _науки_ программирования ) Pascal. Ada -- универсальный язык программирования и мощнейшее средство для software engineering. В равной степени пригодна для написания "зубочисток" из 50 строк на один-два прогона и для огромных особо надежных систем реального времени. Жестко определена стандартом языка. В язык встроены средства параллельного программирования, поддержка разноязыковых модулей, обработка исключительный ситуаций. Разговоры о ее чрезмерной сложности -- бред, вызванный тем, что она опередила свое время лет этак 6..10. Мощный инструмент не может быть простым -- "Дубли у нас простые" ( (с) "Понедельник...", Стругацкие ), но и слишком уж сложной я ее назвать не могу. Ada'е присущи строгость, логичность, ортогональность, симметричность. Она по-хорошему консервативна, несмотря на то, что в нее были введены революционные концепции, не понятые и не принятые серыми fortran-кодерами начала '80-ых годов, чем и объясняется ее сравнительно малое распространение. Первый стандарт вышел в '83, в '95 вышел второй стандарт, расширивший и симметризовавший язык. Для Ada'ы характерно очень жесткое следование стандарту, что делает программы на ней сравнительно легко переносимыми с платформы на платформу. !) Аналогии: Ada -- это Парфенон среди языков программирования, она величественна, изящна, строга и прекрасна. Если считать, что Pascal это МиГ-21, то Modula-2 это ( ранние версии ) МиГ-29 и ( нынешнее состояние ) МиГ-33, а Ada'83 -- Су-27, и Ada'95 -- Су-37, и, продолжая аналогию, C -- F-104, C++ -- F-117 ( much noise about nothing |) ). > Q 2: А чем Ada95 отличается от Ada83? Насколько я понял, > Q 2: в Ada95 есть ООП? Вот еще отличия: - иерархические библиотеки (child units); - пассивные мониторы наряду (protected records) с активными (tasks); - дополнительные средства управления паралеллизмом (асинхронная передача управления); - стандартные библиотеки для важнейших областей (системное программирование, системы реального времени, распределенные системы, информационные системы, численные рассчеты); - "мелочевка" типа ссылок на подпрограммы и возможность связывать сообщение с возбуждаемым исключением; > Q 3: Насколько я понял, в Ada95 есть ООП? А как оно > Q 3: реализуется? Подлинное там ООП (как на функциональных > Q 3: языках) или паскале-си подобное? "Паскале-си-подобное", хотя по форме на первый взгляд сильно отличается. 



Основной документ по Ada'е -- "Language Reference Manual", обычно называемый просто "Стандарт" или "RM95" ( "RM 95", а то и просто "RM" ), некоторые по старинке говорят "LRM", но это -- общепринятое сокращение для стандарта Ады-83. Изложено, как и положено стандарту, суховато, но строго, с примерами и ссылками на смежные вопросы. В отличие от пары-тройки других "стандартов", которые мне привелось посмотреть, это, действительно, Стандарт, а не рассуждения на тему об очередной версии компилятора и не учебник программирования на базе данного языка, но, между тем, он вполне пригоден для чтения. Второй документ -- "Ada 95 Rationale" ( обычно -- "Rationale" ). Это изложение и _обоснование_ базовых _проектных__решений_ языка (ответы на вопросы "а почему сделано именно так?") и демонстрация этих решений в деле. Соответственно, более вольное, чем Стандарт, кое в чем менее полное, а кое в чем более ппространное. С развернутыми примерами, пояснениями, аналогиями и прочей весьма полезной "белетристикой". Читается как хороший детектив. Литературные достоинства ( без тени иронии ) этого документа отмечены не только мной. Я бы настоятельно рекомедовал эту книгу в качестве именно _учебника_ для подготовленного и _мотивированного_ читателя ( такому читателю нет резона тратить время на традиционные университетские учебники ), а RM использовать как справочник. 

Язык Ада – двадцать лет спустя

Сергей Рыбин, Василий Фофанов

Если спросить отечественного ИТ-специалиста: "Что такое Ада?", большинство лишь удивленно пожмет плечами, а кто-то даже скажет, что это мертвый язык, когда-то придуманный Пентагоном, а ныне практически не используемый. На самом же деле Ада и сегодня – вполне благополучный и активно применяемый в различных областях язык программирования. Правда, большинство российских программистов знают о нем мало.

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

Несмотря ни на что, в отдельных областях техники Россия все еще "впереди планеты всей". И одна из них – конструирование и производство самолетов-амфибий. Всемирно признанным лидером в этой области является ТАНТК им. Г. М. Бериева. Недавно это предприятие приобрело средства разработки бортового программного обеспечения на базе языка Ада для использования при модернизации своей последней модели Бе-200.

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

Немного истории

Официальным днем рождения языка программирования Ада можно считать 17 февраля 1983 года – дату утверждения стандарта ANSI/MIL-STD-1815-A–1983.

Технические и административные меры, предпринятые Минобороны как часть проекта по созданию и внедрению Ады, полностью предотвратили появление и распространение диалектов языка. С 1983 года и по настоящее время все индустриальные реализации поддерживают действующий стандарт Ады. Когда же речь заходит о подмножествах Ады, то эти подмножества определяются не реализацией, а стандартами разработки конкретного класса систем.

В 1987 году стандарт ANSI без единого изменения был утвержден в качестве стандарта ISO (ISO/IEC 8652), а когда в начале 90-х годов назрела необходимость пересмотра стандарта, работа по пересмотру также была проведена под управлением и на средства Министерства обороны США. Стартовал новый международный проект, который завершился утверждением в конце 1994-го и публикацией в начале 1995 года новой версии стандарта ISO/IEC 8652. Именно этот документ и служит сегодня определением языка программирования Ада.

В СССР в начале 80-х годов была образована Рабочая группа по языку программирования Ада при Государственном комитете по науке и технике. Тщательно собиралась и анализировалась вся открытая информация о проекте, а усилиями специальных служб добывалась и закрытая информация. Были организованы проекты по реализации Ады для практически всех использовавшихся тогда архитектур ЭВМ, и некоторые из них оказались весьма успешными. Распад СССР положил конец этой деятельности. Сегодня Ада используется в России и СНГ отдельными энтузиастами.

Что такое Ада

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

Пример такой просто необходим для того, чтобы опровергнуть достаточно распространенный миф о том, что Ада – большой, сложный и "тяжелый" язык, пригодный лишь для написания сверхбольших и сверхсложных систем. На самом же деле, Ада может применяться для разработки небольших и средних программ с тем же успехом, как и современные клоны Си, Паскаля, Бейсика и Java. Так, классический пример программы "Hello, World!" выглядит на Аде следующим образом:



Легко видеть, что код на Аде похож на код на Паскале, который был выбран в качестве его прототипа. Первая строка описывает связь данного компилируемого модуля с другими модулями – указывается, что подпрограмма Hello_World должна компилироваться совместно с модулем Ada.Text_IO, который является компонентом предопределенной библиотеки.

Следующая программа определяет два асинхронных процесса [1]

:













 В разделе локальных объявлений процедуры Tasking_Example описывается задача Outputter (строка 6, строки с 8 по 17 содержат тело этой задачи). Когда управление в процессе, соответствующем процедуре Tasking_Example, доходит до строки 20, перед тем, как выполнить этот первый оператор, запускается процесс, соответствующий задаче Outputter, после чего два этих процесса живут и асинхронно выполняются независимо друг от друга. Выполнение оператора задержки (строки 14 и 20) состоит в приостановке соответствующего процесса на указанное количество секунд. Таким образом, процесс Tasking_Example приостанавливается на 20 секунд, а в это время процесс Outputter начинает печатать значения увеличивающегося на единицу счетчика, приостанавливаясь на одну секунду после вывода каждого значения. По истечении 20 секунд процесс Tasking_Example устанавливает флаг Finished в положение "истина", в результате завершается цикл в процессе Outputter. Спецификация переменной Finished как атомарного объекта данных (строка 4) делает невозможным одновременное чтение и изменение значения этой переменной.

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



Строки 1-6 содержат объявление настраиваемой функции, а строки 8-20 – ее тело. Содержательно, параметром настройки является произвольный одномерный регулярный тип с неуточненным индексным диапазоном (строка 4), про которого известно только, что тип компонента у него произвольный, однако для компонентов определена операция присваивания (строка 2), тип индекса – произвольный дискретный (строка 4). Поскольку нам предстоит покомпонентно складывать два массива, надо знать, что такое операция сложения для типа компонентов. Так как это произвольный тип, мы вынуждены передавать сложение для типа компонента как формальный параметр настройки (строка 5).

В теле функции мы первым делом проверяем, совпадают ли длины операндов (строка 12), иначе покомпонентное сложение не имеет смысла. Совпадение длин операндов не гарантирует совпадение индексных диапазонов, поэтому в цикле по индексному диапазону первого аргумента (строка 15) нам необходимо каждый раз вычислять индекс соответствующего компонента второго аргумента. Мы лишены возможности сделать это для типа Index, так как знаем про него только, что он дискретен, поэтому переходим от значения дискретного типа к его порядковому номеру (атрибут ‘Pos), вычисляем необходимый сдвиг для порядкового номера и возвращаемся к соответствующему значению типа Index (атрибут ‘Val).

Заметим, что параметры (настраиваемой) функции "+" Left и Right объявлены как имеющие тип Arr, индексный диапазон которого не уточнен. Однако Left и Right – это формальные параметры, на место которых при вызове (результата конкретизации) функции "+" будут подставлены конкретные массивы с известными индексными диапазонами. Мы же в теле функции "+" пользуемся атрибутами массивов (‘Range, ‘First, ‘Length), чтобы из объекта получить информацию о его индексном диапазоне.

Почему Ада?

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

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

Желание снизить стоимость разработки и сопровождения системы. 

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

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

Ада и Си

При проведении сравнительных анализов популярных языков переломано столько копий, что сегодня эту тему часто относят к разряду "религиозных войн". Поэтому ограничимся лишь ссылкой на известную статью [2], в которой делается ряд красноречивых выводов.

	Разработка программ на языке Ада обходится на 60% дешевле аналогичных программных проектов, реализуемых на Си. 

	Программа на языке Ада имеет в 9 раз меньше дефектов, чем программа на Си; программа на Си++ имеет еще более низкие, чем программа Си, характеристики. 

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

	Трудоемкость изучения языка Ада не выше трудоемкости изучения Си. 

	Программы на Аде более надежны, чем программы на Си. 

В качестве иллюстрации этих выводов, приведем пример разработки бортового программного обеспечения самолета C-130J в соответствии с требованиями Уровня А стандарта DO-178B [3]. При этом констатировалось качество кода, в 10 раз превышающее среднее для программного обеспечения Уровня А. Производительность труда выросла вчетверо относительно сопоставимых программных проектов.

Ада и Java

В Microsoft были вынуждены включить в лицензионные соглашения для своих операционных систем следующий пункт (www.microsoft.com/msdownload/ieplatform/ie/license.txt): "Замечание относительно поддержки языка Java... Технология Java не является устойчивой к сбоям и не предназначена... для использования в рамках управляющих систем реального времени..., в которых сбой языка Java может повлечь за собой смерть, увечье, или тяжелый урон инфраструктуре или окружающей среде. Компания Sun Microsystems, Inc. обязала компанию Microsoft разместить данное предупреждение".

Укажем также на статьи [4] и [5], демонстрирующие преимущества языка Ада над Java.

"Адские" мифы

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

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

Ада – язык, предназначенный исключительно для военных применений. Ада действительно была разработана при участии Министерства обороны США, однако отсутствуют какие-либо технические, административные или иные причины, препятствующие использованию Ады для разработки гражданских систем. Количество "гражданских" проектов, основанных на этом языке, сегодня сопоставимо с количеством "военных" проектов.

Ада – слишком большой и сложный язык, для того чтобы использовать его в небольшом проекте. Объем и сложность всех современных индустриальных языков практически одинаковы, и чтобы убедиться в этом, достаточно просто сравнить объем их описаний. Этот миф восходит к началу 80-х годов, когда Аду сопоставляли с Паскалем, Фортраном 77 или Бейсиком.

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

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

Существующие Ада-технологии неэффективны; и трансляторы, и порождаемый ими код, отличаются низкой производительностью. Этот миф также восходит к первой половине 80-х годов, когда появились первые реализации Ады, фактически всего лишь доказывавшие "теорему существования Ада-транслятора, соответствующего стандарту". Достаточно провести ряд несложных экспериментов, запрограммировав некоторую модельную задачку на Аде, Паскале и Си/Си++, и сравнив (при сопоставимых параметрах компиляторов) затем скорость компиляции, объем порождаемого кода и скорость его выполнения, чтобы убедиться, что какой-либо специфической неэффективности, свойственной Аде, просто не существует. Можно также отметить, что система программирования GNAT при объеме исходных текстов более 40 Мбайт, на 90% реализована на Аде, и построение ее из исходных текстов (в его ходе она трижды сама себя компилирует) на современном ПК занимает не более получаса.

Существующие реализации Ады крайне дороги. Это верно, однако следует иметь в виду, что существует публично доступная версия системы программирования GNAT, которая бесплатно и на совершенно законных основаниях может быть взята из программного репозитория Нью-йоркского университета (ftp://cs.nyu.edu/pub/gnat) вместе с исходными текстами

Бесплатный сыр и как избежать мышеловки

GNAT (GNu Ada Translator) – многоплатформная реализация языка Ада, существующая практически на всех современных индустриальных платформах и поддерживающая генерацию кода для популярных встроенных архитектур. GNAT (www.gnat.com) полностью реализует стандарт Ады, включая те библиотеки, которые стандартом классифицируются как необязательные. Помимо собственно Ада-транслятора, GNAT включает инструментарий, в котором следует отметить развитую интегрированную среду разработчика и многоязыковый графический отладчик, позволяющий, в том числе, исследовать поведение программ с асинхронными процессами. Транслятор и сопутствующие инструменты можно использовать как по отдельности, вызывая их из командной строки, так и в рамках интегрированной графической среды разработки Ада-программ. Все компоненты GNAT, включая среду разработки, имеют один и тот же интерфейс на всех платформах. Помимо полной реализации описываемых стандартом средств GNAT предлагает богатый набор допускаемых стандартом расширений. GNAT – реализация Ады в многоязыковой системе программирования gcc, состоящей из набора компиляторов переднего плана для различных входных языков при общем генераторе кода, что существенно упрощает разработку программ, содержащих компоненты, реализованные на различных языках программирования.

GNAT с самого начала разрабатывался и распространялся под лицензией GPL. Увы, с GPL также связана масса мифов. Так, многие считают, что программы под GPL разрабатываются неорганизованными группами энтузиастов, распространяются абсолютно бесплатно; в результате и надежность, и функциональность таких программ оставляют желать лучшего, не позволяют использовать их в сколько-нибудь серьезных проектах. В случае с GNAT это далеко не так. Для того чтобы убедиться в этом, достаточно просмотреть список компаний, заключивших с его разработчиками контракты на техническую поддержку: Boeing, British Aerospace, Lockheed, Ericsson, SAAB, Avionics и др.

Свободное предоставление демонстрационных версий – обычная практика многих разработчиков программного обеспечения. GNAT отличается тем, что находящаяся в свободном доступе публичная версия является абсолютно полной версией технологии, без каких-либо юридических или технических ограничений на ее использование. Ряд серьезных проектов был успешно реализован именно на базе публичных версий GNAT. Программное обеспечение спускаемого аппарата Beagle 2 европейской автоматической станции Mars Express, направляющейся в данный момент к Марсу (www.beagle2.com/index.htm), автоматизированная станция документальной связи Министерства обороны РФ (www.ada-ru.org/prj_doc.html). Единственным недостатком публичных версий является то, что разработчик не предоставляет для них технической поддержки.

Заключение

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

Полезные источники

Практически вся информация по языку Ада и Ада-технологиям, доступная в Сети, может быть найдена, если в качестве стартовой точки поиска использовать один из трех сайтов: www.adahome.com, www.adaic.org, www.acm.org/sigada. Недавно силами энтузиастов языка Ада был создан русскоязычный сайт www.ada-ru.org. Аннотированную библиографию книг по языку Ада, изданных на русском языке, можно найти на сайте faqs.org.ru/progr/other_l/adafaq2.htm.

Литература

	Benjamin Brosgol, Introduction to Ada 95. www.embedded.com/story/OEG20021211S0034 

	Stephen Zeigler, Comparing Development Costs of C and Ada. www.adaic.com/whyada/ada-vs-c/cada_art.html 

	P. Amey, Correctness by Construction: Better Can Also be Cheaper. CROSSTALK: Journal of Defense Software Engineering, March, 2002. 

	Ada 95 Benefits, www.act-europe.fr/texts/papers/ada95-benefits-on-the-jvm.pdf 

	A Comparison of the Concurrency and Real-Time Features of Ada 95 and Java, www.act-europe.fr/texts/papers/ada-java-concurrency-comp.pdf 

Сергей Рыбин (rybin@gnat.com) – старший научный сотрудник НИВЦ МГУ, Василий Фофанов (fofanov@act-europe.fr) – инженер-разработчик ACT Europe.

Статья опубликована в журнал "Открытые системы", #10, 2003 г. Постоянный адрес статьи: http://www.osp.ru/os/2003/10/063.htm. Перепечатывается с разрешения