Качество, надежность и стандартизация
Каждый компилятор с языка Ада должен пройти процедуру аттестации, прежде чем он получит право так называться. Аттестация представляет собой официально регламентированный процесс проверки компилятора на специально разработанном наборе тестовых программ, называемых 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 можно представить в виде трех "слоев":
· KAPSE (Kernel APSE - ядро APSE): средства управления базой данных проекта и реализации минимального набора функций, необходимых для выполнения любых программ, входящих в состав APSE.
· MAPSE (Minimal 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 и космической станции Альфа.
Сегодня информационные системы стали очень доступными, однако чтобы сделать их адекватно надежными и имеющими необходимую пропускную способность в ближайшем будущем предстоит написать огромное число строк программного кода. Поэтому сегодня самое подходящее время задаться вопросом, какой язык программирования следует использовать для успешного отражения натиска волны нововведений, которая постепенно накатывается на нас.