Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

AlgStr / Библиотека / ЛЕКЦИИ / PZ01 / Определение данных

.txt
Скачиваний:
32
Добавлен:
23.03.2015
Размер:
10.86 Кб
Скачать
Средства определения данных позволяют создавать и удалять отношения, определять альтернативные представления отношений и специфицировать способы доступа (индексы и т.д.), которые будут поддерживаться в базе данных. Средства определения данных языка описывают структуры данных, предоставляемые системой, в которой функционирует язык.


Абстрактные типы данных В первых ЯП высокого уровня (например, FORTRAN, COBOL) создание пользовательских типов данных ограничивалось подпрограммами. По мере развития концепции типов данных в ЯП появились средства для определения и реализации абстрактных типов данных , включающих в себя определение как множества допустимых значений, так и операций - посредством подпрограмм. Развитие понятия "тип данных"
Мы уже говорили о том, что на аппаратном уровне нет различия между битовыми строками, представляющими целые и вещественные числа или символы. И, соответственно, возможные проблемы при выполнении арифметических операций решаются с помощью контроля типов. Первоначально в ЯП тип данных определялся как множество допустимых значений некоторой переменной. То есть, фактически, тип ассоциировался с отдельной переменной - каждое объявление определяло имя переменной и ее тип.
В ЯП Pascal понятие типов данных было расширено до общего определения типа, которое уже можно было применить к множеству переменных. Как мы уже знаем, определение типа данных включает описание структуры ОД вместе с возможными значениями, которые связываются с этой структурой. Когда надо объявить конкретный ОД определенного типа, достаточно указать имя переменной и имя этого типа. В дальнейшем понятие типа данных превратилось в представление о типе как о множестве ОД.
Естественным образом это понятие также включило набор операций над этими объектами. Мы показали, что для элементарных типов данных (например, вещественных или целых чисел) в ЯП предусмотрены способы объявления переменных и набор операций, что обеспечивает предопределенность способа обработки этих чисел. И если понимать инкапсуляцию, как сокрытие от программиста механизмов обработки данных, то можно сказать, что представление целых и вещественных чисел инкапсулировано в ЯП. Абстракция данных
Чтобы распространить принцип инкапсуляции также и на пользовательские типы данных, надо определить абстрактные типы данных как совокупность множества объектов данных (возможно различных типов) и набора абстрактных операций над этими ОД при условии, что пользователь нового типа данных не может манипулировать ими иначе, как только с помощью определенных абстрактных операций. Таким образом, для соблюдения принципа инкапсуляции необходимо знать лишь название типа и семантику допустимых операций.
При этом абстракция может быть эффективно инкапсулирована только тогда, когда ЯП позволяет закрыть доступ к скрытой в абстракции информации. Инкапсуляция при помощи подпрограмм Подпрограммы - это основной механизм инкапсуляции, которым можно воспользоваться практически во всех современных ЯП. Более того, на уровне проектирования программы можно рассматривать подпрограммы как абстрактные операции, определяемые программистом - в противоположность элементарным операциям, встроенным в ЯП.
Однако при этом не надо забывать о том, как в ЯП реализуются общие средства определения и вызова подпрограмм. Подпрограммы как абстрактные операции Напомним, что определение операции состоит из двух частей: спецификации и реализации. В случае подпрограммы это определяет программист при ее описании. Спецификация подпрограммы Спецификация подпрограммы сходна со спецификацией элементарной операции. Она включает: имя подпрограммы;
сигнатуру подпрограммы (в ЯП С, С++ называется прототипом), которая задает количество и порядок следования аргументов, тип данных каждого аргумента, количество и порядок следования результатов, тип данных каждого результата; действие, выполняемое подпрограммой, вернее, описание выполняемых действий. Подпрограммы, возвращающие один результирующий ОД, называют функциями.
Если же подпрограмма возвращает несколько значений или вместо явного возвращения некоторого значения просто выполняет некоторые действия, то ее называют процедурой (в терминологии языков С и С++ это тоже функция). Рассмотрим спецификацию подпрограмм на примере ЯП С++. Функции С++ можно разделить на две категории: 1) не имеющие возвращаемых значений, 2) имеющие возвращаемые значения. Первые называются функциями типа void и имеют следующий прототип: void имя_функции (тип_аргумента имя_аргумента, .);
Прототип функций другого вида представляется как: имя_типа имя_функции (тип_аргумента имя_аргумента, .); Например, вещественная функция вещественных аргументов представляется прототипом: float F2f(float x, float y); Соответствующая сигнатура имеет вид: F2f: вещественное вещественное -> вещественное Приведем также пример спецификации функции, явно не возвращающей значений, но, возможно, модифицирующей некоторые аргументы (z): void Sub3f(float x, float y, float *z);
Как видно, сама функция не возвращает никакого результата. Но символ "*" перед именем формального параметра означает, что это - параметр-переменная (в терминах ЯП Pascal). Или, иначе говоря, передача фактического параметра идет "по ссылке". Следовательно, его значение может быть модифицировано в ходе выполнения подпрограммы. Если же параметры у функции отсутствуют, то можно записать в скобках слово void или оставить их пустыми. Реализация подпрограмм
Подпрограмма реализуется с помощью СОД и операций, встроенных в ЯП. С точки зрения программного кода реализация подпрограммы определяется телом подпрограммы, состоящим из объявлений локальных данных - определяют СОД, используемые подпрограммой; операторов - задают действия, выполняемые подпрограммой. Если исходить из принципа инкапсуляции, то и объявления, и операторы должны быть инкапсулированы - так, чтобы ни локальные данные, ни операторы не были доступны пользователю.
Для использования подпрограммы извне можно только ее вызвать с определенным прототипом набором аргументов и получить предусмотренный результат. В ЯП С++ можно увидеть две основных конструкции для тела подпрограмм - в случае невозвращения и возвращения результата. В первом случае функция определяется следующим образом: void имя_функции (тип_аргумента имя_аргумента, .); {объявления локальных переменных . операторы return; // необязательная конструкция } Определение функций другого вида:
имя_типа имя_функции (тип_аргумента имя_аргумента, .); {объявления локальных переменных . операторы return значение; // возвращаемое значение // тип значения должен преобразовываться к типу функции } Определение и вызов подпрограмм Определение и активизация подпрограмм Определение подпрограммы относится к статическим свойствам программы. То есть, когда в процессе выполнения программы вызывается подпрограмма, то нужно говорить об активации последней. Также говорят о создании активации подпрограммы.
По завершении всех действий эта активация разрушается, а при последующем вызове создается новая. Таким образом, единственному статическому определению подпрограммы может соответствовать множество ее активаций во время выполнения программы. Говорят, что определение подпрограммы служит шаблоном для создания активаций. Есть определенная аналогия с определением типа и объекта данных. Можно считать активацию некоторой разновидностью ОД:
активации соответствует определенный блок памяти, хранящий относящиеся к ней данные; при создании активации (вызов подпрограммы) ей выделяется область памяти; при разрушении активации (выход из подпрограммы) память освобождается. Однако важные отличия (активация может выполняться и модифицировать другие ОД) не позволяют причислить активацию к ОД и требуют особой терминологии. Реализация определения и вызова подпрограммы
Определение подпрограммы позволяет на этапе трансляции построить некий шаблон: установить представление в памяти всех используемых ОД и получить выполняемый код для каждого из операторов подпрограммы. Этот шаблон будет использоваться для создания активации при каждом вызове подпрограммы путем копирования в отдельную область памяти. Шаблон состоит из двух частей: статической и динамической. Статическая часть называется сегментом кода и состоит из констант и выполняемого кода.
Очевидно, что эта часть не меняется в ходе выполнения подпрограммы и поэтому может использоваться многократно для разных активаций. Динамическая часть называется записью активации. В нее входят параметры подпрограммы, результат функции, локальные данные и некоторые вспомогательные данные. По структуре эта часть одинакова для всех активаций. Но, поскольку конкретные значения данных могут отличаться, для каждой активации требуется своя запись активации. На рис. 1 показано, что во время выполнения программы для каждой подпрограммы в памяти хранится только сегмент кода, а записи активации динамически создаются при вызове подпрограммы и уничтожаются по ее завершении. Рис. 1 - сегмент кода и записи активации
Во время трансляции определяется структура записи активации - как обычной записи: количество компонентов, местоположение каждого из них. Доступ к компонентам осуществляется так же, как и для обычной записи - через базовый адрес и вычисляемый сдвиг, который определяется также на этапе трансляции. Таким образом, для создания новой записи активации надо знать только требующийся размер блока памяти, базовый адрес которого и используется для доступа к компонентам во время выполнения программы.
Управление памятью при вызове подпрограммы и выходе из нее состоит в выделении и освобождении блока памяти под запись активации. Позднее мы покажем, что для этого используется стек. Аргументы также принято называть формальными параметрами Часть 2. Лекция 2 Часть 2. Лекция 3
Класс:
элемент данных языка, для определяемая пользователем
которого известно множество структура, элементы которой
значений, форма представления, являются ранее определен набор операций. ными типами данных и классами,
и множества функций,оперирующих с ним.
--------------------------------------------------------- Переменная: Объект:
область памяти, содержащая переменная, содержащая
структуру данных определенного структуру данных, определенную
типа. как класс.
--------------------------------------------------------- Операция: Переопределение операторов:
операция над переменной интер- функция, определенная для объек претируется по отношению к тому тов указанного класса может быть
БТД, к которому относится пере- вызвана в виде одной из стандарт менная (так операция '+' ных операций языка Си, которая
по-разному интерпретируется для переопределяется, если операндом
переменных типа int и double). ее является объект класса, а не
переменная БТД.