Главная » Просмотр файлов » И.Г. Головин - Конспект лекций по курсу Языки программирования

И.Г. Головин - Конспект лекций по курсу Языки программирования (1161120), страница 19

Файл №1161120 И.Г. Головин - Конспект лекций по курсу Языки программирования (И.Г. Головин - Конспект лекций по курсу Языки программирования) 19 страницаИ.Г. Головин - Конспект лекций по курсу Языки программирования (1161120) страница 192019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 19)

В функциональных ЯП это встречается– замыкание(closure).В Java есть понятие анонимного класса. До этого во всех языках функция – только на уровнеглобального действия. Inner class может быть как именованным, так и анонимным. Объекткласса существует и методы класса существуют, а имени уже нет.Понятие замыкания имеет очень много следствий и является принципиальнымрасширением парадигмы.Лямбда функции:()=>x=x+1(x)=>x+1 – нетипизированный делегатFunc1 <int,int> f;F = ((x)=>x+1)Также появились деревья выражений. Функции стали объектами первого порядка.ОПРЕДЕЛЕНИЕ НОВЫХ ТИПОВ ДАННЫХЧто представляет собой определение новых типов данных?113С этой точки зрения Языки программирования разделяют на, так называемые, старые иновые.«Старые» ЯП: ТД <-> СД (множество значений).«Современные» ЯП: тип данных <–> множество операций(набор подпрограмм, процедур илифункций).АТД(абстрактный тип данных) – это всего лишь набор сигнатур. Чтобы задать АТД,необходимо задать множество операций через задание сигнатур.Как операции становятся операциями?op1,op2,op3… – необходимо определить их свойства.Чтобы определить реализацию – добавить тело к сигнатуре – {…}.К интерфейсу ТД необходимо добавить реализацию (тела подпрограмм+ набор структурданных и переменных).Есть ли в языке С АТД? Напрашивается ответ нет, но это не совсем так.FILE* -работа только в терминах набора операцийЕсли FILE не АТД то что же это тогда? Это же набор сигнатур, а значит АТД.

Так что в С естьАТД.Никто не напишет extern int a; – так писать нельзя, нужен include.Для поддержки необходимой абстракции необходимо разделить интерфейс от реализации.В С существовал typedef – но это не определение нового типа данных(это просто синоним –говорили об этом ранее).В С++ единственная возможность определения нового типа данных – определить новыйкласс. Иногда хватает плоских классов – без иерархий.Вторая концепция – логический модуль. Логический модуль - языковая конструкция,которая имеет интерфейс и реализацию. Интерфейс – это, попросту говоря, то, чем можновоспользоваться, хотя у слова «интерфейс» много определений.Кауфман в своей книге дал такое определение: модуль – то, что проще заимствовать, чемсоздавать заново.

«Заимствовать» – использовать в разных частях программы(или в разныхпрограммах).А что же у нас в интерфейсе? В интерфейсе появляется соответствующее имя ТД, сигнатуры,реализация – раскрывает структуру ТД и, естественно, тела соответствующих подпрограмм,объявленных в интерфейсе.В яхыках Модула2, Delphi (Turbo Pascal), Object Pascal, Оберон, Ада понятие библиотечногомодуля, у которого есть 2 части: модуль определений и модуль реализаций.DEFINITION MODULE M;Объявление типов,подпрограмм,констант,переменных114END MIMPLEMENTATION MODULE M;Определение подпрограмм из DEFINITION MODULE + дополнительные ресурсы.В Turbo Pascal и Delphi модуль = unit - одна единица, в М-2 библиотечный модуль это дверазных единицы.В Модуле 2 в INOUT была определена переменная DONE – исключений то там нет.Она, вообще говоря, должна быть доступна только на чтение, но МОДУЛА 2 не даваласредств экспортировать переменную только на чтение (в Оберон уже появились такиесредства).ОДНОСТОРОННЯ СВЯЗЬ МЕЖДУ МОДУЛЯМИЧто это за связь? Связь по использованию.Есть служебные модули.

