Опубликован: 23.10.2005 | Уровень: специалист | Доступ: платный
Лекция 15:

OO-программирование и язык Ada

Аннотация: Успехи методологии программирования 70-х годов привели к появлению нового поколения языков, сочетающих управляющие структуры Algol 60 и конструкции структурирования данных Algol W и Pascal с поддержкой скрытия информации. При различии свойств эти языки близки по сути, их принято называть инкапсулирующими языками. (Они также известны как "основанные на объекте" - терминология обсуждается в следующей лекции.)
Ключевые слова: modula-2, Pascal, algol-like, oberon, CLU, MIT, Ada, универсальность, перегрузка, ПО, DOD, COBOL, Green, реализация языка, ANSI, NASA, simula, jovial, обработка исключений, программная инженерия, класс, компонент, модуль, значение, удобочитаемость, декомпозиция, операции, конфликт, время выполнения, семантика, полиморфизм, динамическое связывание, слово, интерфейс, константы, заголовки, формальный аргумент, тип сущности, natural, подтип, спецификация типа, тип массива, capacity, фактический аргумент, 'overflow', underflow, имя пакета, универсальный класс, формальный параметр, доступ, компилятор, место, стек, равенство, информация, спецификация пакета, прямой, исключительная ситуация, retry, goto, ложная тревога, вызывающая программа, слежение, эффективный механизм, единица, представление, Entry, буфер, типы задач, поддержка, тип записи, множественное наследование, compound, redefine, abstract, эффективная функция, вершина стека, figures, классификатор, единичное наследование, внутренние связи, список

Хотя инкапсулирующих языков много, относительно широко используются всего несколько из них. Пять языков заслуживают особого внимания. Язык Modula-2, наследник языка Pascal, создан Никласом Виртом в Швейцарском Федеральном Институте Технологии - автором таких языков как Algol W, собственно Pascal и (позже) Oberon. Язык CLU был разработан в MIT под руководством Барбары Лисков, хотя он и лишен наследования, но ближе всех подошел к реализации ОО-концепций. Язык Mesa, разработанный в рамках проекта Xerox, особое внимание уделял описанию межмодульных отношений больших систем. Созданный Мэри Шоу, Вильямом Вулфом и Ральфом Лондоном из Carnegie-Mellon University язык Alphard включал механизм утверждений. В изучении ОО-подходов ограничимся языком Ada, поскольку он не только привлек самое большое внимание, но является самым законченным (и самым сложным), воплощая основные черты других инкапсулирующих языков. Modula-2, например, не имеет таких возможностей, как универсальность или перегрузка.

Немного контекста

Создание языка Ada было реакцией на кризис середины 70-х годов, ощутимый для политики в области разработки ПО в Департаменте Обороны США (DoD). В отчете, предшествовашем появлению языка Ada, отмечалось, что в военной отрасли в тот момент использовалось более 450 языков программирования, многие из которых технически устарели. Все это мешало управлению подрядными работами, обучению программистов, техническому прогрессу, разработке качественного ПО и контролю цен.

Помня об успехе языка COBOL, разработанного в 50-х годах по запросу DoD, был объявлен конкурс на разработку современного языка создания ПО. Одна из заявленных целей - возможность поддержки встроенных приложений в режиме реального времени. В результате были отобраны четыре, затем - два, и, наконец, в 1979 году, после действительно справедливого отбора, победителем оказался язык Green, созданный Жаном Ичбиа (Jean D. Ichbiah) и его группой CII-Honeywell Bull. На основе опыта нескольких лет и первых промышленных реализаций язык был пересмотрен и в 1983 году был принят как стандарт ANSI.

Язык Ada (так был назван язык Green) начал новый этап в разработке языков. Никогда раньше язык не подвергался такому интенсивному испытанию перед выпуском. Никогда раньше создание языка не трактовалось как крупномасштабный инженерный проект. Лучшие эксперты многих стран в составе рабочих групп проводили недели, рассматривая предложения и делая - в те доинтернетовские дни - большое количество комментариев. Подобно языку Algol 60 в предыдущем поколении языков, Ada определил не только языковую перспективу, но и само понятие разработки языка.

Дальнейший пересмотр языка Ada привел к новой версии языка, официально называемой Ada 95, описываемой в конце данной лекции. В других частях курса название Ada без дальнейшего уточнения относится к версии Ada 83, широко используемой и сегодня.

Был ли язык Ada успешным? И да, и нет. Департамент Обороны получил то, что заказывал: благодаря строгому выполнению "поручения" язык Ada стал через несколько лет доминирующим техническим языком различных отраслей Американской военной промышленности и военных организаций некоторых других стран. Он используется в таких невоенных правительственных агентствах, как NASA и Европейское Космическое Агентство. Но, кроме некоторого проникновения в сферу обучения теории вычислительных систем - частично по инициативе Департамента Обороны, - этот язык имел лишь ограниченный успех в остальном мире ПО. Возможно, он бы распространился шире, если бы не конкуренция со стороны объектной технологии, внезапно появившейся на сцене, как раз тогда, когда язык Ada и промышленность созрели друг для друга.

По иронии судьбы разработчики языка Ada были хорошо знакомы с ОО-идеями. Хотя это не всем известно, Ичбиа создал один из первых компиляторов для Simula 67 - первого ОО-языка. Позже, когда его спрашивали, почему он не представил ОО-проект Департаменту Обороны, он объяснял, что в контексте конкуренции такой проект посчитали бы настолько далеким от основного направления, что у него не было бы шансов на победу. И он, без сомнения, прав. Действительно, до сих пор можно удивляться смелости проекта, принятого DoD. Было разумно ожидать, что процесс приведет к чему-то вроде усовершенствованной версии языка JOVIAL (языка военных приложений 60-х гг.). Но все четыре отобранных языка были основаны на языке Pascal, с его явным академическим привкусом. А Ada являлся воплощением новых смелых идей во многих областях, например, в обработке исключений, универсальности и параллелизме. Ирония состоит и в том, что язык Ada, направленный на поддержание соответствия проектов DoD прогрессу в разработках ПО, вытесняя старые подходы, в последующие годы невольно привел к задержке принятия новой (post-Ada) технологии в военном и космическом сообществе.

Уроки языка Ada остаются незаменимыми, и жаль, что многие ОО-языки 80-х и 90-х гг. не обращали большего внимания на акцент качества программной инженерии, характерный для языка Ada. Хотя в этой книге мы неоднократно будем противопоставлять решения, принятые в языке Ada, методам, принятым в объектной технологии, но эти замечания следует воспринимать не как укор, а как дань уважения к предшественнику, в сравнении с которым должны оцениваться новые методы.

Пакеты

Любой инкапсулирующий язык предлагает модульную конструкцию для группирования логически связанных программных элементов. В языке Ada она называется пакетом, модулем - в Modula-2 и Mesa, кластером - в CLU.

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

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

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

Последнее использование наиболее интересно для данного обсуждения. Оно будет изучаться на примере пакета, описывающего стеки, взятого из руководства по языку Ada.

Алексей Щербанов
Алексей Щербанов
Россия, г. Оренбург
Ксения Маковецкая
Ксения Маковецкая
Россия, Москва, МГЮА им. О.Е. Кутафина, 2014