RSS    

   Реферат: Программирование, ориентированное на объекты

ектов процедурного типа, объектов-действий. Эта разновидность объ

ектов сравнительно мало используется в технике "пов

граммирования, в методологии же объектно-ориентированного под

да им отводится особая роль, роль активных объектов - акторов, оп

тации.

Процедурный тип (или сигнатура, см. pазд. II) определяет мно

во возможных действий, видов активности. Например,

TYPE Действие = PROCEDURE (Станок);

определяет сигнатуру для класса Станок. Пусть множество дей

вий над Станком ограничивается двумя:

PROCEDURE Включить (С: Станок);

PROCEDURE Выключить (С: Станок); .

Декларация VAR D: Действие определяет объект класса Действие. Та

кой объект может хранить потенциально возможное действие над Станком (т.е. "помнить", что нужно сделать) и (в подходящее вре

визироваться (самоинтерпретироваться) по отношению к стан

ку:

VAR D: Действие; C: Станок;

BEGIN...

D:=Включить;...

D(C);... D:= Выключить;... D(C); .

Операторы D(C) в этом фрагменте определяют самоинтерпретацию объ

екта D в отношении объекта С, а операторы присваивания - оп

ление объекта D потенциально возможным действием. Образно го

ря, операторы присваивания здесь "взводят курок" D, а когда D "вы

лит" и какой будет эффект от этого "выстрела" (включает он ста

нок С или выключает) определяется в общем случае логикой про

мы. Использование в программе переменных класса Действие ана

но наличию множества взведенных курков, при этом от

трелы" превращаются в треск автоматных очередей - само

таций. Учитывая, что любое действие, связанное с такой са

претацией, может переопределить объекты-действия, ло

нения подобных программ становится весьма запутанной. Основное при

менение этого механизма - моделирование сложных сис

тем.

V. СОЗДАНИЕ / УНИЧТОЖЕНИЕ ОБЪЕКТОВ

"Время жизни" объекта. - Классы памяти. - Управление ди

кой памятью. - Фрагментация. - Проблемы "висячих" ссылок и мусора. - Автоматическая память. - Локальная среда. - Активации объекта.

Объекты, существующие в программе, делятся на две категории: ста

тические и динамические. Эти категории определяются по-разному: на основе изменения состояния объектов модели и на ос

ни" объектов. Первое определение предполагает, что любой объ

ект, изменяющий свое состояние в процессе работы прог

ектами являются только константы, все объекты-переменные могут счи

чтожения объектов. В этом смысле объекты, время существования ко

кие), объекты же, время существования (жизни) которых меньше вре

нии всегда должны расцениваться как статические, пос

дание" подготавливается транслятором и ассоциация между име

нем и элементом хранения объекта существует до окончания вpемени pаботы программы.

Создание объекта следует интерпретировать как выделение па

ти под его элемент хранения. Такая интерпретация подразумевает раз

ние всего рабочего пространства памяти ЭВМ на две ка

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

ем тpанслятоpа и pаспpеделяется под статические объ

щие в системе постоянно. Например, декларация

VAR A: POINTER TO CARDINAL;

B: CARDINAL;

сообщает транслятору о необходимости "зарезервировать" в клас

тической памяти два слова под элемент хранения объекта с именем А и одно слово под элемент хранения объекта с именем В.

Динамическая память предназначается для создания временно су

ющих объектов. Этот класс памяти имеет две разновидности: соб

мять (в отличие от статической) полностью находится в рас

граммиста: по его директивам происходит выделение эле

