памяти; большие блоки внутренней памяти резервируются и
освобождаются согласно одному методу, в то время как
каждый большой блок может быть подразделен с помощью
другого метода.
8. Объектно-ориентированные языки. Новые информационные
структуры и память для них
Одной из существенных причин, приводящих к появлению
новых языков программирования, является ограниченность
предопределенных типов данных. Их ограниченность в сложности
адаптации под конкретную задачу.
Для формализации некоторой концепции, или, другими словами,
создания нового абстрактного типа, необходимо определить как
представление объекта этого типа, так и операции над этим
объектом.
Удобным аппаратом для описания объектов нового типа обладают
объектно-ориентированные языки. Базовым понятием объектно -
ориентированного языка является класс.
Класс является типом, созданным программистом. Внешне
описание простейшего класса схоже со структурой данных. В отличие
от структур рассматриваемых ранее, в объектно-ориентированном
языке класс может включать в себя не только переменные,
определяющие новый тип данных, но и функции, реализующие операции
над этим типом данных. И данные, и функции, составляющие
класс, называются членами класса. Среди функций-членов класса
могут присутсвовать специальные функции, управляющие
инициализацией объектов такого типа - конструкторы и функции,
управляющие уничтожением обьектов - деструкторы. Они и занимаются
распределением памяти для экземпляров класса, кроме этого ими
может быть выполнена инициализация этой памяти заданными
значениями.
Мы будем рассматривать новые объекты в аспекте распределения
памяти под них. Идеология и механизмы использования классов
исчерпывающе описаны, например, в литературе [3], [4], [5].
Итак, когда в программе объявляется объект какого-либо
класса, или инициализируется указатель на объект этого типа,
вызывается конструктор класса. Его задачей является
распределить необходимую память. Память выделяется под
данные-члены класса. Коды функций-членов хранятся отдельно от
данных, а именно, в сегменте кода программы, и непосредственно
не присутствуют в реальном объекте; при этом хранится только
одна копия каждой функции, хотя объектов в программе может быть
несколько. Но, с другой стороны, поскольку эти функции
являются членами класса, они могут вызываться только после
того, как в программе созданы объекты абстрактного типа; более
того, они вызываются только для данного конкретного объекта, и
выполняемые ими действия никак не могут влиять на состояние
других объектов этого типа.
Память для данных-членов распределяется аналогично
методам, котрые описаны выше для структур ( см. Структуры PL/1
и Структуры данных по Стендишу ).
После того, как объект выполнил свою миссию в программе
он уничтожается деструктором класса: память занимаемая
данными-членами этого экземпляра класса освобождается. Причем
важно заметить, что если объект содержал какие-либо указатели на
занятую память - эта память не освобождается. Поэтому
ответственность за возможное таким образом возникновение
потерянной для системы памяти несет программист, а не компилятор.
СПИСОК ЛИТЕРАТУРЫ
1. ГРИС Д. Конструирование компиляторов для цифровых
вычислительных машин. -М.: МИР, 1975.
2. КАСЬЯНОВ В.Н., ПОТТОСИН И.В. Методы построения
трансляторов. -Н.: НАУКА, 1986.
3. РОМАНОВ В.Ю. Программирование на языке С++. -М.:
КОМПЬЮТЕР, 1993.
4. ЦИМБАЛ А.А., МАЙОРОВ А.Г., КОЗОДАЕВ М.А. Turbo C++: язык
и его применение. -М.: Джен Ай Лтд., 1993.
5. ЭЛЛИС М., СТРОУСТРУП Б. Справочное руководство по языку
программирования С++ с комментариями. -М.: МИР, 1992.