Процессы интерпретации и компиляции. Средства объектно-ориентированного программирования в Паскале. Конструирование программ на основе иерархии объектов.

 

 

Процессы трансляции: компиляция и интерпретация

Системой программирования будем называть комплекс программных средств, предназначенных для кодирования, тестирования и отладки программного обеспечения. Такие комплексы, как правило, включают следующие программные модули:

·        Текстовый редактор, служащий для создания текстов исходных программ.

·        Транслятор с соответствующего языка.

·        Компоновщик (редактор связей), позволяющий объединять несколько оттранслированных объектных модулей, порождаемых компилятором, в одну программу.

·        Библиотеки прикладных программ, содержащие в себе наиболее часто используемые подпрограммы в виде готовых объектных модулей.

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

·        Отладчик (debugger), выполняющий программу в заданном режиме (например, пошаговом) с целью поиска, обнаружения и локализации ошибок.

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

По типу выходных данных различают два основных вида трансляторов:

·        Компиляторы, компилирующие окончательный выполнимый код;

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

Таким образом, компиляторы переводят весь исходный модуль на машинный язык в самостоятельный исполняемый файл. А интерпретаторы последовательно переводят на машинный язык каждый оператор исходного модуля и сразу же выполняют его.

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

Окончательным выполнимым кодом являются приложения, реализованные как EXE-файлы, DLL-библиотеки, COM-компоненты. К интерпретируемому коду можно отнести байт-код JAVA-программ, выполняемый посредством виртуальной машины JVM.

Языки, формирующие окончательный выполнимый код, называются компилируемыми языками. К ним относятся языки С, C++, Fortran, Pascal. Языки, реализующие интерпретируемый код, называются интерпретируемыми языками. К таким языкам относятся язык Java, LISP, Perl, Prolog.

 

Средства ООП в языке Pascal

Идеи объектно-ориентированной методологии. В настоящее время растет популярность методологий программирования, ориентированных на данные. В первую очередь, это объектно-ориентированное программирование (ООП). Объектно-ориентированная методология проектирования программ основана на концепциях «упрятывания» информации и абстрактных типов данных. Такой подход рассматривает все такие ресурсы как данные, модули и системы в качестве объектов. Каждый объект содержит некоторую структуру данных (или тип данных), обрамленную набором процедур (методов), предназначенных для манипулирования этими данными. Используя эту методологию, программист может создать свой собственный абстрактный тип и отобразить проблемную область в эти созданные им абстракции вместо традиционного отображения проблемной области в предопределенные управляющие структуры и структуры данных языка программирования. Подобный подход является более естественным, чем методологии, ориентированные на обработку данных, из-за возможности использовать в процессе программирования разнообразные виды абстракции типов данных.

Основные шаги разработки программы, предусмотренные данной методологией:

·        определить проблему;

·        развить неформальную стратегию, представляющую общую последовательность шагов, удовлетворяющую требованиям к будущей программе;

·        формализовать стратегию

·        идентифицировать объекты и их атрибуты;

·        идентифицировать операции;

·        установить интерфейсы;

·        реализовать операции.

 

Реализация идей ООП в Паскале. Начиная с версии 5.5, Турбо-Паскаль охватывает метод проектирования программ на основе ООП. Объект в Турбо-Паскале – это структура данных, содержащая поля данных различных типов и заголовки методов и обобщающая структуру «Запись» (record). Синтаксис описания объекта:

<ИмяПотомка>=object<ИмяПредка>

<поле>; <поле>; ... <поле>;

<метод>; <метод>; ... <метод>;

end;

В отличие от записи, полями объекта могут быть, кроме данных, еще и методы, обрабатывающие эти данные. Метод – это процедура или функция, объявленные внутри описания объекта: procedure <Заголовок> (<Параметрl>,<Параметр2>:intеgеr);

Метод имеет доступ к полям данных объекта, не требуя передачи их ему в виде параметров.

Объявление метода внутри объявления объектного типа содержит только заго­ловок. Тело метода определяется вне объявления объекта. Его заголовок должен содержать имя объекта, которому принадлежит метод. Например:

procedure <ТипОбъекта.Метод> (<Параметрl>,<Параметр2>:integer);

begin

... {Описание метода}

еnd;{Конец описания метода}

Методы подразделяют на статические и виртуальные. Виртуальный метод отлича­ется от статического тем, что реализующий его код подсоединяется к исполняемой программе не в процессе компиляции, а в процессе выполнения, что достигается так называемым поздним связыванием. Это дает возможность строить иерархию объек­тов с одинаковыми названиями методов, реализуемыми, однако, различными кодами. Синтаксис виртуального метода:

