Опубликован: 23.10.2005 | Доступ: свободный | Студентов: 4089 / 201 | Оценка: 4.44 / 4.19 | Длительность: 33:04:00
Специальности: Программист
Лекция 15:

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

Задачи

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

Синтаксически, задачи имеют много общего с пакетами. Главное различие в том, что задача - это не просто единица модульности, но и представление процесса, выполняемого параллельно с другими процессами. Поэтому подобно классу (и в отличие от пакета) задача является как синтаксической так и семантической конструкцией.

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

task BUFFER_MANAGER is
    entry read (x: out G);
    entry write (x: in G);
end BUFFER_MANAGER;

(Задачи не могут быть универсальными, так что тип G должен быть глобально доступным, или родовым параметром охватывающего пакета.) Только реализация входов отличает их от процедур: команды accept, появляющиеся в теле, будут специфицировать синхронизацию и другие ограничения на выполнение записей. Здесь, например, можно предписать, чтобы только одно read или write действовало в любой момент времени, чтобы read ожидало, пока буфер не станет непустым, а write - пока он не будет неполным.

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