Кубанский государственный университет
Опубликован: 24.12.2013 | Доступ: свободный | Студентов: 681 / 8 | Длительность: 24:28:00
Лекция 3:

Иерархические модели данных. Деревья в СУБД Cache

3.2 Язык Cache ObjectScript

В незапамятные, по меркам области информационных технологий, времена, в 1967 г. был создан язык MUMPS. Эта аббревиатура полного названия "Massachusetts General Hospital's Utility Multiprogramming System", была неудачна уже по тому, что слово mumps означает болезнь, именуемую в просторечии свинкой. В 1977 г. язык был стандартизирован ANSI/ISO сразу после Фортрана и Кобола и в середине 90-х переименован в язык M. Катастрофически не везло языку с именами. Не согласны — попробуйте найти сведения о нём, задав поисковику ключевое слово "M". Современную версию языка М, называемую вполне приличным именем Cache ObjectScript (сокращённо, COS), поддерживает фирма InterSystems International.

Система управления базами данных Cache (это слово в переводе с французского означает то, что приносит известность или престиж) и правда обладает многими достоинствами. Почему для изложения материала книги, которую вы в настоящий момент, как я надеюсь, читаете, выбрана именно Cache? А потому, что это единственная СУБД, в которой можно не только поработать с тремя моделями данных —иерархической, реляционной и объектной — и изучить их отображения, но и самим создавать другие модели данных, что и будет сделано в конце книги. В этой главе мы освоим основные изобразительные средства языка и, особенно, работу с древесными структурами. В первых разделах будем изучать Cache ObjectScript так, как изучают какой-нибудь QBasic в школе. Это позволит приобрести необходимые начальные навыки и не отвлекаться на мелочи при работе с деревьями.

Для нас важно, что ObjectScript — это персистентный язык. Это означает, что он работает со структурами данных, хранящимися на диске. И эти структуры представляются деревьями, может быть связанными между собой. Их мы будем изучать подробно. Позже вы узнаете, что и программа в ObjectScript—это дерево специального вида.

Не считайте, что приобретённые в процессе скитаний по деревьям знания и навыки, нужны только в Cache. В любой современной СУБД используют XML-модели, имеющие древесную структуру. Так что вы всегда и везде будете на должном уровне.

3.2.1 Инсталляция Cache

Однопользовательская версия Cache может быть инсталлирована и использована без ограничений для некоммерческих целей. Это означает, что вы можете даже создавать приложения, но не имеете права их коммерческого использования.

