Редактирование: Языки программирования, 13 лекция (от 17 октября)
Материал из eSyr's wiki.
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
- | [[Языки программирования, 12 лекция (от 12 октября)|Предыдущая лекция]] | [[Языки программирования, 14 лекция (от 19 октября)|Следующая лекция]] | ||
- | |||
<ol> | <ol> | ||
<li> | <li> | ||
Строка 9: | Строка 7: | ||
</li> | </li> | ||
</ol> | </ol> | ||
- | + | <p>goto</p> | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
<p>Для выхода более чем из одного уровня вложенности вJava есть goto метка.</p> | <p>Для выхода более чем из одного уровня вложенности вJava есть goto метка.</p> | ||
<p>Для очистки ресурсов раньше использовали goto очистка_ресурсов, в современных ЯП: try ... finally. </p> | <p>Для очистки ресурсов раньше использовали goto очистка_ресурсов, в современных ЯП: try ... finally. </p> | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>J C# D отличает от C++ референциальная модель объектов. Объект нужно создать. В C++ есть конструкторы и деструкторы, и когда объект перестаёт существовать в памяти, автоматически вызывается деструктор. В С++ захват ресурсов – инициализация. Если нам нужен ресурс, мы обрамляем его в класс Res, в конструкторе которого желается захват ресурса, в деструкторе – освобождение. И при любом выходе из стека будут вызываться деструкторы | + | <p>J C# D отличает от C++ референциальная модель объектов. Объект нужно создать. В C++ есть конструкторы и деструкторы, и когда объект перестаёт существовать в памяти, автоматически вызывается деструктор. В С++ захват ресурсов – инициализация. Если нам нужен ресурс, мы обрамляем его в класс Res, в конструкторе которого желается захват ресурса, в деструкторе – освобождение. И при любом выходе из стека будут вызываться деструкторы объектолв, влекущие за собой освобождение ресурсов. В JDC# есть конструкции, которые позволя.т эмульровать эту стратегию.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
<p>Пример из UI:</p> | <p>Пример из UI:</p> | ||
<p>Когда мы проектируем UI, который характеризуется W(indow)I(con)M(ouse)P(ointer). Если пользователь заказал. Чтобы пользователь не дёргался, меняется курсор, более того, когда он видит песочные часы, он ничего не пытается предпринимать, В куче библиотек, например в Си, есть объекты, которые в конструкторе размещают объект, в деструкторе освобождает.</p> | <p>Когда мы проектируем UI, который характеризуется W(indow)I(con)M(ouse)P(ointer). Если пользователь заказал. Чтобы пользователь не дёргался, меняется курсор, более того, когда он видит песочные часы, он ничего не пытается предпринимать, В куче библиотек, например в Си, есть объекты, которые в конструкторе размещают объект, в деструкторе освобождает.</p> | ||
- | <p>Мы размещаем курсор в стеке, вызывааем | + | <p>Мы размещаем курсор в стеке, вызывааем долгукю операцию. В чём проблема: даже если не работала такая семантика, </p> |
<p>CwaitCursor</p> | <p>CwaitCursor</p> | ||
<p>showcursor;</p> | <p>showcursor;</p> | ||
Строка 42: | Строка 36: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>В Модуле-3 главное | + | <p>В Модуле-3 главное понЯтие – Remote Procedure Call.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | = | + | <ol start="3"> |
- | <p>Чем | + | <li> |
+ | <p>Составной оператор или блок</p> | ||
+ | </li> | ||
+ | </ol> | ||
+ | <p>Чем отиличатеся сост оператор от блока. В Алголе не отличается, в Паскале – да.</p> | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 54: | Строка 52: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Как только | + | <p>Как только вохникает разделение объявлений и операторов, при этом понятие составного оператора необязательно. Может быть в языке отдельно блок и отдельно оператор. Такое понятие нуждно чисто синтаксически в языках, где отсутствует явный терминатор.</p> |
- | <p>Ада, М-2, Оберон – понятие сост оператора | + | <p>Ада, М-2, Оберон – понятие сост оператора обсутствует, так как там должно быть ключевое слово для начлаа блока.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 72: | Строка 70: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>В программировании 70х годов | + | <p>В программировании 70х годов счиатлос, что нужно опережающее описание всех переменных. Причём в Аде счиатлось, что нужно сналчала тому, кот читает, знать обо всех объектах, а потом читать, что делается. Смешение считалось дурным тоном.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>В Паскале | + | <p>В Паскале свержу блока может быть либо заголовок процедуры, дибо заголовок главной программы. </p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>В современных ЯП блок эквивалентен составному оператору. (Си++, | + | <p>В современных ЯП блок эквивалентен составному оператору. (Си++, Джава, Си#). В современных языках беспорядочное объявление операторов является господствующим. </p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | = | + | <ol start="4"> |
+ | <li> | ||
+ | <p>Специализированные операторы</p> | ||
+ | </li> | ||
+ | </ol> | ||
<p>Специфичны для конкретных ЯП.</p> | <p>Специфичны для конкретных ЯП.</p> | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Для языка Ада есть два оператора: select, accept. Относятся к области | + | <p>Для языка Ада есть два оператора: select, accept. Относятся к области взаимод параллельных процессов, и их аналогов в другизх ЯП нет или почти нет. Каждый ЯП может ввести некоторые специализ операторы. И при изучении на них надо обращать внимание.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | + | <p>Глава 4. Процедурные абстракции</p> | |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
<p><коммент></p> | <p><коммент></p> | ||
- | <p>Ка с тз операторного базиса, так и с тз типового | + | <p>Ка с тз операторного базиса, так и с тз типового базися ЯП, несильно отличаются друг от друго.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Набор ТД сильно сократился по сравнению со старыми ЯП, набор конструкции | + | <p>Набор ТД сильно сократился по сравнению со старыми ЯП, набор конструкции тоде. Базисные встроенные объекты с объектами реального мира имеют мало общего, кирпичики, из которого строят модели, очень маленькие и универсальные. Для этого предлагаются некие повторно используемые библиотеки. Например, есть STL, а есть открытые библиотеки типа boost. «то уже более мощные ЯП. В совр ЯП делается брлее мощный упор на средства развития.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 101: | Строка 103: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Что нужно в языке: язык ассемблера – трудно развиваемый язык, ничего с | + | <p>Что нужно в языке: язык ассемблера – трудно развиваемый язык, ничего с тз развития нет.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 113: | Строка 115: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>А то, что сделали на | + | <p>А то, что сделали на асме и джовиале, очень трудно передать.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 119: | Строка 121: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Можно объектно | + | <p>Можно объектно программированть на асме.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
<p>Что нужно в языке для минимальных ср-в развития:</p> | <p>Что нужно в языке для минимальных ср-в развития:</p> | ||
- | <p>На Фортране 66 года можно было создавать достаточно сложные системы, например компилятор компиляторов. Пользовались двумя вещами – подпрограмма ( | + | <p>На Фортране 66 года можно было создавать достаточно сложные системы, например компилятор компиляторов. Пользовались двумя вещами – подпрограмма (возниклоа в саом первом варианте), и блок данных (возник тогда же0– ужасно неприятно синтаксич конструкция, но он позволял</p> |
- | <p>BLOCK DATE | + | <p>BLOCK DATE тимя</p> |
<p>объявления данных</p> | <p>объявления данных</p> | ||
<p>END</p> | <p>END</p> | ||
Строка 133: | Строка 135: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Блок данных | + | <p>Блок данных –изнвачально средство экономии памяти. Потом выяснилось, чо необходим набор глобальных данных для взаимод разных модулей.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 145: | Строка 147: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | + | <p>П1. Процедуры и сопрограммы.</p> | |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 151: | Строка 153: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Понятие процедуры соотв понятию | + | <p>Понятие процедуры соотв понятию мструктурного программирования. Это чёрный ящик, у которого один вход и один выход, а там внутри уже делается что угодно. Но в первых ЯП очевидно было, что процедура – нечто, которое может иметь и несколько входов, и несколько вызодов. Фортран 77 объединял в себе особенности, которые появлись в новых компиляторах. Там кроме SUBROUTINE был ENTRY – это были альтернативные входы, причём альтернативные входы могли иметь альтернативные наборы параметров.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 188: | Строка 190: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Было ещё одно понятие, | + | <p>Было ещё одно понятие, коотрое было изгнанно из совр ЯП: сопрограмма.</p> |
- | <p>Процедура: процедура p подразумевает всегда вызов её из надпрограммы, вызывающей, главной. В | + | <p>Процедура: процедура p подразумевает всегда вызов её из надпрограммы, вызывающей, главной. В каждыцй конкретный момент времени вызыв программа становится главной. Причём тут несимметрия: p – точка входа (в ассемблере процедура не отличатеся от метки. Любимая задача лектора: если не call, как его промодулироваать, но ткут ещё надо в стек загрузить адрес возврата. В 360 не было call, зато был такой косвенный опретор перехода). Всегда при выцзове процедуры всегда с первого оператора, а возвращение туда, откуда вызвали, куда скажут. Чёткая несимметрия.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Как обобщить подобную антисимметрию и сделать её симметричной: для | + | <p>Как обобщить подобную антисимметрию и сделать её симметричной: для эжтого назовём это сопрограммой (coroutinnes) – взаимод программы.</p> |
- | <p>Есть call p2 – управление идёт в точку входа p2, потом делаем call p1, возвращаем туда, откуда вызвали, потом опять делаем call p2, и возвращаем управление туда, откуда ушли. Тут это вместо call называется resume. При resume начинается | + | <p>Есть call p2 – управление идёт в точку входа p2, потом делаем call p1, возвращаем туда, откуда вызвали, потом опять делаем call p2, и возвращаем управление туда, откуда ушли. Тут это вместо call называется resume. При resume начинается выполн соотв сопрограммы с точки, где её покинуло.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Книга структурное программирование – три статьи – первая Дейкстры про структурное программиорваиние, вторая Ховарда про типы данных. Третья Уве Дау (один из автор Симулы 67 – основной источник идей для Страуструпа при создании Си с классами), в которой он | + | <p>Книга структурное программирование – три статьи – первая Дейкстры про структурное программиорваиние, вторая Ховарда про типы данных. Третья Уве Дау (один из автор Симулы 67 – основной источник идей для Страуструпа при создании Си с классами), в которой он обсудждал понятие сопрограммы, реализацию в Симуле, возможности применения, насколько оно красивее.</p> |
- | <p>Явный пример: нужно | + | <p>Явный пример: нужно слтить два файла. Не очень приятная задача, нужно гонять циклы то там, то там. Кроме того, возникают лишние циклы, когда один из файлов закончился. А при сопрограммах обе сопрограммы читают из своего файла в результирующиий, вопрос в том, когда передавать управление, и тут всего один цикл. Сигнализация конца файла легко устанавливается и она решаетсмя за один цикл. Чструктура решения более простая, чем при классич решении. Структура сопрограмм похоже на процессы. Это суть квазипараллеьные процессы, и с точки параллельных процессов resume соответствует синхронизации. Для многих задач параллельные процессы естественнее, чем последовательные. Сопрограммы были впервые применены для реализации с языка Кобол. С точки зрения компиляции на что похожа сопрограмма – есть сопрограммы для лексического, синтаксического анализа, генерации кода. Тогда, когда синт анализатору нужна лексема, он вызываает лекс анализатор, и он её отдаёт. Синт анализатор из потока читает лексемы и отдаёт их генератору кода. Компилятор есть сеть взаимод сопрограмм, и эта концепция всем понравилась. Она была внедрена в Симулу 67 и Модулу-2. Для поддержки сопрограмм блыи:</p> |
<p>тип COROUTINE </p> | <p>тип COROUTINE </p> | ||
<p>NEW PROCESS(VAR C:COROUTINE, P:PROC; N:INTEGER); - Вирт отвечал, что так получилось чисто исторически, PROC – встроенный тип, процедура без параметров.</p> | <p>NEW PROCESS(VAR C:COROUTINE, P:PROC; N:INTEGER); - Вирт отвечал, что так получилось чисто исторически, PROC – встроенный тип, процедура без параметров.</p> | ||
- | <p>Очень похоже на запуск нового потока. Там мы | + | <p>Очень похоже на запуск нового потока. Там мы указыаем процедуру без параметров (в виндах можно указываать параметр – код возврата). </p> |
<p>Далее была неопределённая вещь – N:INTEGER;</p> | <p>Далее была неопределённая вещь – N:INTEGER;</p> | ||
<p>При создании новых потоков наследуется часть контекста. У легковесных нитей и потоков отличаются тем: легковесные общие тем, что у них сегмент данных общий, синхронизация почти не нужна. Счётчик команд различный, код может быть разный, сегмент стека разный – под локальные переменные.</p> | <p>При создании новых потоков наследуется часть контекста. У легковесных нитей и потоков отличаются тем: легковесные общие тем, что у них сегмент данных общий, синхронизация почти не нужна. Счётчик команд различный, код может быть разный, сегмент стека разный – под локальные переменные.</p> | ||
Строка 211: | Строка 213: | ||
<p>Вирт потом заменил её на ADDRESS – аналог void *</p> | <p>Вирт потом заменил её на ADDRESS – аналог void *</p> | ||
<p>Мы не раньше говорим, что это структура, теперь – что эту структуру помещаем по адресу.</p> | <p>Мы не раньше говорим, что это структура, теперь – что эту структуру помещаем по адресу.</p> | ||
- | <p>Была ещё процедура IOTRANSFER – вызов процедуры, когда приходило прерывание, там ещё было N – номер прерывание. Это позволяло писать драйверы. Это понятие сопрограммы могло быт полезным, например, при | + | <p>Была ещё процедура IOTRANSFER – вызов процедуры, когда приходило прерывание, там ещё было N – номер прерывание. Это позволяло писать драйверы. Это понятие сопрограммы могло быт полезным, например, при обьработке нажатий клавиш.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 217: | Строка 219: | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Основываясь на понятии сопрограммы, можно | + | <p>Основываясь на понятии сопрограммы, можно реализоваьт передачу сигналов. То есть понятие сигналов – квазипараллельного програм, на основе вопрограмм.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Один из главных недостатков сопргр=ограмм – сложность синхронизации оп данным. У каждой сопрограммы свой стек, где хранятся локальные данные. Сопрограммы могут взаимодействовать только через глобальные переменные. Они не могут | + | <p>Один из главных недостатков сопргр=ограмм – сложность синхронизации оп данным. У каждой сопрограммы свой стек, где хранятся локальные данные. Сопрограммы могут взаимодействовать только через глобальные переменные. Они не могут экспортированть данные наружу.</p> |
<p>Кроме того, оно сочтено низкоуровневым.</p> | <p>Кроме того, оно сочтено низкоуровневым.</p> | ||
<p>Понятие потока. RSSUME – оператор языка. Это всё встроено в языка. Это лишний пример того, почему сужается базис – разные вещи могут быть реализованы с разной эффективностью. Теперь есть поток, и его реализация зависит от платформы.</p> | <p>Понятие потока. RSSUME – оператор языка. Это всё встроено в языка. Это лишний пример того, почему сужается базис – разные вещи могут быть реализованы с разной эффективностью. Теперь есть поток, и его реализация зависит от платформы.</p> | ||
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Лектору кажется, что отсутствие понятия сопрограмм связано с | + | <p>Лектору кажется, что отсутствие понятия сопрограмм связано с наличсием других средств квазипараллеьного программирования реализуемых ср-вами стандартной библиотеки или ОС.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>Явным преимущественным Ада – механизм синхронизации процессов ( | + | <p>Явным преимущественным Ада – механизм синхронизации процессов (мезанизм рандеву). Единственная новая концепция. Accept – принимал некоторую точку входа от параллеьного процесса. Механизз рандеву всем хорош, но если программировать параллельные процессы на ОС, где пар процессы уже есть, то получалось менее эффективно. И он был полезен, где пар процессов вообще не было. Но там есть ограничение по ресурсам, и там механизм рандеву – стрельбпа из пушки по воробьям.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
- | <p>В | + | <p>В джаве есть встроенные средства программирования потоков, кроме того, там есть JNI, чему сопротивлялась Sun, но чего так хотела MS, - вызов нативного кода. Это напрямую противоречит WORA. Но получается так, что реализация встроенного механизма, оказывается менее эфективной, чем использование средств ОС. </p> |
- | <p>Встроенный механизм сопрограмм | + | <p>Встроенный механизм сопрограмм слижком низкоуровневый, и его нельзя реализовать достаточно универсально на разных архитектурах (ОС). Современные программисты потеряли вкус к параллельному программированияю. Их не нуджно применять для эффективности, их нуджно применять для соотв структуре алгоритма.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
<p> Реализация подпрограмм. </p> | <p> Реализация подпрограмм. </p> | ||
- | + | <p>П2. Подпрограммы. Передача параметров.</p> | |
- | <p>Разные ЯП отличаются с | + | <p>Разные ЯП отличаются с тз реализации отлдичаются механизмом передачи параметров.</p> |
<p><br /> | <p><br /> | ||
</p> | </p> | ||
Строка 244: | Строка 246: | ||
</p> | </p> | ||
<p>In/out – три класса входных параметров.</p> | <p>In/out – три класса входных параметров.</p> | ||
- | <p>Первый класс – in-параметры – передаются | + | <p>Первый класс – in-параметры – передаются толькоих значения</p> |
<p>out-параметры – меняют свои значения, но от них не требуется определённости</p> | <p>out-параметры – меняют свои значения, но от них не требуется определённости</p> | ||
<p>in/out – требуется как статус определённости, так они и могут получить новые значения.</p> | <p>in/out – требуется как статус определённости, так они и могут получить новые значения.</p> | ||
Строка 260: | Строка 262: | ||
</ol> | </ol> | ||
<p>Чем хороши эти способы – отвечают полностью семантике in-out. </p> | <p>Чем хороши эти способы – отвечают полностью семантике in-out. </p> | ||
- | <p>Главный недостаток этих способов – копирование, если параметры большие. | + | <p>Главный недостаток этих способов – копирование, если параметры большие. Понядобились ещё два способа:</p> |
<ol start="4"> | <ol start="4"> | ||
<li> | <li> |