По большому счёту любой библиотечный – служебный (Servicemodules). Служебные модули представляют некие вычислительные ресурсы.Модуль – это вообще возможность объединять и экспортировать как единое целоесовокупность вычислительных ресурсов. Существуют также клиентские модули – это те,которые используют служебные модули. Служебные о клиентских ничего не знают –поэтому связь односторонняя, связь по использованию.Модуль не может использовать прямо или косвенно самого себя.Любой служебный модуль – интерфейс (.h) + реализация (.с).В каждый клиентский модуль включать .h только 1 раз.M1->M2(M1 включает M2).M->M1->M2(M включает M1, M1 включает M2).Файл .cpp может включать кого угодно, но обязательно должен начинаться с того, чтовключать свой hpp.На языке С чтобы избавить от двойного включения, включается макрос:#ifndef __имя_H__//нечто, что в проекте больше не встретится#define __имя_H__… // код файла#endifПри попытке повторного включения этот символ уже определен и не включается более.Концепция импорта должна быть явной.

Импортировать можно только то, чтоэкспортируется.В Модуле 2 есть слово export(правда только для локальных модулей).Delphi, Turbo Pascal используют uses M115Бывает видимость 2 видов - непосредственная и потенциальная (для того, чтобы имя сталодоступным, мы должны его уточнить).M.f – f описано внутри M.Если используем uses M, то можно просто f. Для чего это нужно? Для удобства.А для чего не нужно? Чем это плохо? Возникает конфликт имен! Например:Uses M1,M2,а в обоих модулях используется f.В С++ каждое пространство имен можно рассматривать как интерфейсный модуль.:: - оператор расширения области видимости в С++.Если M1,M2 доступны (с помощью include)stdstd::cinstd::endlНеудобно? Для этого сделаноusing namespace stdНо иногда это плохо – когда непонятно это твоя переменная, или из стандарта, или откудато еще – код становится плохо читаем.Читаем значительно чаще чем пишем, поэтому фашистский стиль программированияможно считать нормальным (И.Г.)Пример (Оберон)В Модуле-2 было 3 модуля(состоящих из интерфейса и реализации).

ВОбероне остались только библиотечные.DEFINITION MEND M.MODULE MEND M.Куда делся главный модуль? Модуль экспортирует процедуру безпараметров – соответствующая процедура называется командой.Если доступен М, можем писать M.p – выполняется команда из M.В окончательном варианте языка Оберон Вирт оставил 1 модуль116MODULE MEND MПокусился на святое, на некий принцип который доминировал в ЯПтого времени (70-80 годы) – разделение определения и реализации, ииспользования.Р<-O->И (реализация, определение, использование)С++ в некотором роде тоже действует по этой схеме: четкоразделены определение и реализация.

Вирт уничтожил модульопределения – отказался от священной коровы 70х годов.Любой современный ЯП (впервые в Eiffel) имеет документатор.Документаторы умеют генерировать текст и гипертекст.Так вот, в Обероне:TYPE T* … (*- значит имя импортируется)PROCEDURE P*()DEFINITION – псевдомодуль, который генерируется компиляторомВ языке АДА пакет – это модуль, интерфейсная часть которого – спецификация пакета.package M…end Mpackage body M isреализацияbegin…end MВидимость:package M isProcedure PRC...Все имена импортируются далееEND M...117PRC доступна здесь (но потенциально)Экспортируемые имена доступны потенциальноЧем АДА дает дополнительную гибкость?Перегрузка:Function “+” (x,y : T) return T;a,b,c : T;C:= a+b;Компилятор c := “+”(a,b)(Только там где T виден непосредственно).Package Def T iType T is …Function “+” (x,y:T) return T;End MA,b,c:T;C:= a+b; //не знает никакого плюсаC := Def T.”+”(b,c)//нужно так – никакого смысла перегрузки операцииВажно, что мы смотрим на приоритеты A+B*Cdef T.”+”(a, def T.”+”(b,c))// простое выражение в такую штуку? нет уж!Как решили проблему в АДА? Для использования записей инфиксных операций необходимаявная видимость1.

