Лекция 10 (лекции (2002)), страница 2

2019-09-19СтудИзба

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

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

Онлайн просмотр документа "Лекция 10"

Текст 2 страницы из документа "Лекция 10"

Иногда нарушается именная эквивалентность типов. В Си неявно пролезает структурная эквивалентность типов, если используем одинаковые структурные ТД в разных модулях:


m1.c struct S { int a; int b; }

void f(struct S x);

m2.c struct S1 { int x; int y; }

extern void f(struct S1 y);

struct S1 a;

f(a);

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

В С++ эта проблема решена за счёт кодирования имён. Страуструп предложил приём: для каждой внешней процедуры f вместо соответствующего имени, которое дал пользователь, на самом деле ей присваивается закодированное имя, которое кодирует и имена параметров и возвращаемый тип функции, возможно, не имеющее никакой лексической нагрузки, что-то вроде f@#_…, но гарантируется уникальность индификатора. И в данном примере ошибка будет найдена, не на стадии трансляции (так как она раздельная и независимая), а на этапе сборки программы.

Концепция типов ориентирована на надёжность и эффективность. Эффективность концепции в том, что поведение ТД определяется строго операциями (и, как следствие, контроль и оптимизация компилятором), но традиционные ЯП страдают с точки зрения гибкости.

Тут возникают две проблемы:

1)Множественность ролей с точки зрения ТД (Янус-проблема).

Тип характеризует содержательную роль объекта ЯП, но этих содержательных ролей может быть много, а мы вынуждены одну из них выделять как главную и использовать её как единственную роль. Традиционные ЯП не знают адекватных средств решения проблемы. Единственная возможность – использование объединений:

T1

.

union T .

.

TN

Но это тоже не адекватное средство как с точки зрения надёжности, так и с точки зрения удобства программирования.

Адекватное решение только в ООЯП.

2)Полиморфизм (Множественность форм).

Тесно связано с 1) – это множественность форм с точки зрения набора операций. Одной операции может соответствует, вообще говоря, множество форм. Например, операция сложения «+»: целое сложение, вещественное сложение, конкатенация двух строк, сложение двух векторов или двух матриц. Эта проблема разрешается с помощью статического перекрытия операций. Или метод Draw(); у объекта, но своя форма для каждого ТД (вспомним курс машинной графики). Есть: статически полиморфные операции (на этапе трансляции знаем множество ТД и для каждого ТД известно какую форму приобретает операция «+») статически полиморфные языки в некотором смысле средство решения этой проблемы, но в некоторых случаях не можем предвидеть, какого типа будет объект. Например, графическая библиотека использует зафиксированный на этапе трансляции набор объектов. Компилятор выберет нужный Draw();. Если мы хотим добавить в библиотеку новый объект, то мы должны добавить новый ТД, видимо, с помощью соответствующего объединения и изменить обращение к процедуре Draw(); во всей библиотеке, следовательно, серьёзные изменения в исходном коде и перетрансляция всей библиотеки. В традиционных ЯП только статический полиморфизм, основанный на понятии объединения и перекрытия имён во время трансляции. По настоящему решается в ООЯП, где есть динамическое связывание методов (виртуальный метод С++, все методы в Java и C#).

П.2. Логический модуль

ТД = множество операций + множество значений

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

Новые ТД можно определять и на Паскале и на Си, но там нет конструкторов, подчёркивающих дуализм.

С этой точки зрения ЯП разделяются на:

Модульные языки: вводится понятие контейнера, объединяющего множество операций и множество значений. Модуль не является ТД. Модульные языки: Ада, Модула 2, Оберон.

Языки с классами: класс – это сущность, содержащая данные и обладающая набором операций. Класс как бы является универсальной обёрткой, в отличие от модуля, который является более общей конструкцией, и его основное предназначение - определять ТД. Но и может использоваться как модуль. В языки с классами понятие модуля пролезает, но оно уже несколько отлично: это понятие пакета и пространства имён. Языки с классами: C++, Java, C#.

Delphi похож на Модулу 2 (по модульной структуре), но и является языком с классами, в этом проявляется его двойственная природа (он был создан на основе Турбо Паскаля, но в него были добавлены и другие концепции).

Модульные ЯП.

Есть понятие unit. В Delphi:

u nit имя;

interface

[набор объявлений]

implementation

реализация

end имя.

Доступно другим модулям с помощью конструкции uses. Это набор объявлений типов, переменных и процедур. Все такие процедуры должны быть реализованы в implementation.. Каждый модуль представляет сервис – набор услуг, описанных в интерфейсе. А вспомогательные процедуры и ТД - описываются в реализации. Модуль может описывать 0 (набор констант), 1 или несколько ТД. Модуль более общее понятие, чем ТД, но, в частности, может служить для описания ТД.

Надо иметь сервис для доступа к этому модулю. У нас есть клиентские модули, которые используют сервис и сервисные модули, которые его предоставляют. Все клиентские модули используют конструкцию: uses список имён модулей. Это значит, что все имена, описанные в интерфейсной части становятся непосредственно видимыми в клиентском модуле. Два базовых понятия, связанных с понятием логического модуля: unit и пространство имён.

Модули структурируют пространство имён:


M1 M2 M3 …

Имена: описанные в интерфейсе и реализационные. Глобальное пространство имён состоит из имён описанных в интерфейсе. Но непосредственно видимыми (мы их можем употреблять без каких-то пояснений) являются имена модулей. В Delphi программи состоит из набора юнитов и хменанепосредственно видимы. Конструкция uses, .которую мы можем употреблять либо в начале интерфейсной части, либо в начале реализационной, делает все имена из соответствующего модуля непосредственно видимыми. Но имена могут конфликтовать. И помнить все имена из всех модулей практически невозможно. Поэтому говорим,,чоменавдмытолько потенциально. Для решения этой проблемы в ЯП было введено понятие уточнения (квалификации) имени – это конструкция, указывающая к какому модулю относится имя.

Qualifying в Delphi: имя_модуля.имя. Имена модулей должны быть разные. Для средних проектов (не более 100.000 строк) это не сильное ограничение. Как следствие, на Delphi супербольших проектов не пишут.

Есть клиентские и сервисные модули. Клиентские являются и сервисными, за исключением главной программы., которая является только клиентским модулем и её вид несколько иной:


program имя;

uses …;

объявления

begin

end имя.

В Модуле 2 сделано гибче. В Delphi одна физическая единица unit (один файл) разбивается на две логические части, а тут и интерфейс и реализация – это отдельные модули (файлы):


DEFINITION MODULE имя;

набор объявлений

END имя.

Для него может существовать модуль реализаций (должны быть реализованы все процедуры из модуля объявлений и тут могут быть вспомагательные ТД и процедуры):


IMPLEMENTATION MODULE имя;

реализация

END имя.

Есть три вещи: определение (или интерфейсная часть), реализация и использование (сокращённо – OPU (принцып РОPU: разделение OPU)). В традиционных ЯП эти три вещи предельно физически разделены:

stacks.MOD - реализация

stacks.DEF - определение

import - использование

Модула 2:

1) IMPORT список имён модулей

