Основное назначение языка программирования Ада - разработка больших программных систем реального времени для встроенных компьютерных систем. Это, конечно, не исключает его использования при решении задач вычислительного характера, параллельной обработки, системного программирования и т.д. Более того, язык Ада часто рассматривают как язык общего назначения. Основное требование к программному обеспечению для встроенных компьютеров - это надежность. Именно поэтому в язык Ада введен целый ряд средств, направленных на разработку больших, сверхбольших и одновременно надежных программных комплексов. При крупномасштабном промышленном программировании с неизбежностью возникает вопрос об окружении языка, представляющем собой набор взаимосвязанных инструментов, позволяющих получить гарантированные характеристики качества всего программного проекта. Если рассматривать язык программирования Ада вместе с его окружением, то можно говорить о "программировании в большом". При этом в качестве объектов, которыми манипулирует программист, выступают программы, модули, абстрактные типы данных и тому подобные объекты, а в качестве действий над ними - операции композиции, управления и контроля, направленные на согласованное использование объектов, определение актуальности версий, необходимости перекомпиляции последовательности модулей и т.д.
В прошедшие полтора-два десятилетия много говорилось о кризисе в области программирования. Справедливости ради, однако, следует сказать, что не все исследователи придерживаются столь пессимистической точки зрения. Высказывается мнение, что идет совершенно нормальный процесс, а проявляющиеся при этом отрицательные моменты являются обычными издержками роста. Не вдаваясь в детали различий точек зрения, можно констатировать следующее:
1. Производительность труда программистов растет очень медленно и существенно отстает от производительности аппаратуры (за последние 25 лет производительность аппаратуры возросла в несколько миллионов раз, в то время как производительность труда программистов - в 15-50 раз).
2. Надежность разрабатываемого программного обеспечения остается достаточно низкой и не удовлетворяет нуждам практики.
3. Стоимость ПО остается очень высокой, и пока не наблюдается тенденция к ее снижению.
Обычно для разработки программ наиболее широко используются такие языки программирования, как Фортран, Кобол, ПЛ/1, Паскаль и Си. Все они, однако, не обеспечивают требуемой степени машинной независимости программ в первую очередь из-за различий в операторах ввода-вывода, наличия как подмножеств, так и расширений, а также тонких различий в реализациях. Кроме того, все они являются языками общего назначения, в которых отсутствуют средства для разработки программ управления объектами и встроенным оборудованием в реальном масштабе времени. Без применения машинно-зависимых средств в этих случаях обойтись невозможно.
Экскурс в историю
Осознание сложившегося положения привело в середине 70-х годов к разработке по инициативе министерства обороны США языка программирования, который впоследствии получил название Ада в честь Августы Ады Байрон, графини Лавлейс, дочери английского поэта лорда Байрона. Она была сотрудницей Чарльза Беббиджа, изобретателя аналитической машины, и написала для этой машины программу вычисления чисел Бернули - Августа Ада по праву считается первым в мире программистом.
Итак, в начале 70-х годов МО США обратило внимание на тенденцию существенного удорожания программного обеспечения вычислительных систем военного назначения. В частности, в 1973 году стоимость ПО уже составила 46% от общих затрат министерства на вычислительную технику. Несмотря на это во многих случаях качество программ не удовлетворяло предъявляемым к ним требований. Анализ показал, что применявшиеся средства разработки имели серьезные недостатки, препятствовавшие снижению трудоемкости и повышению качества ПО. К ним в первую очередь относились:
К этому времени стали очевидны преимущества языков высокого уровня, а компиляторы начали обеспечивать высокое качество объектных программ. Это позволило использовать языки высокого уровня для разработки систем, работающих в реальном масштабе времени. Однако язык высокого уровня, удовлетворяющий требованиям встроенных систем, отсутствовал. В связи с этим в 1974 году во всех трех родах войск: армии, авиации и флоте США начались разработки такого языка для своих внутренних целей. В 1975 году было осознано, что экономически выгоднее иметь один общий язык, который был бы пригоден для программирования всех встроенных вычислительных систем МО США. В этом же году была организована Рабочая группа по языку высокого уровня и одновременно прекратилось финансирование всех других исследований в данной области.
Первым шагом в деятельности Рабочей группы была разработка требований, предъявляемых к языку программирования высокого уровня со стороны армии, авиации и флота, а также промышленности и университетов. Отметим наиболее важные общие требования:
Рабочая группа сформулировала также специальные требования, связанные с областью применения встроенных систем:
После тщательного изучения в начале 1977 года было признано, что ни один из существовавших тогда языков программирования непригоден в качестве единственного языка, но такой язык может быть создан. Экономические исследования целесообразности разработки языка на основе сформулированных требований показали, что применение единого языка даст возможность экономить сотни миллионов долларов ежегодно. Итогом деятельности Рабочей группы было принятие решения о разработке нового языка.
Язык разрабатывался в рамках международного конкурса и из семнадцати поступивших проектов для продолжения работ были отобраны четыре, а после обработки отзывов около четырехсот рецензентов из 80 организаций осталось два. Одновременно специалисты из Рабочей группы готовили требования к средствам поддержки разработок. В мае 1979 года из двух оставшихся проектов был выбран язык, получивший название Ада, разработанный группой из десяти человек под руководством Жана Ишбиа. Еще около полугода проводились испытания языка для выявления и устранения мелких недостатков. Вообще же, в работе над языком Ада в том или ином виде участвовали практически все лучшие специалисты мира в области языков программирования.
В конце 1980 года вместо Рабочей группы при МО США был создан комитет AJPO (Ada Joint Program Office) для координации всех работ, связанных с языком. В течение последующих лет этим комитетом был проведен комплекс мероприятий, направленных на недопущение появления подмножеств и расширений языка Ада. Справочное руководство по языку Ада стало сначала национальным стандартом США (ANSI/MIL-STD-1815A-1983), а затем и международным стандартом (ISO 8652:1987). Наконец, комитетом AJPO были подготовлены тесты и организована аттестация компиляторов языка Ада.
Особенности языка Ада
Естественным представляется отметить принципиальные отличия языка Ада от всех других языков программирования:
Язык Ада предназначен, прежде всего, для разработки больших программных систем реального времени для встроенных компьютеров. Это, конечно, не отрицает его использования при решении задач вычислительного характера, системного программирования, параллельной обработки и т.д. Его можно рассматривать и как язык общего назначения, но направленность на разработку встроенного программного обеспечения все-таки превалирует.
Программное обеспечение для встроенных систем должно работать быстро, обладать высокой точностью вычислений, занимать небольшую память. Но, и это самое главное, оно должно быть надежным. Одна из основных целей языка Ада как раз и заключается в повышении надежности программного обеспечения. В нем имеются средства, направленные на разработку больших программ повышенной надежности. С помощью этих средств большую программу можно разбить на небольшие легко обозримые модули, точно определить интерфейсы между ними, произвести тщательную синтаксическую проверку модулей даже в случае их раздельной компиляции, проверить актуальность модулей перед их выполнением, а также осуществлять проверку соответствия модулей в процессе их выполнения.
Сегодня достигнуты определенные успехи в разработке компиляторов и систем программирования на базе языка Ада - к началу 90-х годов было зарегистрировано около двух сотен аттестованных компиляторов, в том числе значительное количество кросс-компиляторов для бортовых компьютеров. Для вычислительных машин ведущих зарубежных фирм имеется по нескольку компиляторов. Как правило, это компиляторы второго поколения, генерирующие программы, которые выполняются быстрее, чем соответствующие программы, написанные на языках Паскаль и Си.
Язык программирования Ада обязателен к применению для разработки программ военного назначения в США и является единым языком программирования в странах-членах НАТО. В университетах и высших учебных заведениях он широко используется при преподавании информатики. В Западной Европе и Японии Ада широко используется для создания невоенного программного обеспечения. Трудно предположить, чтобы в ближайшие годы появился другой язык, обладающий столь же широкими возможностями и обеспеченный такой же мощной финансовой и организационной поддержкой: суммарные международные вклады в язык Ада и его инфраструктуру уже составляют десятки млрд. долл. Высказываются даже такие прогнозы: примерно до 2005 года продлится "эра языка программирования Ада", вслед за чем наступит "эра промышленного синтеза программ".
Качество, надежность и стандартизация
Каждый компилятор с языка Ада должен пройти процедуру аттестации, прежде чем он получит право так называться. Аттестация представляет собой официально регламентированный процесс проверки компилятора на специально разработанном наборе тестовых программ, называемых ACVS (Ada Compiler Validation Suite). На тестах проверяются как полнота, так и особенности реализации языковых средств. Имеются тесты, которые должны транслироваться, и тесты, которые должны отвергаться компилятором как неправильные. Во всех случаях определены стандартные ожидаемые результаты прогонов. По мере накопления опыта эксплуатации языка и компиляторов набор тестов совершенствуется и расширяется. Каждые полгода выпускается модифицированный набор ACVS и сегодня он содержит более трех тысяч программ - первая версия тестов содержала лишь около восьмисот программ.
Аттестация компиляторов ведется по принципу "все или ничего": либо он правильно транслирует все тесты и получает сертификат, либо он не имеет права называться компилятором с языка Ада и использоваться для работ по заказам МО США. Сертификат выдается сроком на два года, после чего должна проводиться повторная аттестация на текущей версии тестов. Такая процедура гарантирует постоянное соответствие реализации стандарту. Более того, аттестация считается действительной только для той модели ЭВМ и версии операционной системы, на которой проводились испытания. Это означает, что даже при обеспечении совместимости "снизу-вверх" для моделей данной вычислительной машины и версий ОС и сохранении полной работоспособности компилятора его нельзя использовать для выполнения работ по заказам МО США на старших моделях или на новых версиях операционной системы. Такой порядок аттестации позволяет сделать вывод о том, что, строго говоря, язык программирования Ада является единственным действительно стандартизованным языком.
В методологии программирования уже давно установлено, что разбиение на модули наиболее эффективно, когда каждый модуль можно рассматривать вне зависимости от работы других модулей. В языке Ада проводится четкая граница между интерфейсом модуля - информацией, предназначенной для использования модуля, и реализацией модуля - описанием его внутренней логики. Такое деление приводит к тому, что можно как угодно изменять логику работы отдельных модулей, если эти изменения не затрагивают их интерфейсов. На общую работоспособность программной системы это не оказывает никакого воздействия. Что касается интерфейса модуля, то в нем можно выделить два компонента: статический и динамический интерфейс. Статический интерфейс включает в себя текстуальные свойства модуля. Он явно описывается в языке и проверяется компилятором на согласованность. Динамический интерфейс включает в себя поведенческие характеристики модуля при выполнении. Его нельзя явно описать в языке и проверить с помощью компилятора. Следовательно, необходимы некоторые внеязыковые средства, которые выполняли бы такую динамическую проверку. Тем самым мы с неизбежностью приходим к тому, что при крупномасштабном промышленном программировании недостаточно иметь лишь язык (даже столь мощный как язык Ада) и компилятор с него. Необходим еще целый комплекс взаимосвязанных инструментов, позволяющих не только облегчить взаимодействие программистов с программным комплексом, но и проводить различные динамические проверки комплекса или его частей для получения гарантированных характеристик качества всего программного проекта. Естественно, что какое-то окружение необходимо для любого языка, но для языка Ада оно необходимо вдвойне. Связано это опять-таки с основным назначением языка: получать надежные программы.
Средства разработки
В процессе разработки языка программирования Ада как единого языка высокого уровня, обеспечивающего поддержку разработки программного обеспечения в течение всего жизненного цикла, выяснилось, что стандартизации только самого языка недостаточн. Оказалось необходимым иметь еще и систему поддержки разработок - окружение, на языке Ада. В связи с этим были выработаны требования к системе поддержки разработок, которая называется APSE (Ada Program Support Environment). Они включают два документа: собственно требования (STONEMAN: Requirements for the programming environment for the high order language) и проект стандарта на интерфейсы средств, используемых в составе системы поддержки (Common APSE Interface Set - CAIS) - общий набор интерфейсов системы поддержки разработок на языке Ада.
Система APSE представляет собой совокупность взаимосвязанных программных средств, обеспечивающих комплексную автоматизацию всех этапов жизненного цикла ПО, а не фрагментарную автоматизацию отдельных этапов. С функциональной точки зрения тремя основными компонентами APSE являются: база данных, интерфейсы и совокупность инструментальных средств. База данных предназначена для централизованного хранения всех данных, связанных с проектом, в течение всего жизненного цикла. Интерфейсы представляют собой совокупность унифицированных средств, обеспечивающих взаимодействие с базой данных, инструментальными средствами и пользователями. Наконец, инструментальные средства служат для разработки программ, их сопровождения, конфигурационного управления проектом и т.д.
С точки зрения структуры комплекс APSE можно представить в виде трех "слоев":
Стандарт STONEMAN устанавливает требования к любой системе программирования на базе языка Ада. В состав минимального набора инструментальных средств должны входить: компилятор; редактор текстов; редактор связей; процессор визуального вывода; генератор перекрестных ссылок; анализатор передач управления в программном комплексе; интерактивный динамический отладчик; пользовательский интерфейс; средства конфигурационного управления проектом.
Полный набор инструментальных средств должен дополнительно содержать: Ада-ориентированный редактор; развитый языковой интерфейс; средства автоматизации проектирования ПО; средства автоматизации верификации ПО; оптимизаторы и кодогенераторы для различных ЭВМ; средства учета и контроля за ходом разработки ПО; специализированные проблемно-ориентированные средства.
Стандарт CAIS обеспечивает мобильность самой системы поддержки разработок на уровне исходных текстов. Поскольку система программирования на базе языка Ада должна быть переносимой, то стандарт требует реализации программ системы на языке Ада с использованием только пакетов, описанных в стандарте CAIS.
В стандарте CAIS описан набор интерфейсов, относящихся к следующим понятиям:
1. Иерархическая среда разработки (каждый уровень соответствует пользователю или процессору). Для этой среды определяется "содержимое", атрибуты и взаимосвязи узлов, а также базовые функции, обеспечивающие санкционированный доступ к информации узлов.
2. Процессы. Описаны функции, связанные с запуском и управлением программами.
3. Ввод-вывод. Определены функции ввода-вывода на уровне файлов, базовый ввод-вывод на уровне устройств и средства связи между процессами.
4. Программы-утилиты. Определены вспомогательные функции, помогающие в работе со значениями параметров и атрибутов.
По существу в стандарте CAIS изложены результаты внешнего проектирования пакета взаимосвязанных базовых программ, используя которые, можно реализовать современную мобильную многопользовательскую диалоговую систему поддержки разработок программного обеспечения. В состав этого пакета входит большое число программ общего назначения, которые с успехом можно использовать и в прикладных системах. Ценность стандарта заключается и в том, что проектирование доведено до уровня спецификаций: он содержит около 5000 строк текста на языке Ада - спецификации и заготовки текстов 187 подпрограмм и функций, объединяемых в 19 пакетов.
Если рассматривать язык программирования Ада вместе с его окружением, то можно говорить о "программировании в большом". При этом в качестве объектов, которыми манипулирует программист, выступают программы, модули, абстрактные типы данных и тому подобные объекты, а в качестве действий над ними - операции композиции, управления и контроля, направленные на их согласованное использование, определение актуальности версий, необходимости перекомпиляции последовательности модулей и т.д. Это качественно другой шаг в программировании. Обычно рассматривается "программирование в малом", направленное на разработку отдельного модуля. Для этих целей обычно использовались так называемые языки программирования высокого уровня. С их помощью отдельные аспекты реального мира моделируются посредством структур данных и операторов, присущих конкретному языку.
Некоторые итоги
Внедрению языка Ада уделяется очень большое внимание. Считается, что его использование на всех этапах жизненного цикла ПО обеспечит повышение производительности труда программистов в четыре раза. К сегодняшнему дню осуществлен ряд разработок крупных программных систем на языке Ада: моделирования динамики полета (5.7 тыс.строк); система автоматизации испытаний ракетных и реактивных двигателей (1,5 млн.строк); управление наземным оборудованием спутниковой связи (9.9 тыс. строк); управление космической системой (30 тыс.строк); моделирование динамики и управления полетом спутников (11 тыс. строк).
Результаты анализа показали, что производительность труда программистов при работе с языком Ада составила 311-1400 строк/человеко-месяц при средней в промышленности 325-400. Средняя стоимость строки программы составила 9.92 дол. При этом отмечено увеличение относительных трудозатрат на этапе проектирования ПО (до 65% общих трудозатрат) и снижение трудозатрат на этапах реализации (до 27% общих трудозатрат), тестирования и отладки (до 8% общих трудозатрат). Для сравнения, аналогичные показатели по фирме IBM, не использующей Аду, составляют соответственно 24, 58 и 18%. Отмечено также уменьшение числа ошибок, найденных на этапе комплексирования и отладки: их среднее количество составило 1.5 - 2 на 1000 строк программного текста. По мнению ряда аналитиков, стоимость в расчете на исполняемую строку программы на языке Ада в два раза меньше, чем для языка Си. При этом при разработке требуется на 70% меньше внутренних исправлений и на 90% меньше ошибок попало к заказчику.
Заключение
Бытует мнение, что полным языком Ада будут пользоваться только суперпрограммисты, которые будут писать универсальные пакеты для последующего использования обычными программистами. Нельзя, конечно, отрицать, что это большой и сложный язык. Потребуется немало времени для овладения им. Однако с мнением об "элитарности" языка Ада нельзя безоговорочно согласиться. Он вполне постижим, его можно освоить. В России имеется достаточный опыт использования языка Ада, взять хотя разработку программного обеспечения для самолета Ил-96-300 и космической станции Альфа.
Сегодня информационные системы стали очень доступными, однако чтобы сделать их адекватно надежными и имеющими необходимую пропускную способность в ближайшем будущем предстоит написать огромное число строк программного кода. Поэтому сегодня самое подходящее время задаться вопросом, какой язык программирования следует использовать для успешного отражения натиска волны нововведений, которая постепенно накатывается на нас.