на тему рефераты
 
Главная | Карта сайта
на тему рефераты
РАЗДЕЛЫ

на тему рефераты
ПАРТНЕРЫ

на тему рефераты
АЛФАВИТ
... А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

на тему рефераты
ПОИСК
Введите фамилию автора:


Реферат: Объектно-ориентированная СУБД (прототип)


В целях упрощения решено отказаться от таблицы конфликтов. Таблица кон­флик­тов описывает какие операции конфликтуют между собой, т.е. может ли выпол­нять­ся операция A, если в данных момент выполняется операция B. Ячейка таблицы может принимать одно из трех значений: «Конфликтует», «Не конфликтует», «Неизвестно». Значение «Неизвестно» вводится по причине наличия механизма позднего связывания, при котором заранее не известно, конфликтуют ли операции.

Транзакции и объекты-поведения

Объекты поведения представляют собой множество объектов, поле OBJKH кото­рых хранит идентификатор выполняемого действия. Это множество имеет ширину эле­мента не 4, как обычное множество, хранящее данные, а 8. В следующих четырех бай­тах может храниться идентификатор списка – строки таблицы чередований в точках разрыва (части подсистемы транзакций). Таблица чередований образуется из точек раз­рыва и группировки спецификаций для объекта. Она позволяет определить: в каких точ­ках разрыва каких операций можно переключиться на выполнение операции, соответ­ствующей этой строке таблицы чередований. Это статическая информация, ко­торая может быть сформирована перед началом работы системы. Элемент строки та­блицы чередований состоит из 2 значений: идентификатора операции и иденти­фикатора мно­жества, хранящего номера точек разрыва.

4.3 Контекст транзакции

В системе есть объект DBIO (Database User-Intarface Object), которому известны состояния всех транзакций. Этот объект представляет собой множество, элементами которого являются объекты-агрегаты, описывающие контекст транзакции.

Таблица 9: Контекст транзакции

Имя поля Размер в байтах Значение
TR_MESS 4 OID сообщения
TR_KH 4 OID knowhow
TR_PARAM 4 OID агрегата с параметрами
TR_TARGET 4 OID целевого объекта сообщения
TR_RES 4 OID результата
TR_STACK 4 OID стека
TR_N 4 Номер транзакции
TR_HOSTN 4 Номер вызвавшей транзакции
TR_STATUS 1 Состояние транзакции
TR_POINT 2 Точка разрыва, в которой находимся

Для каждой транзакции выделяется свой стек. Механизм сохранения и вос­ста­нов­ления стеков описан в [7]. Стеки сохраняются в атомарных объектах.

5. Описание операций над объектами в БД

             [] DB.NEW   [] -- создать новую БД

             [] DB.OPEN  [] -- открыть БД

             [] DB.CLOSE [] -- закрыть БД

