PROGLANG (Лекции), страница 3

2019-05-11СтудИзба

Описание файла

Файл "PROGLANG" внутри архива находится в папке "Лекции". Документ из архива "Лекции", который расположен в категории "". Всё это находится в предмете "языки программирования" из 5 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Онлайн просмотр документа "PROGLANG"

Текст 3 страницы из документа "PROGLANG"

заголовок

объявления

begin

операторы when ex1|ex2|...|exn

exception операторы_обработки

набор_ловушек when others

e nd операторы_обработки

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


В языке С++ исключения сопоставлены типам, а в Java все исключения выходят из класса Troughable. Для снижения накладных расходов с С++ исключения могут возбуждаться только внутри блока try {...} набор_ловушек;

try

{ операторы; }

catch (тип) catch (тип имя)  присутствует информация об объекте

{ блок_реакции } или { блок_реакции }

Блок

catch (...) {}

ловит все исключения. Оператор

throw выражение;

является эквивалентом оператора raise. Тип выражения определяет возбуждаемое исключение.

throw 1; // исключение типа int

throw «message»;// исключения типа char*

Ловушки должны описываться только в блоке try, а не где-нибудь в другом месте. Если нет блока try и вызван throw, то это эквивалентно abort. Если нет соответствующей ловушки дл я данного исключения, то исключение распространяется выше, иначе считается, что исклю­чения обработано, и выполнение продолжается с точки, находящейся сразу за блоком try. если ловушка-обработчик сама не может справится с исключением, то нужно указать throw без параметров, и исключение распространится выше.

При возникновении исключения происходит свертка стека: стек не освобождается корректным образом от сломавшихся объектов, а перед этим вызываются их деструкторы. Можно использовать функцию set_terminate

typedef void(* PVF) (void);

PVF set_terminate (PVF);

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

прототип блок;

прототип throw (список_имен_типов);

блок

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

PVF set_unexpected (PVF);


В Java, если функция возбуждает исключение, она должна предупредить об этом ком­пилятор

class C

{ ...

void f() throws (MyExc)

{ ... trow MyEsc(); ...}

}

Часть II Объектно-ориентированные ЯП

Введение


Понятие типа

Традиционные ЯП

+ Понятие АТД, инкапсуляция

Модульность, раздельная трансляция

Объект

состояние, атрибуты объекта



поведение объекта



Объекты объединяются в классы по однотипным характеристикам поведения. Классовое поведение не зависит от конкретного объекта. Объектные языки (Ada) обладают понятием объект (состояние, поведение). Язык С в грубом приближении тоже можно назвать объект­ным. Объектным языкам не хватает принципа уникальности типа объекта, что есть ООЯП, а также нет полиморфизма, когда объект реагирует по разному на одно и то же сообщение в зависимости от текущего типа объекта. ООЯП реализует все концепции традиционных языков, а к тому же концепцию разнотипных объектов (принадлежащих разным классам), полимор­физма, наследования, динамического связывания методов (виртуальные функции).

Глава 1 Наследование в ОЯП

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


Расширение типа – наследование, динамическое связывание типов появилось только в Оберон-2. В Обероне расширяемым является только тип запись.

TYPE T = RECORD TYPE T1 = RECORD(T)

X : INTEGER; Z : INTEGER;

Y : REAL; END;

END;

производный тип

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

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

Модуль определений, сгенерированный Обероном:

DEFINITION Stacks

TYPE

Stack = RECORD END;

PROCEDURE Open (VAR S : STACK);

PROCEDURE Push (VAR S : Stack; P : Node);

PROCEDURE Pop (VAR S : Stack; VAR P : Node);

...

END Stacks;

Модуль реализаций:

MODULE Stacks

TYPE

Node* = POINTER TO Node_Desc;

Stack* = RECORD N : Node END;

Node_Desc* = RECORD Next : Node END;

...

END Stacks;

Клиентский модуль

MODULE M;

IMPORT Stacks;

TYPE

T = RECORD (Stacks : Node_desc)

i : INTEGER;

END;

PT : POINTER TO T;

