Качество, надежность и стандартизация
Каждый компилятор с языка Ада должен пройти процедуру аттестации, прежде чем он получит право так называться. Аттестация представляет собой официально регламентированный процесс проверки компилятора на специально разработанном наборе тестовых программ, называемых ACVS (Ada Compiler Validation Suite). На тестах проверяются как полнота, так и особенности реализации языковых средств. Имеются тесты, которые должны транслироваться, и тесты, которые должны отвергаться компилятором как неправильные. Во всех случаях определены стандартные ожидаемые результаты прогонов. По мере накопления опыта эксплуатации языка и компиляторов набор тестов совершенствуется и расширяется. Каждые полгода выпускается модифицированный набор ACVS и сегодня он содержит более трех тысяч программ - первая версия тестов содержала лишь около восьмисот программ.
Аттестация компиляторов ведется по принципу "все или ничего": либо он правильно транслирует все тесты и получает сертификат, либо он не имеет права называться компилятором с языка Ада и использоваться для работ по заказам МО США. Сертификат выдается сроком на два года, после чего должна проводиться повторная аттестация на текущей версии тестов. Такая процедура гарантирует постоянное соответствие реализации стандарту. Более того, аттестация считается действительной только для той модели ЭВМ и версии операционной системы, на которой проводились испытания. Это означает, что даже при обеспечении совместимости "снизу-вверх" для моделей данной вычислительной машины и версий ОС и сохранении полной работоспособности компилятора его нельзя использовать для выполнения работ по заказам МО США на старших моделях или на новых версиях операционной системы. Такой порядок аттестации позволяет сделать вывод о том, что, строго говоря, язык программирования Ада является единственным действительно стандартизованным языком.
В методологии программирования уже давно установлено, что разбиение на модули наиболее эффективно, когда каждый модуль можно рассматривать вне зависимости от работы других модулей. В языке Ада проводится четкая граница между интерфейсом модуля - информацией, предназначенной для использования модуля, и реализацией модуля - описанием его внутренней логики. Такое деление приводит к тому, что можно как угодно изменять логику работы отдельных модулей, если эти изменения не затрагивают их интерфейсов. На общую работоспособность программной системы это не оказывает никакого воздействия. Что касается интерфейса модуля, то в нем можно выделить два компонента: статический и динамический интерфейс. Статический интерфейс включает в себя текстуальные свойства модуля. Он явно описывается в языке и проверяется компилятором на согласованность. Динамический интерфейс включает в себя поведенческие характеристики модуля при выполнении. Его нельзя явно описать в языке и проверить с помощью компилятора. Следовательно, необходимы некоторые внеязыковые средства, которые выполняли бы такую динамическую проверку. Тем самым мы с неизбежностью приходим к тому, что при крупномасштабном промышленном программировании недостаточно иметь лишь язык (даже столь мощный как язык Ада) и компилятор с него. Необходим еще целый комплекс взаимосвязанных инструментов, позволяющих не только облегчить взаимодействие программистов с программным комплексом, но и проводить различные динамические проверки комплекса или его частей для получения гарантированных характеристик качества всего программного проекта. Естественно, что какое-то окружение необходимо для любого языка, но для языка Ада оно необходимо вдвойне. Связано это опять-таки с основным назначением языка: получать надежные программы.