procedure <Метод> (<Параметрl>,<Параметр2>:integer):virtual;

Кроме обычных процедур и функций, Турбо-Паскаль 6.0 реализует два специ­альных типа методов: конструктор и деструктор.

Конструктор – это специальный метод, инициализирующий объект, содержащий виртуальные методы, он объявляется специально зарезервированным словом constructor. Конструктор инициализирует объект путем установления связи между объектом и специальной таблицей виртуальных методов, содержащей адреса кодов, реализующих виртуальные методы. Конструктор может также использоваться для инициализации полей данных объекта.

Деструктор – это специальный метод, освобождающий память «кучи» от дина­мических объектов. Он объявляется с использованием специально зарезервированного слова destructor.

Основными отличительными свойствами объекта являются

·        инкапсуляция – объединение записей с процедурами и функциями, работаю­щими с этими записями;

·        наследование – задание объекта, затем использование его для построения ие­рархии порожденных объектов с наследованием доступа каждого из порожденных объектов к коду и данным предка;

·        полиморфизм – задание одного имени действию, которое передается вверх и вниз по иерархии объектов, с реализацией этого действия способом, соответствую­щим каждому объекту в иерархии.

 

Рассмотрим смысл каждого из перечисленных свойств на примере построения экране дисплея точек разных цветов (звездного неба).

Инкапсуляция.

Основой решения задачи является задание позиции отдельной точки на экране, описываемого координатами X и Y. Для задания координат подходит тип «запись»:

Pozition = record x, y : integer; end;

Далее может быть необходимо задать значения координат:

procedure Init(CoordX,CoordY:integer); begin Х:=CoordX; Y:=CoordY; end;

Затем потребуется знание фактических значений координат. Для этого две функции:

function GetX: integer; begin GetX:=Х; end;

function GetY: integer; begin GetY:=Y; end;

Процедура Init и функции GetX и GetY должны работать только с полями записи Pozition. Введение объектов позволяет зафиксировать это положение, объявив и поля, и действия над ними в единой конструкции:

Pozition = object

Х,Y:integer;

procedure Init(CoordX, CoordY : integer);

function GetX: integer; function GetY: integer; end;

Процедура Init и функции GetX и GetY являются методами объекта Pozition. Для инициализации экземпляра типа Pozition достаточно вызвать его метод, если бы он был полем записи:

var FirstPozition: Pozition;

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

FirstPozition.lnit(10,15);

Метод задается так же, как и процедура в модуле: внутри объекта записывается заголовок (как в секции interface модуля); при этом все поля, используемые метдом, должны предшествовать его объявлению. Определение метода (расшифровка действий) происходит вне объявления объекта. Имена формальных параметров метода не могут совпадать с име­нами полей данных объекта. Имя метода должно предваряться названием типа объекта, которому метод принадлежит, сопровождаемым точкой. Например,

procedure Pozition.Init(CoordX, CoordY : integer);

begin Х:=CoordX; Y:=CoordY; end;

Также как модуль скрывает детали реализации процедур от пользователя, объ­ект может скрывать свои поля и методы. Для этого используется ключевое слово private (личный). Личные поля и методы доступны только внутри метода. Объявле­ние выглядит следующим образом:

type ObjectName=object

<поле>; ... <поле>; <метод>; ... <метод>;

private

<поле>; ... <поле>; <метод>; ... <метод>;

end;

 

Наследование.

Рассмотрим точку с координатами (Х,Y). Её нарисовать, стереть, изменить её цвет, переместить и т.п. Создадим объект с такими возможностями:

Point=object

Х,Y: integer;

procedure Init(CoordX,CoordY : integer);

function GetX: integer; function GetY: integer;

Visible: Boolean; Color: Word;

procedure Init(CoordX,CoordY: integer; InitColor: word);

procedure Вlind(CoordX,CoordY: integer); {стирает точку}

procedure Jump(NextX,NextY : intеgеr); {перемещает точку} end;

Заметим, однако, что поля X,Y и методы GetX, GetY практически совпадают с соответствующими полями и методами объекта Pozition. Паскаль предоставляет возможность учесть эту ситуацию. Следует считать тип объекта Point порожденным типом Pozition, записав это следующим образом:

Point=object(Pozition)

procedure Init(CoordX,CoordY : integer);

function GetX: integer; function GetY: integer;

Visible: Boolean; Color: Word;

procedure Init(CoordX,CoordY: integer; InitColor: word);

procedure Вlind(CoordX,CoordY: integer); {стирает точку}

procedure Jump(NextX,NextY : intеgеr); {перемещает точку} end;

Объект Point наследует свойства объекта Pozition. Поля Х,Y явно не даны в Point, но Point ими обладает благодаря наследованию, т.е. можно, например, написать: Point.X:=17;