VAR

S : Stacks.Stack;

p : PT;

Stacks.Open (S);

p := NEW (PT);

p.i := 3;

Stacks.Push (S,P);

...

Но у Pop будут проблемы с идентификацией типа. Pop-ом надо доставать только базовый тип, а потом разбираться, что мы достали. Динамическая проверка типа производится с помощью стражей типа

P is PT

Результат логического типа, поэтому можно использовать его в условных конструкциях. Поэтому, если

W = RECORD (Stacks.Node_desc)

Z : REAL;

END

Тогда можно написать

IF P1 is PT THEN

P1(PT).i = ...

ELSIF P1 is PW THEN

P1(PW).z := ...

END;

Запись P1( T’) означает, что надо трактовать тип P1 как T’. Можно провести групповую проверку типа, но проблема модификации кода из-за большого количества переключателей остается.

WITH P1 : PT DO

P1.i := ...

...

END;

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

TYPE

Figure = POINTER TO Figure_Desc;

Figure_desc = RECORD

Next : Figure;

X, Y : INTEGER;

END;

...

В другом модуле можно написать

TYPE

Line = PONTER TO Line_Desc;

Line_Desc = RECORD (Figure_Desc)

X2, Y2 : INTEGER;

END;

Rect = POINTER TO RectDesc;

Rect_Desc = RECORD (Figure_Desc)

H, W : INTEGER;

END;

...

Процедура отрисовки

PROCEDURE DrawLine (R : Line);

PROCEDURE DrawRect (R : Rect);

PROCEDURE Draw... ( ... );

...

Процедура отрисовки всех объектов

PROCEDURE DrawAll;

VAR P : Figure;

BEGIN

P := List;

WHILE P#NIL DO

IF P is Line THEN

DrawLine (P(Line))

ELSEIF P is Rect THEN

DrawRect (P(Rect))

ELSEIF

...

END;

P := P.Next

END

END;

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

TYPE

DrawProc = PROCEDURE (P.Figure);

MoveProc = PROCEDURE (P.Figure : Figure; DX, DY : INTEGER);

...

Figure_Desc = RECORD

Next : Figure;

X, Y : INTEGER;

Draw : DrawProc;

Move : MoveProc;

END;

PROCEDURE DrawLine (P : FIGURE)

...

BEGIN

WITH P.Line DO  аналогично и в DrawRect

...

END

END DrawLine ;

Тогда отрисовка всех фигур станет приятней

PROCEDURE DrawAll;

BEGIN

P := List;

WHILE P#NIL DO

P.Draw (P);

P := P.Next;

END

END DrawAll;

В данном случае DrawAll не надо переписывать при добавлении новой фигуры. Таким образом вручную моделируется полиморфизм, что опять же небезопасно – тот ли указатель передаем, правильно ли проинициализирован обработчик?


Если класс X наследует класс Y, память будет распределена линейным образом


X

Y

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

class T : public T1; public T2

{ ... };

При этом классы Т1 и Т2 должны быть не родственными, проблемы возникают, когда необходим доступ к полям предков.


ios T1 = T1


T2 T3

istream ostream

T


iostream

Чтобы объект Т1 не дублировался в памяти, нужно использовать ключевое слово virtual.

class T2 : virtual public T1;

class T3 : virtual public T1;

class T : public T2, public T3;

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

Проблема возникает при множественном наследовании. Метод языка SmallTalk, использующий цепную модель, не совсем эффективен по скорости, но эффективно использует память. Пример:

a) X  Y

X& x=y; // тут всё понятно

б) X,Y  Z

Y& y=z; // а тут начинается мухлёж

Компилятор должен преобразовать адреса, в данном случае это произойдёт статически на этапе компиляции. Но если модель наследования более сложна:

X X X – память используется не эффективно

Y

Y Z X

Y

T

T

Поэтому для предотвращения дублирования объектов в памяти используют виртуальное наследование:

class Y : public virtual X{..};

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5288
Авторов
на СтудИзбе
417
Средний доход
с одного платного файла
Обучение Подробнее