В Delphi надо было уточнать только конфликтующие имена. А в Модуле 2 все эти имена становятся потенциально видимыми и их надо уточнять.

IMPORT InOut;

InOut.Writeln - и так с любыми именами из модуля InOut.

Иначе компилятор скажет, что не знает имени Writeln.

Есть альтернативная форма:

  1. FROM имя модуля IMPORT список имён

Эти имена становятся непосредственно видимыми:

FROM InOut IMPORT writeln, writestring;

writeln;

writestring(s);

При конфликте имён надо их квалифицировать.

Это разделение в Модуле 2 сделано для удобства программистов: мы пишём один раз, а читаем много. Все стандартные имена описаны по крайней мере в help, но имена из модулей сторонних поставщиков нигде не описаны. Когда у нас есть модуль описаний, намного удобнее читать, потому, что если описание перемешано с реализацией, нам приходится пролистывать огромные тексты процедур. Именно по этой причине Borland поставлял все версии Паскаля с утилитой типа grep, которая как раз и позволяла выбирать интересующие нас вещи. В Модуле 2 имя – либо стандартное (их мало так как описание языка всего 40 страниц), либо описано в этом модуле, либо опиисано в конструкции FROM.

Оберон: Запрещена конструкция FROM…

IMPORT список имён модулей

И все имена из других модулей надо уточнять: тяжело писать, но легко читать.

Все эти понятия модульности сформировались ещё в 70-е годы.

Разделение OPU – это хорошо и содержательно, так как программист не обращает внимания на реализацию и её детали, а на определение и то, что ему нужно от каждого конкретного сервиса. Но современные ЯП отходят от разделения O и P. OP и U разделены – это аксиома. Но O и P в современных ЯП слиты воедино.

Оберон (наследник Модулы):

MODULE имя;

IMPORT

объявления

begin

операторы

end имя.

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

П ример:

MODULE Stacks;

TYPE Stack *=

record

end;

procedure Push*(var S:Stack; X:INTEGER);

END Stacks.

Это неудобно: описание и тела процедур в одном месте, а нас могут интересовать всего лишь параметры. Но тот же подход в Java и C#, то есть там тоже слиты воедино O и P (В С++ могут быть разделены, а здесть требуется, что они должны быть объединены). А концепция, чтобы ничего не было потеряно с точки зрения удобства пользователя, здесь не пострадала, так как эти ЯП уже часть системы программирования.

Оберон: Тут есть простейшая утилита, автоматически генерирующая интерфейс (так называемый псевдомодуль), расписывающий все публичные имена , являющиеся частью системы программирования:

DEFINITION имя;

type stack = …;

procedure push(…);

END имя;

В Java есть утилита Javadoc, генерирующая интерфейсы класов (плюс вставляет ссылки на документации классов из других модулей, на классы которых ссылаюся параметры данных классов). В тексте программы возможны комментарии двух видов:

/* … */

/** … **/

Комментарии, последнего вида автоматически вставляются в текст документации.

В Паскале существовали интерфейсные файлы ….int.

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