ных элементов в "зону" свободной памяти (пул "свободных" эле

сле равносильно "уничтожению" объекта.

Автоматическая память - особая разновидность динамической, ко

рая также управляется директивами программиста, связанными с ин

претацией активных объектов (переменных пpоцедуpных типов). В этом смысле две разновидности динамической памяти делят этот класс памяти на два подкласса: память для интерпретации пас

ными алгоритмами.

Управление динамической памятью для пасссивных объектов (в даль

нейшем просто динамической памятью) реализуется на основе двух ос

новных процедур (обычно импортируемых из системного модуля):

PROCEDURE ALLOCATE (VAR A: ADDRESS; N: CARDINAL);

PROCEDURE DEALLOCATE (VAR A: ADDRESS; N: CARDINAL); .

Здесь А - свободный указатель, который укажет на выделенную об

ласть памяти (элемент хранения размером N байт) при вызове ALLOCATE и получит значение NIL (т.е. никуда не будет указывать) при освобождении этой области "из-под" А путем вызова DEALLOCATE.

Использование ограниченных указателей делает во многих от

ях целесообразным использование специальных вызовов: NEW(P) и DISPOSE(P), где VAR P: POINTER TO . (NEW и DISPOSE - псе

процедуры, их вызовы транслируются в вызовы ALLOCATE и DE

TE соответственно). Использование NEW и DISPOSE позволяет из

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

дание/уничтожение одного и того же объекта.

В целом последовательность вызовов NEW...DISPOSE (или соот

венно ALLOCATE...DEALLOCATE), в общем случае полностью оп

мая логикой программиста, порождает ряд проблем, свя

низацией и распределением свободного пространства ди

мяти. Одной из таких проблем является проблема фраг

фект фрагментации заключается в том, что рабочая область ди

ных и занятых фрагментов в общем случае может быть со

вершенно произвольным. Любой запрос программиста на создание но

кого подбора могут быть различны, но общая закономерность одна: та

кой фрагмент должен иметь размер, не меньший, чем запрашиваемый про

граммистом. Если подходящий фрагмент имеет больший размер, чем требуется, в при

ся в свободной зоне в качестве свободного фpагмента. При этом проблема фрагментации заключается в том, что эффект "дро

ния" может привести к тому, что в свободной зоне будет на

жество "маленьких" разрозненных свободных фрагментов, в со

ности составляющих достаточный объем. Тем не менее, не

тря на такой объем, запрос программиста на новый элемент памяти мо

жет получить отказ по причине отсутствия целого подходящего эле

та. Ниже приведен фрагмент программы и схема распределения ди

мической памяти, иллюстрирующие эффект фрагментации. При этом для простоты предполагается, что общий объем ди

кой памяти составляет 20 байт.

TYPE Треугольник = POINTER TO Фигура_1

Фигура_1 = RECORD

Сторона_1, Сторона_2, Сторона_3:CARDINAL

END;

Четырехугольник = POINTER TO Фигура_2;

Фигура_2 = RECORD

Сторона_1, Сторона_2, Сторона_3, Сторона_4:

CARDINAL

ЕND

VAR T1, T2: Треугольник; М1, М2: Четырехугольник;

BEGIN NEW(T1);... NEW(M1);... NEW(T2);...

DISPOSE(T1);... DISPOSE(T2); NEW(M2);...

Иллюстрация построена для момента обработки запроса NEW(M2). В этот момент времени в динамической памяти имеются два сво

мента общим объемом шесть слов, которых достаточно для вы

роса на выделение элемента хранения под объект М2^ (т.е. для объ

воляет системе выделить память под объект М2^.

Система управления динамической памятью ведет специальный спи

сок свободных фpагментов - пул памяти. При возвращении какого-либо эле

ема. Например, если в предыдущей программе изменить пос

ность обращений к динамической памяти на приведенную ниже, то описанного выше отказа по памяти не произойдет:

BEGIN NEW(T1);...NEW(T2);...NEW(M1);...

DISPOSE(T1);...DISPOSE(T2);... NEW(M2);...

Здесь при обработке запроса NEW(M2) в пуле динамической па

ти будет находиться один свободный фрагмент объема шесть слов, об

ный "склеиванием" элементов Т1^ и T2^, выполненным при об

роса DISPOSE(T2). В общем случае вопросы эффективной ре

ализации управления динамической памятью, обеспечивающей ми

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

му. Здесь мы только заметим, что с организацией выделения "пер

вого подходящего" фрагмента памяти в программировании свя

ют такие термины как "хип" или "куча", относящиеся скорее к про

фессиональному жаргону, чем к научно-методической тер

ципы организации динамической памяти.

Организация корректной последовательности запросов связана, кро

ме того, как минимум еще с двумя проблемами. На том же жар

не их называют проблемы "висячих ссылок" и "мусора", а оп

ют они две стороны одной и той же ошибки, заключающейся в некор

ной работе с указателями. Следующий фрагмент программы ил

рует возникновение таких ошибок (тип "Треугольник" описан выше).

VAR T1, T2:Треугольник;

BEGIN NEW(T1);...T2:=T1;...

DISPOSE(T1); (* T2-"висячая ссылка" *)

............

NEW(T1);...NEW(T2);...

T1:=T2; (* Остался "мусор" *)

Из этого примера понятно, что "висячая ссылка" - это ука

кладной программы, указывающий на свободный фрагмент ди

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.