Смысл ООП заключается в работе с полями объекта через его методы.

 

Полиморфизм. Предположим, надо создать объект «кружок». Очевидно, новый объект должен иметь предком объект Point, обладая всеми его свойствами, кроме того, быть больше по размеру. Однако, ясно, что «высветить» точку и закрашенную окружность не удастся одними и теми же командами. Турбо-Паскаль разрешает сохранить потомку имя родительского метода, «перекрывая» его. Чтобы перекрыть родительский метод, надо просто задать его с тем же именем, но с другим телом (кодом) и, если необходимо, с другим набором параметров. Такой метод делается виртуальным и к его объявлению добавляется слово virtual. Применение виртуальных методов налагает ограничения на процедуры инициализации, которые должны записываться с зарезервированным словом constructor и имeть общее имя Init.

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

Деструктор комбинирует шаг освобождения памяти в «куче» с некоторыми другими задачами. Метод деструктора может быть пустым, поскольку работу выполняет не только код тела, но и код, генерируемый Паскалем в ответ на зарезервированное слово destructor.

 

ПРИМЕР ПРОГРАММЫ С ИСПОЛЬЗОВАНИЕМ ОБЪЕКТОВ

Описывается объект «Матрица» и методы – сложение матриц, печать матрицы, задание матрицы.

 

program matrix_object; const m=4;

type type_of_pole=array[1..m,1..m] of real;

     matrix=object

            pole:type_of_pole; dim:byte;

            procedure init(var A:matrix); procedure print(A:matrix);

            procedure summ(a,b:matrix; var result:matrix); end;

procedure matrix.init; var i,j:byte; a_ij:real;

begin write(' Введите размерность матрицы: ');

readln(a.dim);

for i:=1 to a.dim do begin for j:=1 to a.dim do begin

write('(',i,',',j,')= ');

      readln(a_ij);

            a.pole[i,j]:=a_ij; end; end; end;

procedure matrix.print; var i,j:byte;

begin for i:=1 to A.dim do begin for j:=1 to A.dim do write(A.pole[i,j]:8:3);

end; writeln; end; end;

procedure matrix.summ; label endproc; var i,j:byte; c:matrix;

begin if a.dim<>b.dim then begin writeln('Матрицы сложить нельзя');

goto endproc; end;

c.dim:=a.dim;

for i:=1 to c.dim do begin for j:=1 to c.dim do begin

c.pole[i,j]:=a.pole[i,j]+b.pole[i,j]; end; end;

result:=c; endproc: end;

 

 

var x1,x2,x3:matrix;

BEGIN {*** ТЕЛО ОСНОВНОЙ ПРОГРАММЫ ***}

writeln('Задание матриц'); writeln(' Матрица X:'); x1.init(x1);

writeln(' Матрица Y:'); x2.init(x2);

writeln('Печать матриц'); writeln(' Матрица X:'); x1.print(x1);

writeln(' Матрица Y:'); x2.print(x2);

writeln(' Матрица Z=X+Y:'); x3.summ(x1,x2,x3); x3.print(x3); readln; END.

 

 

Конструирование программ на основе иерархии объектов.

 

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

Инкапсуляция означает сочетание структур данных с методами их обработки в абстрактных типах данных – классах объектов. Класс может иметь образованные от него подклассы. При построении подклассов осуществляется наследование данных и методов обработки объектов исходного класса. Механизм наследования позволяет переопределить или добавить новые данные и методы их обработки, создать иерархию классов. Полиморфизм – способность объекта реагировать на запрос (вызов метода) сообразно своему типу, при этом одно и то же имя метода может использоваться для различных классов объектов.

Для различных методик объектно-ориентированного проектирования характерны следующие черты: объект описывается как модель некоторой сущности реального мира; объекты, для которых определены места хранения, рассматриваются во взаимосвязи, и применительно к ним создаются программные модули системы.

В процессе объектно-ориентированного анализа:

·        осуществляется идентификация объектов и их свойств;

·        устанавливается перечень операций (методов обработки), выполняемых над каждым объектом, в зависимости от его состояния (событий);

·        определяются связи между объектами для образования классов;

·        устанавливаются требования к интерфейсу с объектами.

Выделено четыре этапа объектно-ориентированного проектирования:

·        разработка диаграммы аппаратных средств системы обработки данных, показываю­щей процессоры, внешние устройства, вычислительные сети и их соединения;

·        разработка структуры классов, описывающей связь между классами и объектами;

·        разработка диаграмм объектов, показывающих взаимосвязи с другими объектами;

·        разработка внутренней структуры программного продукта.       

 

Hosted by uCoz