Операции клонирования:

          [oid] CLONE      [oid']  -- клонировать объект

             [] CLONE_ROOT [oid']  -- Создать объект от "Корень"

          [int] CLONE_INT  [oid']  -- Создать объект "Целое"

     ["string"] CLONE_STR  [oid']  -- Создать объект "Строка"

     ["string"] CLONE_AGG  [oid']  -- Создать объек-агрегат

     [oid_if oid_then oid_else]

                CLONE_BIO  [oid']  -- Создать объект-условие

             [] CLONE_SET  [oid']  -- Создать объект-множество

             [] CLONE_SEQ  [oid']  -- Создать объект-последовательность

OIDROOT, OIDINT, OIDAGG, …, OIDSEQ -– Узнать идентификаторы соотв. Объектов

      [oid_bhr] SET_BHR    []      -- переопределить поведение

             [] GET_BHR    [oid]   -- узнать поведение

       [oid_kh] SET_KH     []      -- переопределить действие

             [] GET_KH     [oid]   -- узнать действие

          [oid] GET_INT    [int]   -- Получить целое число из объекта-целого

      [int oid] SET_INT    []      -- Занести целое число в объект-целое

          [oid] PRINT_STR  []      -- Печатать на экране содержимое строки

 ["string" oid] SET_STR    []      -- Занести строку в объект-строку

[oid_super oid] SUPER+     []      -- наследовать данные из oid_super в oid

          [oid] DELOBJ     []      -- удалить объект

Операции над множеством:

   [oid_el oid] SET+E      []      -- добавить элемент в множество

   [oid_el oid] SET-E      []      -- удалить элемент из множества

   [oid_el oid] SET?E      [0/1]   -- найти элемент в множестве

     [oid1 oid] SET+       []      -- объединение

     [oid1 oid] SET-       []      -- разность

     [oid1 oid] SET*       []      -- пересечение

Операции над списком:

 [oid_el n oid] SEQ+E      []      -- добавить элемент в последовательность

        [n oid] SEQ-E      []      -- удалить n-й элемент из

                                     последовательности

   [oid_el oid] SEQ?E      [0/n]   -- найти позицию в последовательности

        [n oid] SEQ?N      [0/oid] -- определить oid n-го элемента послед-ти

Операции над агрегатом:

[fid oid_etalon oid] AGG+F []      -- добавить поле к объекту

          [fid oid] AGG-F  []      -- удалить поле из объекта

          [fid oid] ETALON [oid]   -- получить идентификатор объекта-эталона

          [fid oid] FIELD  [oid]   -- получить идентификатор

                                      объекта-значения

Операции над объектом-условием:

           [oid] GET_BIO

     [oid_else oid_then oid_if]    -- Получить параметры объекта-условия

[oid_else oid_then oid_if oid]

                 SET_BIO []        -- Сохранить параметры объекта-условия

Специальные операции:

[oid_str oid] SET_NAMEOBJ [oid] -- именовать объект

[oid_str fid] SET_NAMEFID [fid] -- именовать поле

    [oid_str] NAMEOBJ     [oid] -- получить идентификатор по имени

    [oid_str] NAMEFID     [fid] -- получить идентификатор поля по имени

[oid_mess oid_par oid] SEND  [] -- послать сообщение объекту

 [oid_mess oid_obj] METHOD?  [] -- определить идентификатор метода

   [oid1 oid] CHIELD      [1/0] -- определить, является ли oid1 потомком oid

     [oid_kh] RUN_KH         [] -- выполнить knowhow

           [] NCHAN      [chan] -- узнать номер текущего канала

       [chan] !NCHAN         [] -- переключиться на заданный канал

Операции просмотра:

[oid] JVIEW  [] -- просмотр журнала

   [] A.VIEW [] -- просмотр адресов объектов в БД

   [] Q.VIEW [] -- просмотр очереди

   [] IC     [] -- просмотр состояния канала

6. Требования к техническим и программным средствам

ДССП реа­лизована на множестве компьютерных платформ (VAX, PDP-11, IBM PC, R3000, MC68020, SPARC) и операционных систем (MSDOS, MSDOS-экстендеры, UNIX, RT-11, RSX, OS9, CPM и др.). В дан­ный момент практически закон­чена разработка ДССП на Си, что обес­печивает перенос этой системы на любую платформу, где есть Си.

Аппаратные средства:

Любая платформа, на которой функционирует ДССП, с объемом оперативной памяти для нужд БД не менее 1 Мб.

Программные средства:

ДССП с диспетчером параллельных процессов (версия 4.42) и Операционная Система.

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

В дальнейшем, могут быть реализованы сетевые протоколы и тогда СУООБД будет являться сервером в клиент-серверных приложениях.

Использование отдельных почтовых ящиков для нескольких параллельно работающих пользователей позволяет возложить на СУООБД функции монитора [6], осуществляющего линеаризацию  поступающих запросов к содержимому СУООБД.

7. Реализация прототипа

7.1 Построитель

LOAD TIMEM

LOAD M0

LOAD M2

LOAD Soms

LOAD CHMS

LOAD SYSOBJS

LOAD M3

LOAD LS_CASH

UNDEF

PROGRAM $KH_VOC

7.2 Заголовочный модуль для каналов

PROGRAM $M0

B16

1000 VALUE TOTMEMLEN

TOTMEMLEN BYTE VCTR MEMORY

: T-1 D -1 ;

: *4 SHL SHL ;

: &0FF 0FF & ;

: <= 1+ < ;

: >= 1- > ;

[20 WORD VCTR CHAN] [каналы. Начиная с 5-го]

VAR NCHAN [Номер текущего канала]

: !NCHAN ! NCHAN ;

5 VALUE NBASECH [Первый не базовый канал]

: GETDATA NCHAN 10 * + CHDATA ;

: PUTDATA NCHAN 10 * + ! CHDATA ;

[Размер заголовка блока в байтах]

FIX VAR HSIZE 10 ! HSIZE

: HSIZE+ HSIZE + ;

[Pred, Next, BusyLen, Len]

1 *4 VALUE ctfPREDADDR

[$M4] [как самодостаточный]

0 VALUE ctLOWCH   [Нижний канал.]

                  [0=Оперативная/1=Дисковая память/2=Журнал/-1=свободен]

1 VALUE ctTEKADR  [Логический адрес внутри участка (по данным)]

2 VALUE ctBUSYLEN [Длина фрагмента, занятая данными]

3 VALUE ctLEN     [Максимальная допустимая длина данных фрагмента]

4 VALUE ctTEKADR0  [=TEKADR, когда TEKADR стоит на нулевом байте данных фрагм]

5 VALUE ctNEXTADDR  [Адрес начала заголовка следующего фрагмента (пф)]

6 VALUE ctPREDADDR  [Адрес начала заголовка предыдущего фрагмента (пф)]

7 VALUE ctSYNCADDR  [Адрес начала заголовка фрагмента (пф)]

8 VALUE ctCHGCTX    [признак изменения контекста]

9 VALUE ct1STLONG   [Первое число в канале]

[в начальном блоке в начальном слове данных лежит адрес начала данных]

: LOWCH  ctLOWCH GETDATA ;  : !LOWCH ctLOWCH PUTDATA ;

: TEKADR ctTEKADR GETDATA ;    : !TEKADR ctTEKADR PUTDATA ;

: TEKADR0 ctTEKADR0 GETDATA ;    : !TEKADR0 ctTEKADR0 PUTDATA ;

: TEKADR++ TEKADR 1+ !TEKADR ; : !+TEKADR TEKADR + !TEKADR ;

: BUSYLEN ctBUSYLEN GETDATA ; : !BUSYLEN ctBUSYLEN PUTDATA ;

: LEN    ctLEN GETDATA ; : !LEN ctLEN PUTDATA ;

: NEXTADDR ctNEXTADDR GETDATA ;  : !NEXTADDR ctNEXTADDR PUTDATA ;

: PREDADDR ctPREDADDR GETDATA ;  : !PREDADDR ctPREDADDR PUTDATA ;

: SYNCADDR ctSYNCADDR GETDATA ;  : !SYNCADDR ctSYNCADDR PUTDATA ;

: CHGCTX ctCHGCTX GETDATA ;  : !CHGCTX ctCHGCTX PUTDATA ;

: FSTLONG ct1STLONG GETDATA ; : !FSTLONG ct1STLONG PUTDATA ;

TRAP NOMEMORY NOMEMORY#

: NOMEMORY# ."

No free memory" ;

TRAP OUTDATA OUTDATA#

: OUTDATA# ."

Out of data. " ;

TRAP OUTMEM OUTMEM#

: OUTMEM# ."

Out of memory. " ;

TRAP UNKCH UNKCH#

: UNKCH# ."

Unknown primitive channel:" NCHAN .D CR ;

TRAP O_NOTFND NOTFND#

: NOTFND# ."

Object not found. OID=" . CR ;

[*** Информация по каналу ***]

: IC CR

 ."   NCHAN=" NCHAN .D SP    ."   LOWCH=" LOWCH .D CR

 ."SYNCADDR=" SYNCADDR .D SP    ."PREDADDR=" PREDADDR .D SP ."NEXTADDR="

NEXTADDR .D CR

 ." BUSYLEN=" BUSYLEN .D SP  ."     LEN=" LEN .D CR

 ." TEKADR0=" TEKADR0 .D SP ."  TEKADR=" TEKADR .D CR ;

CHANNEL DATACH "DATA."    CONNECT DATACH

7.3 Менеджер виртуальной памяти

PROGRAM $M2

B16               [физическая организация памяти]

[вычисление физического адреса и номера базового канала]

:: : POSIX [addr(i)] NCHAN C NBASECH < BR+ LEAVE [addr nchan] D

                  GOTO DELTA2 S( NCHAN ) TOLOW POSIX [addr(i-1)] ;

:: : TOLOW LOWCH !NCHAN ;

[Пересчет адреса в адрес нижнего уровня: TEKADR(i) -> TEKADR(i-1)]

:: : DELTA2 SYNCADDR HSIZE + TEKADR TEKADR0 - + ;

:: : IBS EON OUTDATA OUTDATA# LAST?

         TEKADR POSIX TEKADR++ S( NCHAN ) !NCHAN BSGOTO

      NCHAN BR 0 IBS0 1 IBS1 [2 IBS2] ELSE UNKCH ;

:: : OBS EON OUTDATA OUTDATA# LAST?

         TEKADR POSIX TEKADR++ S( NCHAN ) !NCHAN BSGOTO

         NCHAN BR 0 OBS0 1 OBS1 [2 OBS2] ELSE UNKCH ;

   : LAST? TEKADR BUSYLEN TEKADR0 + = IF0 LEAVE NEXTBLK ;

[переход для базового канала  ]

: BSGOTO [ADDR] NCHAN BR 0 BSGOTO0 1 BSGOTO1 [2 BSGOTO2] ELSE UNKCH ;

  : BSGOTO0 !TEKADR ;

  : BSGOTO1 C !TEKADR HSIZE+ SPOS DATACH ;

[  : BSGOTO2 C !TEKADR HSIZE+ SPOS JOURCH ;]

0 %IF

: ADDR [PARAGRAF OFFSET] + [address] ; [Сейчас пгф=1 байту]

 [Для файлов можно сделать неск. файлов и распределить по ним пространство]

%FI

: IBS0  TEKADR  HSIZE+ MEMORY &0FF TEKADR++ ;

: IBS1        IB DATACH &0FF TEKADR++ ;

[: IBS2        IB JOURCH &0FF TEKADR++ ;]

: OBS0 &0FF TEKADR HSIZE+ ! MEMORY TEKADR++ ;

: OBS1 &0FF        OB DATACH TEKADR++ ; [Запись байта]

[: OBS2 &0FF        OB JOURCH TEKADR++ ;] [Запись байта]

:: : GOTO NCHAN NBASECH < BR+ BSGOTO VGOTO ;

   : VGOTO TEKADR - @GOTO ;

[Переход по смещению]

:: : @GOTO C BRS @GOTO- D @GOTO+ ;

   : @GOTO+     DO @GOTO1+ ;

   : @GOTO- NEG DO @GOTO1- ;

   : @GOTO1+

            EON OUTDATA OUTDATA#

            TEKADR TEKADR0 BUSYLEN + =

            IF+ NEXTBLK TEKADR 1+ !TEKADR ;

   : @GOTO1-

            EON OUTDATA OUTDATA#

            TEKADR TEKADR0 =

            IF+ PREDBLK TEKADR 1- !TEKADR ;

  : NEXTBLK CHGCTX IF+ SCTX NEXTADDR NOEXIST? !SYNCADDR RELCTX

            TEKADR !TEKADR0 ;

  : NOEXIST? [ADDR] C -1 = IF+ OUTDATA [ADDR] ;

[Pred, Next, BusyLen, Len]

:: : LCTX' [UPCH] PUSH TEKADR ILS ILS ILS ILS POP

       NCHAN E2 !NCHAN !LOWCH !LEN !BUSYLEN !NEXTADDR !PREDADDR !SYNCADDR

       0 !CHGCTX ;

[Грузить параметры канала]

:: : LCTX [newch] LCTX' 0 !TEKADR 0 !TEKADR0 ;

   : RELCTX TEKADR0 TEKADR NCHAN SYNCADDR TOLOW GOTO LCTX !TEKADR !TEKADR0 ;

  : PREDBLK CHGCTX IF+ SCTX PREDADDR NOEXIST? !SYNCADDR RELCTX

            TEKADR BUSYLEN - !TEKADR0 ;

: IBSC [CHAN] S( NCHAN ) !NCHAN IBS ;

: ILSC S( NCHAN ) !NCHAN ILS ;

: OBSC [N CHAN] S( NCHAN ) !NCHAN OBS ;

: IOBSCC [SRC DST] C2 IBSC C2 OBSC ;

: DO_IOBSCC [SRC_CH DST_CH N] S( NCHAN )

      C3 !NCHAN 0 GOTO DO IOBSCC [SRC DST] ;

: IWS IBS IBS SWB &0 ;

: ILS IWS IWS SETHI ; [SWW &0]

: OWS C OBS SWB OBS ;

: OLS C OWS SWW OWS ;

[Перейти к конечному блоку]

: GOTOENDBK NEXTADDR -1 = EX+ BUSYLEN TEKADR0 +

            NEXTADDR !SYNCADDR RELCTX C !TEKADR0 !TEKADR ;

: GOBOTTOM RP GOTOENDBK BUSYLEN TEKADR0 + GOTO ;

: LENVMEM GOBOTTOM TEKADR [LEN] ; [длина виртуальной памяти]

: LASTADDR SYNCADDR LEN + HSIZE+ ;

: OBS-0 NCHAN BR 0 OBS00 1 OBS01 [2 OBS02] ELSE OBS0N ;

  : OBS00 0 OBS0 ; : OBS01 0 OBS1 ; [: OBS02 0 OBS2 ;] : OBS0N 0 OBS ;

[Спецификация: Размер увеличивается на N байт. Если это невозможно,

               возникает исключительная ситуация NOMEMORY.

  После работы мы стоим в том же канале в начале выделенного пространства. ]

: UPSIZE [N] GOBOTTOM TEKADR E2 UPSIZE' GOTO [] ;

: UPSIZE' [N] GOBOTTOM  LEN BUSYLEN - CALCOST [HARD SOFT] UPSIZEI

          C BR0 D UPSIZEO ;

   : CALCOST [N FREE] C2C2 <= BR+ COST1 COST2 [HARD SOFT] ;

   : COST1 [N FREE] T0 E2 [0 N] ;

   : COST2 [N FREE] C PUSH - POP [N-FREE FREE] ;

 : UPSIZEI [N_SOFT] BUSYLEN + !BUSYLEN 1 !CHGCTX SCTX ;

 : UPSIZEO [N_HARD] NCHAN BR 0 USO0 1 USO1 2 USO1 ELSE USON ;

 : USO1 C GOBOTTOM TEKADR E2 DO OBS-0 [!TEKADR] BSGOTO

        C BUSYLEN + !BUSYLEN LEN + !LEN 1 !CHGCTX SCTX ;

 : USO0 NOMEMORY [Сюда можно вставить упаковку] ;

[Спецификация: увеличение размера (жестко, т.е. за счет нижнего уровня)]

 : USON [N] SYNCADDR LASTADDR USON1 RELCTX [>] UPSIZE' ;

 : USON1 S( NCHAN )  TOLOW BUSYLEN = BR+ USON_ADD USON_NEW ;

   [Расширение увеличением длины фрагмента]

   : USON_ADD C2 [N SYNCADDR N] UPSIZE' C BUSYLEN E2 - HSIZE - E2

              [N LEN SYNCADDR] 3 *4 + GOTO OLS [N] [UPSIZEI] ;

   [Расширение созданием нового фрагмента]

   : USON_NEW C2 [N SYNCADDR N] [GOBOTTOM] C HSIZE+ UPSIZE'

      [N SYNCADDR N] C2 -1 0 C4 TEKADR PUSH WRITECTX D 4+ GOTO POP OLS [N] ;

   : WRITECTX [PRED NEXT BUSY LEN] C4 OLS C3 OLS C2 OLS C OLS DD DD ;

FIX VAR UPCONST 10 ! UPCONST [Этому числу байт кратно увеличение]

[Увеличение размера нижнего уровня]

[увеличение физического размера этого уровня]

: SCTX CHGCTX IF0 LEAVE 0 !CHGCTX NCHAN BR 0 NOP 1 SCTX1 [2 SCTX2]

  3 NOP 4 NOP ELSE SCTXN ;

: SCTXN TEKADR NCHAN   LEN BUSYLEN NEXTADDR

       PREDADDR SYNCADDR TOLOW GOTO 4 DO OLS  !NCHAN GOTO ;

: SAVEALL NOP ; [СОХРАНИТЬ ВЕСЬ КАНАЛ НА ПЕРВИЧНОМ УСТРОЙСТВЕ (ИСТОЧНИКЕ)]

: SCTX1 POS DATACH 8 SPOS DATACH BUSYLEN OL DATACH LEN OL DATACH SPOS DATACH ;

[

: SCTX2 POS JOURCH 8 SPOS JOURCH BUSYLEN OL JOURCH LEN OL JOURCH SPOS JOURCH ;

]

[Новая виртуальная память]

0 %IF

: NEWVM [N] TEKADR C2 HSIZE+ UPSIZE GOTO -1 -1 C3 C WRITECTX D ;

%FI

: NEWVM [N] C HSIZE+ UPSIZE TEKADR PUSH -1 -1 0 C4 WRITECTX DO OBS-0

  POP [SYNCADR] ;

: END? NEXTADDR -1 = TEKADR BUSYLEN TEKADR0 + = & ;

: NEWVM1 [N] C HSIZE+ UPSIZE TEKADR PUSH -1 -1 E3 C WRITECTX WRI_DATA

  POP [SYNCADR] ;

: LOADCH0 0 !NCHAN 0 !LOWCH 0 !TEKADR 0 !BUSYLEN

          TOTMEMLEN !LEN 0 !TEKADR0 0 !SYNCADDR -1 !NEXTADDR -1 !PREDADDR ;

[ДЛЯ БАЗОВЫХ КАНАЛОВ LOWCH=NCHAN]

7.4 Система управления хранением объектов

PROGRAM $SOMS

B16

[СИСТЕМА УПРАВЛЕНИЯ ХРАНЕНИЕМ ОБЪЕКТОВ]

FIX LONG VAR MAXID

1 ! MAXID

: NEWID MAXID !1+ MAXID ;

: DEFMAXID 6 EL_MAX 1+ ! MAXID ;

[5 КАНАЛ = ОПЕРАТИВНАЯ ПАМЯТЬ; 6 КАНАЛ = ДИСКОВАЯ ПАМЯТЬ]

: L_SUHO 0 !NCHAN 0 GOTO 5 LCTX  1 !NCHAN 0 GOTO 6 LCTX ;

[создание структуры СУХО для ОП]

[9 -- Размер, занимаемый элементом списка]

LONG VAR SIZE_EL 8 ! SIZE_EL

[создать новый объект]

ACT VAR WRI_DATA

: M.NEWOBJ [SIZE OID] 0 E2 8 5 X.NEWOBJ [] ;

: D.NEWOBJ [SIZE OID] 1 E2 8 6 X.NEWOBJ [] ;

: X.NEWOBJ [SIZE LOWCH OID SIZE_EL DIR_CHAN] C PUSH S( NCHAN ) !NCHAN UPSIZE

        [.. OID] OLS [basechan] !NCHAN NEWVM1 [SYNCADDR] POP !NCHAN OLS [] ;

:: : M.VIEW 5 !NCHAN CR ."RAM:" VIEW.OBJ' ;

:: : D.VIEW 6 !NCHAN CR ."HDD:" VIEW.OBJ' ;

:: : A.VIEW M.VIEW D.VIEW ;

: IC.VIEW [A L] SHR SHR E2 GOTO DO IC1.V ;

  : IC1.V TEKADR CR .D #> TOB SP SP ILS .D ;

: VIEW.OBJ' 0 GOTO ILS D [Пропустили длину элемента]

  CR ."  OID      ADDRESS" RP SHOWPAROBJ ;

: SHOWPAROBJ END? EX+ ILS C BR0 SPO1 SPO2 ;

    : SPO1 D ILS D ;

    : SPO2 CR .D SP ILS .D SP ;

: M.DEL [OID] 5 X.DEL ;  : D.DEL [OID] 6 X.DEL ;

: A.DEL [OID] C M.DEL D.DEL ;

ACT VAR EL_AVAR

:: : X.DEL [OID NCHAN] EL_FIND [OID 1/0] IF+ EL_DEL D ;

     [найти элемент в списке по ID и встать на след. за OID слово]

   : EL_DEL -4 @GOTO 0 OLS ;

:: : EL_FIND [OID NCHAN] '' EL_COMPAR ! EL_AVAR EL_PEREBOR ;

   : EL_PEREBOR  !NCHAN 0 GOTO ILS D  RP EL_FIND0 [OID 1/0] ;

   : EL_FIND0 END? 0 E2 EX+ D ILS C BR0 D EL_AVAR ILS D ;

   : EL_COMPAR [OUR_OID TEK_OID]  C2 = C EX+ D ;

:: : EL_MAX [DIR-NCHAN] 0 E2 '' MAX ! EL_AVAR EL_PEREBOR D [OID] ;

:: : DB.NEW !1 MAXID WOPEN DATACH

      -1 OL DATACH -1 OL DATACH 14 OL DATACH 14 OL DATACH

      -1 OL DATACH -1 OL DATACH 4 OL DATACH 4 OL DATACH

            8 OL DATACH CLOSE DATACH

[      WOPEN JOURCH

      -1 OL JOURCH -1 OL JOURCH 14 OL JOURCH 14 OL JOURCH

      -1 OL JOURCH -1 OL JOURCH  4 OL JOURCH  4 OL JOURCH

            8 OL JOURCH CLOSE JOURCH ]

 DB.OPEN ;

: DB.CLOSE CLOSE DATACH [CLOSE JOURCH] ;

: DB.OPEN -1 !!! CHDATA

 [DATA]

 OPEN DATACH 1 !NCHAN 0 !TEKADR 0 !TEKADR0 1 !LOWCH

  IL DATACH  !PREDADDR IL DATACH !NEXTADDR 0 !SYNCADDR

  IL DATACH  !BUSYLEN  IL DATACH !LEN  6 LCTX

 [RAM]

 0 !NCHAN 0 !LOWCH 0 !TEKADR 0 !BUSYLEN

 TOTMEMLEN !LEN 0 !TEKADR0 0 !SYNCADDR -1 !NEXTADDR -1 !PREDADDR

 '' WRI_8OLS ! WRI_DATA [длина элемента каталога]

 4 [<can more...] NEWVM1

    [SYNCADR] GOTO 5 LCTX [4 UPSIZE 8 OLS] DEFMAXID

 CHMS.INIT ;

: WRI_8OLS 8 OLS ;

7.5 Система управления каналами

PROGRAM $CHMS

3 VALUE LENGRP [Вместимость уровня приоритетов]

4 VALUE QChannels

LENGRP 3 * 1+ VALUE LenPrioQue [длина очереди приоритетов. Очередь -- с 0]

: N2CH [N] QChannels * 0A + [NCHAN] ;

LenPrioQue 1+ N2CH 10 * LONG VCTR CHDATA [память параметров каналов]

[для каждого канала можно завести 16. различных параметров]

: CHMS.INIT 0 !!! PrioQueOID

  0 LenPrioQue DO SETNQ D ;

: SETNQ C C ! PrioQueNUM C N2CH [NUM CHAN1]

[вычислили номер канала для очередного объекта кэша]

           C C3 1 ! Channels

        1+ C C3 2 ! Channels

        1+ C C3 3 ! Channels

        1+ C C3 4 ! Channels D 1+ ;

[при обращении к объекту нужно повысить его приоритет]

: HIPRIODD D HIPRIO ;

: HIPRIO [OID] FINDOID C BR- D HIPRIO1 ;

  : HIPRIO1 [N] C LENGRP / D C IF+ 1- LENGRP * [N N'] E2 UPOID [] ;

[Новый объект добавляется на последн. поз-ю, а затем к нему примен. HIPRIO]

LenPrioQue  LONG VCTR PrioQueOID [список OID]

LenPrioQue  WORD VCTR PrioQueNUM [номера записей в массиве каналов]

LenPrioQue  QChannels 2 WORD ARR Channels

[обменять в очереди с соседним вышестоящим]

: SWP2OBJ [N] C IF0 LEAVE C PrioQueOID C2 1- PrioQueOID

                       C3 ! PrioQueOID C2 1- ! PrioQueOID

 C PrioQueNUM C2 1- PrioQueNUM  C3 ! PrioQueNUM C2 1- ! PrioQueNUM 1- [N-1] ;

: SWP2OBJDD SWP2OBJ DD ;

: FINDOID [OID] 0 LenPrioQue DO CMPOID E2D C LenPrioQue = IF+ T-1 [-1/N] ;

: CMPOID [OID] C PrioQueOID [OID N OID(N)] C3 = EX+ 1+ ;

[Поднять объект от N_DOWN к N_UP в очереди]

: UPOID [N_UP N_DOWN ] C E3 - DO SWP2OBJ D [] ;

[Просмотр очереди (кэш объектов)]

: Q.VIEW 0 LenPrioQue

."                                  M.Hdr D.Hdr M.Dat D.His"

   DO QELVIEW D ;

: QELVIEW [n] CR C C 2 TON LENGRP / E2D BR0 #- #) TOB

 C PrioQueOID ." OID=" .D C PrioQueNUM ."  Num=" .

  ."  Channels= " 1 QChannels DO PriNCH

  DD 1+ ;

: PriNCH [NOID NCH] C2C2 Channels 4 TON SP SP 1+ [NOID NCH+1] ;

7.6 Работа с базовыми объектами

PROGRAM $SYSOBJS

B16

LONG VAR ADRSTR   LONG VAR LENSTR

 0 VALUE N_OID   4 VALUE N_BHR   8 VALUE N_KH

0C VALUE N_TRC  10 VALUE N_VAL  14 VALUE N_HIS

13 VALUE JRECLEN

: G_OID  N_OID GOTO ;  : W_OID G_OID OLS ;

: G_BHR  N_BHR GOTO ;  : W_BHR G_BHR OLS ;

: G_KH   N_KH  GOTO ;  : W_KH  G_KH  OLS ;

: G_TRC  N_TRC GOTO ;  : W_TRC G_TRC OLS ;

: G_VAL  N_VAL GOTO ;  : W_VAL G_VAL OLS ;

: G_HIS  N_HIS GOTO ;  : W_HIS G_HIS OLS ;

18 VALUE SZ_HDROBJ

: W_NULLBLK -1 OLS -1 OLS 0 OLS 0 OLS ;

[Описание системных объектов]

ACT VAR DATWR

LONG VAR OIDV

LONG VAR VALINT

[**** ROOT ****]

SZ_HDROBJ HSIZE+ HSIZE+ 4+ VALUE SIZE_ROOT

:: : CLONE_ROOT '' DATWRROOT ! DATWR NEWOBJ1 ;

:: : CLONE_INT ! VALINT  '' DATWRINT  ! DATWR  NEWOBJ1 ;

:: : CLONE_SET  4 CLONE_INT ;

:: : CLONE_SEQ  4 CLONE_INT ;

:: : CLONE_AGG 0C CLONE_INT ;

:: : CLONE_STR [A L] ! LENSTR ! ADRSTR '' DATWRSTR ! DATWR

                    LENSTR SIZE_ROOT + 4- ! SIZE_X NEWOBJ3 ;

:: : SET_BHR [OID_BHR OID] N_BHR E2 SET_X1 ;

:: : SET_KH  [OID_KH  OID] N_KH  E2 SET_X1 ;

   : SET_X1 [ADR OID] C2C2 N_TRSC E2 NEWJREC

                   C LOADOBJ FINDOID C BR- DD SET_X11 ;

   : SET_X11 PrioQueNUM 2 Channels !NCHAN GOTO OLS ;

:: : SET_INT [int oid] C HIPRIO PUSH ! VALINT 4 '' OLSI POP NEWDREC ;

   : OLSI VALINT OLS ;

:: : GET_INT [OID] TODATA ILS ;

:: : TODATA [OID] C LOADOBJ C HIPRIO FINDOID PrioQueNUM

             3 Channels !NCHAN 0 GOTO ;

:: : SET_STR [A L OID] C HIPRIO

             PUSH ! LENSTR ! ADRSTR LENSTR '' OLSS POP NEWDREC ;

   : OLSS    ADRSTR LENSTR DO DWS1 D ;

ACT VAR BYTE_STR

:: : PRINT_STR '' PRIS ! BYTE_STR ACCESS_STR ;

:: : COPY2BUF_STR '' C2BUF ! BYTE_STR ACCESS_STR ;

:: : ACCESS_STR [OID] TODATA LENVMEM 0 GOTO DO BYTE_STR ;

   : PRIS IBS TOB ;

   : C2BUF IBS ABUF !TB !1+ ABUF ;

: DD_ROOT

     OIDV OLS 0 OLS 0 OLS 0 OLS SZ_HDROBJ HSIZE+ OLS [val]

     SZ_HDROBJ OLS [his]

     W_NULLBLK [W_NULLBLK] DATWR ;

LONG VAR SIZE_X

: DATWRROOT -1 OLS -1 OLS 0 OLS 4 OLS 0 OLS ;

: DATWRINT  -1 OLS -1 OLS 4 OLS 4 OLS VALINT OLS ;

: DATWRSTR  -1 OLS -1 OLS LENSTR OLS LENSTR OLS ADRSTR LENSTR DO DWS1 D ;

  : DWS1 [A] C @B OBS 1+ ;

: NEWOBJ1 [] SIZE_ROOT ! SIZE_X NEWOBJ3 ;

: NEWOBJ3 '' DD_ROOT ! WRI_DATA

             NEWID C ! OIDV SIZE_X C2 D.NEWOBJ [OID] ;

9 VALUE LCH

LCH LONG VCTR CLONEHDR  VAR DATCH LONG VAR LENVMEM1

:: : CLONE [OID] C HIPRIO

 C LOADOBJ FINDOID PrioQueNUM C PUSH 2 Channels !NCHAN 0 GOTO

 CLONE1 []

 '' CC_ROOT ! WRI_DATA NEWID C 0 ! CLONEHDR SZ_HDROBJ HSIZE+ C2 D.NEWOBJ

 [OID] POP 3 Channels C ! DATCH !NCHAN LENVMEM C ! LENVMEM1

 C2 [OID_NEW LEN OID_NEW] CLONE_DATA [OID_NEW] ;

: CLONE1

     ILS 1 ! CLONEHDR [BHR]   ILS 2 ! CLONEHDR [KH]

     ILS 3 ! CLONEHDR [TRC]   0 4 ! CLONEHDR

     SZ_HDROBJ 5 ! CLONEHDR -1 6 ! CLONEHDR

     -1 7 ! CLONEHDR 0 8 ! CLONEHDR

      0 9 ! CLONEHDR ;

: CCR1 [N] C CLONEHDR OLS 1+ ;

: CC_ROOT 0 LCH 1+ DO CCR1 D ;

: CLONE_DATA [LEN OID] '' COPY_DATA E2 NEWDREC [] ;

: COPY_DATA [] DATCH NCHAN LENVMEM1 DO_IOBSCC DD ;

:: 0 VALUE N_TRSC

[Запись новых данных, запись в журнал]

: NEWDREC [SIZED PROC OID] N_VAL N_TRSC C3 NEWJREC FINDOID

 PrioQueNUM [SIZE PROC N] C PUSH

 2 Channels !NCHAN

     [SIZED PROC] ! WRI_DATA NEWVM1 G_VAL C OLS [ADR_DATA]

[перечитать канал данных]

 GOTO POP 3 Channels LCTX [] ;

[новая запись в журнал. На вх: номер транз. и адрес из заголовка]

: NEWJREC [addr_hdr TRANS OID] C LOADOBJ FINDOID PrioQueNUM

[. TRANS N] C PUSH 4 Channels

     !NCHAN JRECLEN UPSIZE OLS POP NCHAN PUSH 2 Channels !NCHAN

     C GOTO ILS POP !NCHAN

     E2 OWS OLS W_DATIME [] ;

B10

[Запись текущего времени]

: W_DATIME 1979 OWS 12 OBS 31 OBS TMGET TMS ;

: TMS [num] N2T GBR E2 GBR E2 GBR E2 OBS OBS OBS 100 * OWS ;

B16

[просмотр журнала объекта]

[Переключиться на журнал]

: OBJ.J [OID]

        C LOADOBJ FINDOID PrioQueNUM 4 Channels !NCHAN ;

: JVIEW [oid] CR ."Updated data:"

                  OBJ.J LENVMEM JRECLEN / D 0 GOTO DO JVIEW1 ;

: JVIEW1 CR ."Trans= " ILS .D SP

            IWS BR N_BHR ."Behav.=" N_VAL ."AddrVal=" N_KH ."Knowhow="

            ELSE ."?????? =" ILS SP .D  SP JDATAV1 ;

: JDATAV1 S( BASE@ ) B10 IWS IBS IBS 2 TON #. TOB 2 TON #. TOB 4 TON

  SP SP #: POS2 #: POS2 #. POS2 #  IWS 4 TON TOB ;

  : POS2 [B] IBS 2 TON TOB ;

[Определить размер объекта в памяти = заголовок + данные]

: SIZEMEMOBJ [N] C PrioQueOID BR0 T0 SMEMO1 [0/size] ;

: SMEMO1 3 Channels !NCHAN LENVMEM HSIZE+ HSIZE+ SZ_HDROBJ + [size] ;

7.7 Выполнение действий

PROGRAM $M3

[Выполнение действий (knowhow)]

FIX 1000 BYTE VCTR BUFTXT [Буфер для текста действий]

FIX LONG VAR ABUF

: BEGABUF 0 ' BUFTXT ! ABUF ;

: RUNCMD [OID_KH] BEGABUF "KH$" S2BUF N2BUF ABUF BEGABUF ABUF E2 C2 -

           TEXEC ;

: MAKECMD [OID_KH] BEGABUF ": KH$" S2BUF C N2BUF #  ABUF !TB !1+ ABUF

          COPY2BUF_STR " ; " S2BUF

          ABUF BEGABUF ABUF E2 C2 - TEXEC ;

: S2BUF [A L] DO S2BUF1 D ;

  : S2BUF1 C @B ABUF !TB !1+ ABUF 1+ ;

: N2BUF [N] 8 DO CTN-SB D 8 [C1 .. Cn n] DO CTB ;

  : CTN-SB [N] C 0F & #0 + E2 -4 SHT [C N'] ;

  : CTB ABUF !TB !1+ ABUF ;

LONG VAR OIDK

: NEW_VOC "PROGRAM $KH_VOC" TEXEC ;

: RUN_KH [OID_KH] NEW_VOC C MAKECMD RUNCMD ;

7.8 Кэширование объектов

PROGRAM $LS_CASH

[ Каналы: 1 - Header M.Obj  2 - Header D.Obj  3 - M.Data  4 - D.History ]

[Считаем, что все объекты -- стабильные]

: LOADOBJ [OID] C FINDOID [искали в кэше] C BR- LOADOBJ-1 DD ;

: LOADOBJ-1 D [OID] [Ищем в каталоге БД объект] [C] LOADOBJ1 [LOADOBJ2]

     LenPrioQue 1- HIPRIO1 [] ;

: LOADOBJ1 6 LOADOBJ3 ;

[открыть дисковый объект в кэше]

: LOADOBJ3 [OID NDIRCH] EL_FIND [OID 1/0] IF0 O_NOTFND [Нет такого объекта]

  C LenPrioQue 1- ! PrioQueOID [Занесли в кэш идентификатор объекта]

  ILS [OID ADDR_MEM] [получили адрес размещения в дисковой памяти]

  LenPrioQue 1- PrioQueNUM

  [получили номер отведенной для работы с объектом группы каналов]

  [OID ADDR_MEM NUM]

  C 2 Channels [OID ADDR_MEM NUM CHANOBJ]

  NCHAN NBASECH - !NCHAN [получили номер базового канала]

  C3 GOTO LCTX [OID ADDR_MEM NUM] [загрузили заголовок дискового объекта]

  E2D [O N]

  C 4 Channels [OID NUM CHANHIST] [получили канал для истории]

  G_HIS ILS

  [O N C HISTORY] [HISTORY д.б. <>0]

  GOTO NCHAN E2 LCTX [Открыли историю в канале] !NCHAN [O N]

  C 3 Channels G_VAL ILS GOTO LCTX [временно открыли канал данных

                                     напрямую с жесткого диска]

  [LOADDM]

NOP [Здесь нужно установиться на объект в памяти и канал данных перекл. на него]

DD [] ;

 VAR NCHANDAT

 VAR NCHANOBJ  LONG VAR LENDAT

: COPY_DAT1 [] NCHANOBJ 0 GOTOC [NCHANOBJ] NCHAN 0 GOTO 8 DO_IOBSCC D 14 OLS

  0 OLS 10 GOTOC NCHAN 4 DO_IOBSCC DD -1 OLS -1 OLS LENDAT OLS LENDAT OLS

  COPY_DAT ;

: GOTOC [NCHAN n] C2 S( NCHAN ) !NCHAN GOTO [NCHAN] ;

: COPY_DAT [] NCHANDAT NCHAN [SRC_CH DST_CH]

              C2 !NCHAN LENVMEM [SRC_CH DST_CH LEN] 0 GOTO DO_IOBSCC DD ;

8. Контрольный пример, демонстрирующий возможности технологии

DB.NEW

Создадим объект "Поведение клоуна" для клоуна

[] "Поведение клоуна" CLONE_STR

    [oid_str] OIDSET GET_BHR CLONE

[oid_str oid] SET_NAMEOBJ [oid]

Создадим объект "Клоун":

   [.. ] "Клоун" CLONE_STR

    [.. oid_str] CLONE_AGG

[.. oid_str oid] SET_NAMEOBJ [.. oid]

Определим ему поведение

[oid_bhr oid] SET_BHR

Определим в нем поля: X, Y, Цвет

"X"    NEWFID SET_NAMEFID [fid] OIDINT "Клоун" NAMEOID AGG+F []

В ДССП можно определить новое слово

: NEWFIELD [ "Имя объекта" "Имя поля"] NEWFID SET_NAMEFID [A L FID]

           OIDINT C4C4 NAMEOID AGG+F DD [] ;

"Клоун" "Y"    NEWFIELD

"Клоун" "Цвет" NEWFIELD

Создадим методы.

Создать метод "Идти".

"<тело метода "Идти" >" CLONE_STR [oid_kh]

[oid_kh] "Идти" CLONE_STR E2 C2 SET_KH [OID_STRKH]

"Поведение клоуна" NAMEOBJ SET+E

Аналогично создаются другие методы

...

Подготовка для вызова метода по идентификатору:

  "Идти" CLONE_STR C "Клоун" NAMEOBJ METHOD? E2 DELOBJ

Подготовка для вызова метода по имени:

  "Идти" CLONE_STR

Вызов

[oid] 0 "Клоун" NAMEOBJ [oid_mth 0 oid_obj] SEND

9. Оценка трудоемкости разработки ПО с использованием традиционного и предлагаемого подходов

В этом разделе будет проведен качественный анализ трудоемкости. Это связано, прежде всего, с особенностью языка реализации, отличного от классических ЯВУ.

Далее, в качестве примера, рассматривается следующая задача:

Клиенты имеют счета. Каждый счет увеличить на 10% и после этого пометить пользователя как получившего премию.

9.1 Табличные базы данных с низкоуровневыми операциями доступа

В качестве примера можно привести FoxPro 2.6 [11]. В ней есть недостаточное для обычных нужд подмножество SQL (SELECT, INSERT INTO); обычно взаимодействие с БД происходит с помощью операторов REPLACE, SCATTER, GATHER, SCAN … ENDSCAN и непосредственного присвоения с указанием в качестве префикса поля имени области, в которой открыта таблица. Такие программы практически непереносимы на клиент-сер­верные технологии, логика программ весьма сложна и приводит при программи­ро­ва­нии к трудно обнаруживаемым ошибкам. Достоинствами же являются простота реа­ли­зации языка таких СУБД и малая требовательность к ресурсам.

Программный код обработки (MS FoxPro 2.6):

SELECT CLIENT

SCAN

  SELECT SCHET

  REPLACE SUMMA WITH SUMMA*1.1 FOR SCHET.NUM_SCH=CLIENT.NUM_SCH

  SELECT CLIENT

  REPLACE PREMIA WITH .T.

ENDSCAN 

9.2 Реляционные базы данных

Реализация языка SQL позволяет работать с базой данных исключительно средствами SQL. Поддерживаются триггеры, отношения между таблицами, хранимые процедуры. Это типичные клиент-серверные СУБД. Управление целостностью данных возлагается на СУБД. Триггеры позволяют вынести практически все проверки из логики программы. Недостатком является необходимость нормализации таблиц, что затрудняет добавление новых таблиц при сопровождении программного средства, а иногда требует перенор­ма­лизации, что влечет за собой необходимость изменять программный код, а значит, и новые ошибки.

Программный код обработки (MS Visual FoxPro 3.0 и выше):

BEGIN TRANSACTION

  UPDATE SCHET SET SUMMA=SUMMA*1.1

             WHERE NUM_SCH IN (SELECT NUM_SCH FROM CLIENT)

  UPDATE CLIENT SET PREMIA = .T.

END TRANSACTION

9.3 Объектно-ориентированные базы данных

Позволяют хранить данные произвольной степени сложности (детали САПР) и вида (звук, изображение). Позволяют программировать на уровне инфологической модели, т.е. исчезают заботы о нормализации. Новые алгоритмы могут работать одновременно со старыми, обеспечивая преемственность. Например, если бухгалтерские проводки в следующем году проходят по новой схеме, переход на нужную схему в зависимости от даты СУБД выполнит сама.

Реализация для ООБД на формальном языке:

{«*»(1.1) ~> psumma(sClient.num_sch=Schet.num_sch(Schet, Client)), «:=»(True) ~> pPremia(Client)}

Порядок действий:

1    Умножение счетов на 1.1

1.1 Операция селекции выбирает множество счетов

1.2 Операция проекции выбирает интересующую часть счета – сумму

1.3 На суммы посылается операция «умножить» с аргументом 1.1

2    Пометка клиентов, как получивших премию

2.1 Операция проекции выделяет интересующую часть информации о клиенте – атрибут «премия»

2.2 Операция присвоения посылается на выделенный атрибут «премия» с аргументом True

Примечание 1: В операция селекции и проекции имеется некоторое отличие от операций реляционной алгебры. Например, операция проекции, выбирающая сумму, возвращает множество сумм. На самом деле множество сумм содержит не суммы, а иденти­фи­ка­торы атомарных объектов, хранящих суммы. Поэтому множество может содержать не­сколько одинаковых сумм и не теряется связь данных с оригинальным объектом-хранителем (счетом).

Примечание 2: Оба изменения происходят в пределах одной транзакции, посколь­ку эти действия являются экземплярами одного множества. Оба порядка дейст­вий: «сначала умножить, потом – пометить» и «Сначала пометить, потом – умножить» равно­правны, поскольку действия хранятся в множестве. Если порядок ва­жен, т.е. второе воздействие использует результат первого, то необходимо исполь­зовать не множество, а после­дова­тельность.

 Операции над сложными структурами транзитивно распространяются на опера­ции над компонентами по алгоритмам, описанным выше в разделе «Уточнение методов решения задачи». Таким образом, нет нужды во многих случаях писать циклы, обработку вло­жен­ных структур. Использование итераторов позволяет создавать собст­венный алго­ритм выбора элементов для обработки циклов.

9.4 Будущее применения различных баз данных

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

Но реляционные базы данных, скорее всего, по-прежнему останутся в качестве недорогих средств разработки приложений и, во многих случаях, естественных средств представления предметной области, подобно радио и кино, которых не вытеснило телевидение.

10. Литература

[1]  О.И.Авен Я.А.Коган “Управление вычислительным процессом” М. Энергия 1978

[2] А.М.Андреев Д.В.Березкин, Ю.А.Кантонистов «Среда и хранилище: ООБД»
Мир ПК №4 1998 (стр 74-81)

[3] М. Аткинсон, Ф. Бансилон и др. «Манифест систем объектно-ориентированных баз данных», СУБД № 4 1995

[4] В.Бобров "Объектно-ориентированные базы данных, мультимедийные типы данных и их обработка" Read.Me №4, 1996

[5] Н.П.Брусенцов, В.Б.Захаров и др. «Развиваемый адаптивный язык РАЯ диалоговой системы программирования ДССП» Москва МГУ 1987

[6] Бурцев А.А "Параллельное программирование. Учебное пособие по курсу "Операционные системы" - Обнинск : ИАТЭ, 1994 - 90 с.

[7] Бурцев А.А. «Сопрограммный механизм в ДССП как основа для построения мониторов параллельных процессов»

[8] Г.Буч «Объектно-ориентированное проектирование (с примерами применения)» М.Конкорд 1992

[9] К.Дж.Дейт «Введение в системы баз данных» 1998 Киев Диалектика

[10] Мутушев Д.М. Филиппов В.И. "Объектно-ориентированные базы данных" Программирование. - М., 1995 №6 стр. 59-76  

[11] В.Ремеев «FoxPro. Версия 2.5 для MS-DOS. Описание команд и функций» М. «Мистраль» 1994

[12]СУБД № 2 1995 «Системы баз данных третьего поколения: Манифест»

[13]СУБД № 1 1996 «Стандарт систем управления объектными базами данных ODMG-93: краткий обзор и оценка состояния» Л.А.Калиниченко

[14]СУБД № 1 1996 «ТРЕТИЙ МАНИФЕСТ» Х.Дарвин, К.Дэйт

[15]СУБД № 5-6 1996 “Введение в СУБД часть 9” стр. 136-153 С.Д. Кузнецов

[16]Data & Knowledge Engineeging №15 (1995) стр 169-183 “Selection of object surrogates to support clustering” Jukka Teuhola

[17] Data & Knowledge Engineering. Amsterdam 1996 Том 18 №1 стр.29-54 "Unifying data, behaviours, and messages in object-oriented databases" Sylvia L. Osborn, Li Yu

[18] IEEE Transactions On Knowledge And Data Engineering Том 7 №2 Апрель 1995 стр. 274-292 «Security Constraint Processing in a Multilevel Secure Distributed Database Management System» B.Thuraisingham, W.Ford

[19] Journal of systems and software - N.Y., 1996 Том 35 №3 стр. 169-183

Shah P. Wong J. "Concurency control in a object-oriented data base system"

Документы в Internet (http://www.citforum.ru):

[20] В. Индриков, АО ВЕСТЬ “Объектно-ориентированный подход и современные мониторы транзакций”

[21] Л.Калиниченко “Архитектуры и технологии разработки интероперабельных систем”, Институт проблем информатики РАН

[22] С.Д. Кузнецов "Основы современных баз данных"

[23] С. Кузнецов “Безопасность и целостность, или Худший враг себе - это ты сам”


Страницы: 1, 2, 3, 4, 5


на тему рефераты
НОВОСТИ на тему рефераты
на тему рефераты
ВХОД на тему рефераты
Логин:
Пароль:
регистрация
забыли пароль?

на тему рефераты    
на тему рефераты
ТЕГИ на тему рефераты

Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое.


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.