использовать use def Ta,b,c:Tc:=a+b;по ТД компилятор поймет какой модуль имеется ввиду(если еще def P)2. имя1 renames имя2имя1 как правило – сложное локальное.std::cout << i << std::endl;// что не так?если бы писали на АДА, то есть противоречие. Нет области видимости оператора <<. ВC++ std::<< писать не требуется, хотя << тоже в std.std::operator<<(std::cout,i)118Правило C++: при обращении к функции f(a,b) имя f ищется в локальном пространстве имени в пространствах имен ее фактических параметров. Это соглашение с пространствами имени перегрузкой операций.МЕХАНИЗМ РАЗДЕЛЬНОЙ ТРАНСЛЯЦИИЭтот механизм поддерживают все рассматриваемые ЯП, кроме Ады.

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

Можно написать «умный» линковщик, делающий объектныймодуль с нужными функциями.Чем отличаются первичные и вторичные единицы компиляции? Первичные – содержат всебе только таблицы имен, а вторичные – это объектный код. Это верно только дляодносторонней связи. Заметим также, что первичные единицы компиляции можнотранслировать независимо от вторичных.В Аде, в случае раздельной трансляции, есть специальное указание контекста: with.with M; use M;Типичный случай односторонней связи.В Оберон аналогом with является import.ДВУСТОРОННЯЯ СВЯЗЬ МЕЖДУ МОДУЛЯМИВ Ада также есть и двусторонняя связь: вложенные пакеты.package Outer is…package Inner is…end Inner;…end Outer;Единица компиляции:package M is…end M;package P is…end P;Единица компиляции:119with P;package body MP.XEnd M;package body Outer is…Type OT is …Package body Inner isOT – тут доступно (демонстрация двусторонней связи)…end Inner;…end Outer;Вложенный пакет является клиентом своего «папаши».В принципе двустороннюю связь можно имитировать и на языках Си и Си++.

Но толькоимитировать.Интерфейс мы не можем разбивать. Реализацию пакета можно оттранслировать отдельно.Как раз это нам и нужно. Естественно потом нужно будет пересобрать.Отдельно оформим спецификацию пакета:package body Outer is<все, что описано тут>…Package body Inner is separate;<видимо тут>Procedure S is separate;…end Outer;separate – это в данном случае stub(заглушка)separate (Outer)package body Inner is…end Inner;separate (Outer)procedure S is…end S;В общем случае двустороння связь возникает из-за вложенности. На этом покончим смодульными языками.АБСТРАКТНЫЙ ТИП ДАННЫХ120Интерфейс модуля дает: имя типа, набор операций. Поговорим об абстрактных типахданных.

Пример, на языке Ада:Package M isType T is …;Procedure Op(X:inout T);И где же тут абстракция? Тип T не инкапсулируется. На самом деле, язык Ада заставляетлюдей инкапсулировать типы данных.Рассмотрим пример на Модула-2:DEFINITION MODULE Stacks;TYPE Stack;<Скрытый тип данных>PROCEDURE POP(VAR S:Stack; VAR X:INTEGER);PROCEDURE PUSH(VAR S:Stack;X:INTEGER);PROCEDURE IsEmpty(VAR S:Stack):Boolean;PROCEDURE Init(VAR S:Stack);PROCEDURE Clear(VAR S:Stack);VAR Done:Boolean;end Stacks;Первичные единицы компиляции можно транслировать отдельно от вторичных. В этом ивесь смак. Только когда нам нужен исполняемый код – мы создаем объектный модуль.MODULE MainIMPORT Stacks;…S: Stacks.Stack;…BEGINStacks.Init(S);Stacks.Push(S,1);…END Main.Указатель и целое совпадают в плоских 32 – битных архитектурах. Но, например, всовременных 64-битных системах: x86/64 – 32 бита на целое, а 64 бита на адрес.

Характеристики

Тип файла
PDF-файл
Размер
1,81 Mb
Тип материала
Высшее учебное заведение

Список файлов лекций

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