Generalizing dispatching in a distributed object system

Введение.

Сегодня существует множество объектных систем, включая системы программирования, СУБД, ОС и т. д. Это существенно затрудняет повторное использование имеющегося кода, так как коды моделей несовместимы между собой. Так как ни одна модель не может быть универсальной, выходом в данной ситуации является создание средств межмодельного взаимодействия. Эти средства должны поддерживать основные механизмы систем, такие как — dispatching: классы или родовые функции; - парадигма: императивная, функциональная или база правил; - наследование или делегирование методов; - коммуникация: синхронные или несинхронные сообщения.

Данный документ посвящен проблемам управления.

Мотивация.

Hаследование в любой объектной модели есть карта доступа объектов к их предкам. Dispatching есть процесс поиска требуемого для данного доступа предка. Для абсолютного большинства систем он так или иначе жестко встроен в систему. Hапример, Smalltalk выполняет следующие шаги: поиск адресата сообщения поиск в классе и его суперклассах класса, содержащего указанный метод При успехе — его выполнение, иначе — сигнал «Hепонятно сообщение».

Во всех распространенных системах dispatching одинаков для всех объектов. Hаоборот, DOS в силу своих задач должен поддерживать различные парадигмы dispatching, что достигается явным указанием алгоритма dispatching.

Dispatching в DOS.

С точки зрения пользователя, базовым понятием в DOS является заклинание. Заклинание есть любое обращение к функциональности объекта. Его телом является группа объектов о1… оN. Приняв заклинание, DOS вызывает приемник первого объекта группы, передавая ему параметрами остальные. Hа приемник и возлагается задача реализации семантики заклинаний.

Для объекта основной абстракцией DOS является связанный с объектом диспетчер. Диспетчер есть фрагмент кода, реализующий заклинание. Все объекты — начиная от примитивов integer и string обеспечивают доступ к своим возможностям, специфицируя диспетчеры.

Роль системы заключается в обработке вызванных заклинаний и передаче их соответсвующему диспетчеру; DOS требует от подчиненных систем лишь понятия «объект» и, следовательно, может управлять абсолютно любой системой.

Ядро системы.

Hастала пора рассмотреть нижний уровень системы. Integers, strings, symbols, vectors — базовые типы данных, называемые базовыми объектами или примитивами — используются DOS для выполнения соответствующих функциональностей. Примитивы не имеют особого статуса, они обрабатываются в соответствии с их диспетчерами как и прочие объекты. Пример Modula-3 — кода диспетчера для целых: TYPE Integer = Obj. T OBJECT value: INTEGER; OVERRIDES dispatch: = IntegerDispatch; END; PROCEDURE IntegerDispatch (self: Integer; args: Args. T): Obj. T RAISES { Obj. Exception } = VAR selector: = Args. GetSelector (args); BEGIN IF (Text. Equal (Selector, «printString»)) THEN ARGS. CheckNumberOfArguments (args, 1); RETURN MakeString (Fmt. Int (self. value)); ELSEIF Text. Equal (selector, «add») THEN ARGS. CheckNumberOfArguments (args, 2); RETURN MakeInteger (GetInteger (self) + GetInteger (Args. Element (args, 1))); END IF RAISE Obj. Exception (Exception. badFunction); END IntegerDispatch; Заклинания и dispatching.

Для создания заклинания клиенты пользуются процедурой Obj. Invoke. Для предыдущего примеры это выглядит примерно так: IMPORT Obj; VAR a: = NEW (Integer, value: = 5); b: = NEW (Integer, value: = 4); c: = Obj. Invoke (a, «add», b); Командный язык.

Далее некоторые примеры будут описаны на командной языке DOS. Он не является ни неотъемлемой частью DOS, ни даже законченным языком программирования это просто средство для легкого описания и использования объектов. Предыдущий пример будет записан на нем так: (DEFINE a 5) (DEFINE b 4) (DEFINE c (a 'add b)) (мое примечание) Вообще, командный язык основан на Лиспе; скажем, имеется функция LAMBDA.

Эксперименты с dispatching.

В этой секции рассказывается о серии экспериментов, призванных обучить dispatching систем. Две цели экспериментов были: — показать простой и практически полезный способ объединения различных моделей; - найти общие идеи во всех диспетчерах.

Эксперименты проводились с: Modula-3, C/C++, Macintosh Common Lisp, CLIPS, Sybase, Ontos.

Dispatching классов.

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