Заходим на сайт фирмы InterSystems (http://www.intersystems.ru) и скачиваем файл инсталляции (путь "Продукты > Cache > Скачать Cache > Скачать однопользовательскую версию Cache"). Все примеры в этой книге демонстрируются на версии установленной из файла Cache-2010.2.0.317-win_x86.exe Объём файла 292 мбайта. Существуют версии под ОС Windows, Unix, Linux, OpenVMS и Mac OS X.

Для инсталляции под Windows запустите файл инсталляции и дождитесь появления страницы с лицензионным соглашением (рисунок 3.8). Внимательно изучите его и подтвердите, что вы принимаете условия соглашения. Нажмите на кнопку "Далее".

 Страница лицензионного соглашения

Рис. 3.8. Страница лицензионного соглашения

Выберите имя инсталляции, а лучше оставьте имя по умолчанию. Еще раз нажмите на кнопку "Далее". Появится путь, в котором устанавливается Cache. Его также можно изменить. Ещё раз нажмите на "Далее". На следующем экране (рисунок 3.9) выберите вариант по умолчанию "Разработка". Затем нажмите на кнопку "Далее".

 Вид инсталляции

Рис. 3.9. Вид инсталляции

Остаётся выбрать кодировку—8 бит или Unicode. Выбирайте Unicode, затем параметры безопасности (ставьте на минимум). Нам они пока безразличны.

Наконец, после того, как программа выдаст итоговые сведения о варианте инсталляции, нажимаем на кнопку "Установить" и ждем завершения инсталляции.

3.2.2 Введение в Cache ObjectScript (переменные, выражения, основные команды)

Если Cache была правильно установлена, то внизу справа на панели задач появится изображение синего кубика. Называют его Cache-куб. Если щёлкнуть правой кнопкой по Cache-кубу, появится всплывающее меню Cache (рисунок 3.10).

 Меню Cache

Рис. 3.10. Меню Cache
Работа с терминалом

Первое время нас будет интересовать единственный пункт меню — "Терминал" (рисунок 3.10). Позже мы будем использовать студию и часть функций портала управления системой. Итак, выбираем пункт меню "Терминал". Окно терминала выглядит примерно так, как показано на рисунке 3.11.

 Начало работы с терминалом

Рис. 3.11. Начало работы с терминалом

Подсказка USER> приглашает начать работу в пространстве имён (или в базе) USER. Всегда существуют две обязательных области имен %SYS и %CACHELIB и сколько угодно необязательных, в том числе USER. Пространство имён — это множество уникальных имён, обычно как-то связанных по смыслу. Одно имя может повторяться только в разных пространствах имён.

Область имён всегда можно сменить командой ZN:

USER>ZN "SAMPLES" 
SAMPLES>

Кстати, имена команд не чувствительны к регистру.

Займемся основными изобразительными средствами языка.

Расширенные формы Бэкуса-Наура

Вспомним, что формы Бэкуса-Наура применяются для описания синтаксиса языков программирования. Терминальным называется символ, который может быть записан в порождаемую строку текста без изменений. Нетерминальные символы разворачиваются на основе приведенных описаний.

Нетерминальные символы будем записывать в виде одного слова или нескольких слов, соединённых знаком подчёркивания, например, логиче-ское_выражение. Для каждого нетерминального символа должно существовать минимум одно определяющее его правило.

Такое правило имеет формат:

нетерминальный\_символ::=определение

Знак "::=" означает "определен как ". Используются ещё разделитель альтернатив в виде вертикальной черты "|", признак необязательного выбора [], признак обязательного выбора {} и признак повторяемости в виде многоточия ". . . ".

Символ \sqcup в записи синтаксиса обозначает пробел. Символ \hookleftarrow — конец строки — соответствует нажатию клавиши Enter.

Заметим, что из-за сложности разбора полного синтаксиса для начинающих в этой главе будут приводиться только неполные описания, достаточные для усвоения основ. За деталями следует обращаться к материалам фирмы InterSystems, например, выбрав позицию "Документация" (рисунок 3.10).

Основные команды COS

В одной строке можно размещать несколько команд. Определение командной строки для работы в терминале:

командная\_строка ::= команда[\sqcupкоманда...] \hookleftarrow

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

Иногда можно задать несколько аргументов команды, разделенных запятыми. Если хотите, можно после запятых помещать один или несколько пробелов. Можно пробелов после запятых не делать вообще.

В число аргументов команд ввода (READ) и вывода (WRITE) можно включать символы форматирования:

  1. переход к новой строке задается символом восклицательный знак (!);
  2. табуляция отмечается знаком вопроса (?), за которым следует номер позиции в строке, с которой продолжается вывод.

Команда WRITE обеспечивает вывод информации в терминале. Допускается использование как полного имени команды WRITE, так и сокращенного до одной буквы W.

Синтаксис команды WRITE:

W[RITE][:постусловие]\sqcup[форматирование | аргумент\_WRITE], \dots,

где форматирование—один из символов !, ?, \#;

за символом ? следует число;

аргумент\ WRITE — переменная, константа или выражение.

Постусловия —это условия, при выполнении которых команда будет исполнена, иначе команда пропускается. Необходимость понятия аргумент станет понятна при изучении косвенности (раздел 3.2.4).

Заметим, что все имена команд не чувствительны к регистру.

В конструкции "?число", аргумент не должен превышать 32767. Да и зачем нам такое число пробелов? Числа меньше нуля или 0 не сдвигают маркер. Дробная часть числа просто отбрасывается и аргументом считается оставшаяся целая часть. Иначе говоря, минимальный шаг — это знакоместо.

WRITE без аргументов выводит на терминал имена и значения всех существующих на данный момент в памяти переменных, называемых локала-ми. Выполните командную строку W 0, ?20, "a", ?40, "b", !, 0 , попытавшись предсказать результат до выполнения команды на машине.

Применение перехода к новой странице — знак диез (#) — в общем случае имеет смысл, только если печатается твердая копия (в COS можно перенаправлять вывод на любое устройство). Команда W # очищает экран.

Присваивание выполняется командой SET. Её формат:

S[ET][:постусловие]\sqcup [присваивание][,присваивание \dots]

Присваивания являются аргументами команды.

Присвоим переменной x значение 1 командой SET\ x=1\rfloor . Проверить, была ли создана переменная x, можно, набрав команду WRITE\ x\rfloor. Результатом выполнения этой команды является вывод на экран значения переменной x. Действительно оно равно 1 (листинг 3.1).

USER>SET x=1
USER>WRITE x 1
1
USER>

Пример 3.1. Присваивание и выдача значения переменой

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

Вы, конечно, заметили, что редактор терминала — строчный. Например, набрав WRITTE x, мы можем клавишей — подвести знак маркера к лишней букве "T" и удалить её клавишей Delete.

Выполнявшиеся ранее команды запоминаются. Последняя выполненная команда вызывается клавишей \uparrow. Каждое нажатие на неё вызывает предыдущую команду, пока все сохранённые записи не исчерпаются. Клавиша \downarrow используется для обратного прохода по этим же командам.

Вспомним, что командные слова не чувствительны к регистру, так что в дальнейшем позволим себе вольности и будем писать их и заглавными и строчными буквами.

Командные слова сокращаются, как правило, до одной буквы. Так, вместо строки SET x=1 можно написать S x=1. Если же нужно создать несколько переменных, то это можно сделать следующим образом:

|USER>S z=1, Ы="", h=1.2

Для проверки значений всех существующих на текущий момент переменных можно распечатать их значения при помощи команды WRITE без параметров.

Замечание. Cache одинаково хорошо работает с обеими половинами таблицы ASCII. Так что кириллица используется без ограничений.

В дальнейшем изложении знак \hookleftarrow проставляться не будет, так как его применение достаточно очевидно — обозначение конца командной строки и конца ввода.

Синтаксис команды READ ввода данных с терминала:

R[EAD][:постусловие]\sqcup[[подсказка,]аргумент]

В качестве аргументов используются имена переменных.

Форматирование включается в подсказку.

При исполнении команды система ждёт ввода данных Завершается ввод клавишей Enter. Система позволяет ограничить время ввода. Если набрать  R x:3 и ничего не вводить, то через 3 секунды ожидание ввода прекратится (листинг 3.2).

USER>R x:3 USER>
Пример 3.2. Установка времени ожидания

Точно также можно ограничить количество вводимых символов. Так, команда R x#4 позволяет ввести не более четырёх символов. Можно сочетать оба ограничения # и :. Например, R x#4:8.

Команда READ позволяет вводить значения с любого внешнего устройства, но мы этот вариант рассматривать не будем.

Примеры команды приведены в листинге 3.3.

USER>R ?10,"Введите ваше имя: ",nn
Введите ваше имя: Николай 
USER>R ?5,"Введите ваше имя:  ",nn,!,?5,"Фамилию: ",sn
Введите ваше имя: Николай
Фамилию: Бессарабов

Пример 3.3. Команда READ

Каждое введенное значение завершается нажатием на клавишу Enter. Проверьте командой WRITE введенные значения фамилии и имени.

Стирать созданные переменные можно командой KILL, сокращённо K. При этом KILL без параметров удаляет все локальные переменные. В варианте "KILL список_имён" удаляются все указанные переменные, а "KILL (список_имён)" удаляет все переменные кроме указанных (листинг 3.4).

USER>K   s a=1,b=2,c=3,d=4,bc=7 7 W

a=1
b=2
bc=77
c=3
d=4
USER>K a,b W
bc=77
c=3
d=4
USER>K (c,d) W
c=3 d=4 USER>

Пример 3.4. Команда Kill

В первой командной строке командой K мы удалили все имевшиеся локальные переменные и создали локалы a, b, c, d, bc. Обратите внимание, что здесь после K стоит ровно два пробела. Во второй командной строке "K a, b W" удаляются переменные a и b и выводятся все оставшиеся локалы. В третьей строке "K (c, d) W" удаляются все переменные, кроме c и d, то есть удаляется bc.