Типы переменных в зависимости от связывания
•Статическая -Этопеременная, которая связывается с ячейкой памятью до начала выполнения программы и сохраняет связь с той же ячейкой до завершения программы.
В ЯП С и С++ разрешается спецификатор static в объявлении локальных переменных для функции.
•Стековая –это переменная удовлетворяющие двум условиям: связывание с памятью осуществляется при обработке операторов объявления переменных типы переменных связываются статически.
+Все программы могут совместно использовать одну и ту же область памяти для ранения своих локальных переменных.
-Дополнительные затраты времени на размещение в памяти и удаление из памяти
-Уменьшение скорости доступа из-за использования косвенной адресации.
-Подпрограммы не имеют возможности хранить предысторию вычислений.
•В языках Java,C++ и С# локальные переменные в методах становятся стековыми переменными по умолчанию.
•Явные динамические переменные - безымянные ячейки памяти, размещаемые и удаляемые с помощью явных операторов программы.
•Обращаются к этим переменным можно только с помощью указателей ссылок.
•Явные динамические переменные создаются или оператором или вызовом предусмотренной библиотечной подпрограммы.
•В ЯП java все данные за исключением основных скалярных величин, являются явными динамическими объектами доступными через ссылочные переменные.
•Неявные динамические переменные связываются с динамической памятью только при присваивании им значений.
+Высокая степень гибкости позволяющая писать обобщенные программы.
-Высокие накладные расходы на обслуживание всех динамич атрибутов, среди которых могут быть тип: элементов массива, диапазон индексов и многое другое.
-Потеря компилятором возможностей распознавания многих ошибок.
Контроль типов
•Проверяет факт получения каждой переменной нужного количества операндов правильного типа.
Контроль типов данных может осуществляться в период выполнения программы (динамический контроль типов) или в период компиляции(статистический контроль типов).
Статистический контроль типов
•Исходные данные:
1. Для каждой операций определены кол-во и типы данных для операций и результата.
2. Тип каждого объекта данных (переменной или экземпляра типа) известен и не меняется в ходе выполнения программы.
3. Типы всех констант тоже понятны.
Алгоритм статистического контроля типов
1. Компилятор собирает информацию при анализе текста программы и заносит в таблицу символов, которая накапливает все сведения о типах их операндов.
2. После завершения сбора компилятор проверяет все операции программы на предмет правильности типов их операндов.
3. после проверки типов операндов i-й операции определяется тип ее результата, а полученная информация сохраняется для проверки следующей операции программы, в которой результат i-й операции может использоваться как операнд.
•Статистический контроль типов данных охватывает все операции программы проверке подвергаются все варианты вычислений и отпадает необходимость в дальнейшем контроле.
Динамический контроль типов
•Осуществляется непосредственно перед выполнением.
•Динамический контроль типов характерен для скриптовых, функциональных и логических языков.
+ Гибкость программы.
+ Можно создавать настраиваемые программы, способные работать с данными любого типа.
- Понижение надежность вычисления.
- Снижение скорости вычислений.
- Возрастание накладных затрат памяти.
Параллелизм
• Параллелизм – свойство, отличающее активные объекты от пассивных.
• Разделение предметной области на объекты позволит разнести общий функционал системы по нескольким потокам и процессам, часть из которых сможет выполняться одновременно.
Оценка качества декомпозиции предметной области
• Для оценки качества классов и объектов существуют 5 критериев:
1. Зацепление – степень глубины связи между отдельными модулями. (чем меньше связность тем лучше)
2. Связность – степень взаимодействия между элементами отдельного модуля. (чем крепче связь тем лучше)
3. Достаточность – степень необходимого для реализации логичного и эффективного поведения в классе. (не наполнять лишним функционалом)
4. Полнота – в интерфейсной части класса должны быть учтены все характеристики абстракции. (Не исключать главное)
5. Примитивность - ….. (операции внутренние не обращаются к другим классам, дополнение связности)
Полиморфизм
• Полиморфные объекты – объекты, принимающие разные формы.
• Полиморфизм – возможность использовать один объект языка (идентификатор или операцию) для выполнения различных действий.
• Полиморфные функции – это те функции, которые имеют полиморфные аргументы.
Статический полиморфизм
• Статический полиморфизм – множественные формы конкретизируются на этапе компиляции.
1. Преобразование типов – значение преобразуется из одного типа в другой.
2. Перегрузка – одно и то же имя используется для двух или нескольких разных объектов или подпрограмм (включая операции).
3. Родовой (настраиваемый) сегмент – параметризованный шаблон подпрограммы, используется для создания различных конкретных экземпляров подпрограмм.
Динамический полиморфизм
• Динамический полиморфизм – структурная неопределенность сохраняется до этапа выполнения.
1. Вариантные и неограниченные записи – одна переменная может иметь значение разных типов.
2. Диспетчеризация во время выполнения – механизм, посредством которого разрешение обращения к преопределенному методу осуществляется во время выполнения, а не во время компиляции. Этот полиморфизм реализуется с помощью виртуальных функций.
Преобразование типов
• Преобразование типов – значение преобразуется из одного типа в другой.
1. Перевод значения одного типа к значению другого типа.
2. Пересылка значения как не интерпретируемой строки битов.
• Изменение типа, которое не затрагивает базовые биты значения, называют не преобразующим явным преобразованием типа.
• Не преобразующее приведение типа в С достигается взятием адреса от объекта, преобразованием типа полученного указателя и последующего разыменования.
25. Объектно-ориентированное программирование. Основные концепции объектно-ориентированного программирования.
ОПП- это методология программирования основанная на представлении программы совокупностью объектов, каждый из которых является экземпляром определенного класса, а классы образует иерархию наследования.
В центре ООП находится понятие объекта. Объект — это сущность, которой можно посылать сообщения, и которая может на них реагировать, используя свои данные. Объект — это экземпляр класса. Данные объекта скрыты от остальной программы. Сокрытие данных называется инкапсуляцией.
ЯП является ОО тогда и только тогда когда выполняются след условия:
- Поддерживаются объекты
- Объекты относятся к соответствующим классам
- Классы могут наследовать структуры суперклассов
ООтехнология основывает на след основных принцпах:
1. Абстрагирования(выделение существенных характеристик объекта из несущественных)
2. Инкапсуляция(Скрытие и/или изоляция реализации элементов программы)
3. Модульность(принцип, согласно которому логически связанные между собой подпрограммы, переменные и т. д. группируются в отдельные файлы )
4. Иерархичность(упорядоченность абстракций по уровням)
Наследование-отношение между классами, когда 1 класс заимствует структурную или/и функциональную часть другого
Типы наследования:
Одиночное: 1 предок-1 потомок
Множественные: много предков-1 потомок/ 1 предок - много потомков
Сохраняемость - способность объекта переживать во времени породивший его процесс.
Преимущества объектной модели:
1. Возможности использования ООЯ
2.повышает уровень унификации разработки
3. Увеличение стабильности системы, упрощение внесения изменений
4. Ориентация на человеческое восприятие мира
Класс- абстрактный тип данных, снабженный некоторыми возможностями реализации.
Одновременно является и модулем и типом. Характеризуется атрибутами и методами.
Отношения между классами:
1.Ассоциация-
2. Агрегация
3. Композиция
<Объектно-ориентированное программирование (ООП)>
• Описывает статическую структуру системы, показывая ее классы, их атрибуты и методы, и также взаимосвязи этих классов.
• (ООP) (объектно-ориентированное программирование) – это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
• (OOD) (Объектно-ориентированное проектирование) – это методология проектирования, соединяющая в себе процесс объектной декомпиляции и примеры представления логической и физической, а также статистикой и динамической моделей проектируемой системы.
• (OOA) (Объектно-ориентированный анализ) – это методология, при которой требования к системе воспринимаются с точки зрения классов и объектов, выявленных в предметной области.
Связь: OOA→OOP→OOD
• На результатах OOA формируются модели, на которых основывается OOD, OOD в свою очередь создает фундамент для окончательной реализации системы с использованием методологии ООП.
ОО ЯП
•Язык программирования является объектно-ориентированным тогда и только тогда, когда выполняются следующие условия:
1) Поддерживаются объекты, т.е. абстракции данных, имеющие интерфейс в виде именованных операций и собственные данные, с ограничением доступа к ним.
2) Объекты относятся к соответствующим типам (классам).
3) Типы (классы) могут наследовать атрибуты супер типов (суперклассов).
Преимущества объектной модели:
+Позволяет использовать возможности ОО языка программирования.
+Повышает уровень унификации разработки и пригодность для повторного использования программ и проектов.
+Приводит к построению систем на основе стабильных промежуточных описаний, что упрощает процесс внесения изменений.
+Уменьшает риск разработки сложных систем. ОО проектирование – это единственная методология, позволяющая справиться со сложностью, присущей большим системам.
+Ориентирована на человеческое восприятие мира.
Основные принципы ООП:
1. Абстрагирование – это способ выделить набор существенных характеристик объекта, исключая из рассмотрения незначимые, которые позволяют отличить его от всех других видов объектов (определить его концептуальные границы). Соответственно, абстракция – это набор всех таких характеристик. Иными словами абстрагирование – это способ сконцентрироваться на интерфейсе (внешнее поведение объекта), не обращая внимания на реализацию (механизмы достижения желаемого поведения объекта).
2. Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.
3. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
4. Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником или производным классом.
5. Модульность – свойство системы, которая была разложена на внутренне связанные, но слабо связанные между собой модули.
6. Типизация – это способ защититься от использования объектов одного класса вместо другого, или по крайней мере управлять таким использованием.
7. Сохраняемость – способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего начального адресного пространства.
8. Параллелизм – свойство, отличающее активные объекты от пассивных.
26. Современные интегрированные среды разработки программ. Основные компоненты среды программирования.
Среда программирования – она же интегрированная среда разработки. Определение – это набор инструментов, используемых для преобразования символов в выполнимые вычисления.
1) Редактор
2) Транслятор – переводит синтаксические конструкции исходного кода, так называемые объектный модуль, которые содержат команды в машинном коде, конкретной вычислительной системы.
3) Библиотека – поддерживает совокупность объектных файлов, называемых библиотеками.
4) Компоновщик (редактор связей) – собирает объектные файлы отдельных компонентов программы и разрешает внешние ссылки от одного компонента к другому, формируя исполняемый файл.
5) Загрузчик – копирует исполняемый файл с диска в память и инициализирует компьютер перед выполнением программы.
6) Отладчик – это инструментальное средство, которая дает возможность программисту управлять ходом выполнения программы на уровне отдельных операторов. Используется для диагностики ошибок. Позволяет выполнять 3 функции:
1) Троссировка
2) Расставлять контрольные точки
3) Проверять/изменять данные в ходе выполнения.
Профилеровщик – измеряет трудоемкость отдельных частей программы.
Средства тестирования – автоматизирует процесс выполнения программы. Создавая и выполняя тесты и анализируя результаты тестирования.
Средства конфигурирования – автоматизирует поддержку версий программного продукта.
Препроцессор – собирает предварительную информацию, необходимую для компоновки программы, а так же осуществляет раскрытие сокращений.
Средства автоматизированной генерации кода и средства визуальной разработки. Позволяет на основе некоторых шаблонов и визуальных инструментов автоматически генерировать исходный код.
Среда программирования
•Это набор инструментов, используемых для преобразования символов в выполняемые вычисления.
<Элементы (операторы)>
•Редактор - инструментальное средство для создания и изменения исходных файлов(текстов), содержащих написанную на ЯП программу.
•Транслятор - переводит синтаксические конструкции исходного кода в т.н. объектный модуль, который содержит команды в машинном коде конкретного вычислительного устройства.
•Библиотекарь - поддерживает совокупность объектных файлов, называемых библиотеками.
•Компоновщик - собирает объектные файлы отдельных компонентов программы и разрешает внешние ссылки от одного компонента к другому, формируя исполняемый файл.
•Загрузчик – копирует исполняемый файл с диска в память и инициализирует компьютер перед выполнением программы.
•Отладчик – Инструментальное средство, которое дает возможность программисту управлять выполнением программы на уровне отдельных операторов. (диагностика ошибок)
◘Используется для диагностики ошибок:
1. Трассировка (пошаговое выполнение программы)
2. Контрольная точка – ограничение (ставит точки от каких и до каких пределов трассировать)
3. Проверка и изменение данных – (Зафиксировали данные в регистре, потом проверяем изменения после использования программы).
4. Профилировщик – измеряет трудемкость отдельных частей программы.
5. Среда тестирования – автоматизирует процесс тестирования программ, создавая и выполняя тесты и анализируя результаты тестирования.
6. Средства конфигурирования – автоматизируют поддержку версий программного продукта.
7. Процессор(макропроцессор) – собирает предварительную информацию, необходимую для компоновки программы, осуществляет раскрытие сокращений, называемых макросами.
8. Средства автоматизированной генерации кода и средства визуальной разработки – позволяет на основе некоторых шаблонов и визуальных инструментов автоматически генерировать исходный код.
<Трансляторы>
◘Компилятор – переводит весь исходный код в объектный (исполняемый), который затем выполняется операционной системой. (за один проход) (С, Паскаль, Ассемблер)
◘Интерпретатор – выполняет перевод команды в объектный код непосредственно перед ее выполнением, а выполнением команд занимается специальная программа – имитатор абстрактной машины. (РНР, питон, Ява)
•Нельзя сказать, что язык L1 эффективнее языка L2. Компилятор С1 может сгенерировать более эффективный код, чем С2.
+ компиляции:
· Многие ошибки выявляются еще до запуска программы
· Выполнение программы происходит быстрее
· Высокая защита исход кода (код в один исполняемый файл)
· Переносимость на уровне процессора (ОС)
+ интерпретатора:
· Не требуются дополнительные преобразования(компиляция), более простая технология создания программ
· Запуск программы происходит быстрее
· Не требуется наличие всех компонентов программы
· Переносимость на уровне абстрактной машины
{Процесс трансляции}
Входная часть:
1. Лексический. Выделяет лексемы из входной строки. Преобразует последовательности символов в синтаксические инструкции
2. Синтаксический. Разбирает прогу, строит из лексических единиц иерархические структуры. Строит дерево, соответствующее разбору в контекстно-свободной грамматике ЯП. (если А,В-выражения, то А+В – выражение)
3. Семантический. Проверяется наличие семантических ошибок в исходной программе и накапливается информация о типах данных.
· Этап 1. Проверка соблюдения семантических соглашений – заключается в сопоставлении входных цепочек исходной программы с требованиями семантики входного ЯП.
· Этап 2. Дополнение внутреннего представления программы связано с добавлением в него операторов и действий, неявно предусмотренных семантикой входного языка.
· Этап 3. Проверка элементарных смысловых норм – сервисная функция, обеспечивает проверку компилятором соглашений, выполнение которых связано со смыслом как всей программы в целом, так и в отдельных ее фрагментов. Зависит от качества компилятора.
Выходная часть:
1. Генератор промежуточного кода. Представление исходной программы, которое можно рассматривать как программу для абстрактной машины.
2. Оптимизатор кода. Производится попытка улучшить промежуточный код, чтобы получить более эффективный машинный код.
· Машинно-зависимая оптимизация - использование регистров процессора вместо оперативной памяти.
· Машинно-независимая оптимизация – оптимизация промежуточного представления программы.
· Локальная оптимизация – замена нескольких команд одной или более быстрой.
· Глобальная оптимизация – оптимизация всей программы за счет замены на более быстрые инструкции.
(Отладку лучше проводить при выключенной оптимизации, а тестирование – два раза ( и при включенной и при выключенной).)
3. Генератор кода. Генерация целевого кода, обычно перемещаемого машинного кода или ассемблерного кода.
Диспетчер таблицы символов. Структура данных, содержащая записи о каждом идентификаторе с полями для его атрибутов. Позволяет быстро найти, изменить или добавить инфу об идентификаторе.
Обработчик ошибок позволяет пропустить несущественную ошибку, позволяя найти остальные.
Этапы подготовки программы к выполнению:
27. Декомпозиция программ.
ДЕКОМПОЗИЦИЯ – процесс разбиения задачи на части и её решение.
Декомпозиция программы- создание модулей, которые в свою очередь представляют собой небольшие программы, взаимодействующие друг с другом по хорошо определенным и простым правилам.
На этапе декомпозиции задачи на подзадачи следует придерживаться трех правил:
1. каждая подзадача должна иметь один и тот же уровень рассмотрения,
2. каждая подзадача может быть решена независимо,
3. полученные решения могут быть объединены вместе, позволяя решить исходную задачу.
28. Трансляторы. Интерпретация и компиляция.
Трансля́тор — программа или техническое средство, выполняющее трансляцию программы.
Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. Д
•Транслятор - переводит синтаксические конструкции исходного кода в т.н. объектный модуль, который содержит команды в машинном коде конкретного вычислительного устройства.
Трансляторы – компиляторы и интерпретаторы.
Компилятор (англ. compiler – составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.
Интерпретатор (англ. interpreter – истолкователь, устный переводчик) переводит и выполняет программу строка за строкой. После того, как программа откомпилирована, ни сама исходная программа, ни компилятор более не нужны. В то же время программа, обрабатываемая интерпретатором, должна заново переводиться на машинный язык при каждом очередном запуске программы. Откомпилированные программы работают быстрее, но интерпретируемые проще исправлять и изменять.
Компилятор – переводит весь исходный код в объектный или исполняемый модуль. (С)
Интерпретатор – выполняет перевод команды в объектный код, непосредственно перед ее выполнением. Выполнением самим команд занимается имитатор абстрактной машины. JAVA, PHP, basic.
Компиляция
Исх текст
Лексический анализатор
Синтаксический анализатор
Семантический анализатор
Промежуточный представление
Оптимизация машинозависимая
Генератор кода
Машинозависимый оптимизатор
Объектный код
Интерпретация
Исх текст
Лексический анализатор
Синтаксический анализатор
Семантический анализатор
Абстрактный код
Имитатор абстрактной машины
Лексический анализатор преобразует последовательность символов в синтаксические инструкции (лексемы).
Синтаксический анализатор получает от лексического анализатора лексические единицы и использует их для создания иерархических структур.
Семантический анализатор предает смысл этим инструкциям, т.е. определяет адреса переменных, подпрограмм, последовательности параметров в стеке, при вызове подпрограммы и т.д.
В итоге в обоих случаях получается некое промежуточное представление (абстрактный код), который с точностью до идентификаторов однозначно соответствует исходному коду.
Выходная часть компилятора (имитатор абстрактной машины) выполняет генерацию машинно-зависимого кода.
Оптимизатор пытается улучшить код, убрать лишние операции, заменить медленные инструкции на более быстрые и т.д.
В результате оптимизации получается объектный код, который не соответствует исходному, из-за чего затрудняется процесс отладки.
Виды оптимизации:
1) Оптимизация промежуточного представления
2) Машинно-ориентированная оптимизация (регистры вместо оперативной памяти)
3) Локальная оптимизация (замена нескольких команд одной более эффективной)
<Трансляторы>
◘Компилятор – переводит весь исходный код в объектный (исполняемый), который затем выполняется операционной системой. (за один проход) (С, Паскаль, Ассемблер)
◘Интерпретатор – выполняет перевод команды в объектный код непосредственно перед ее выполнением, а выполнением команд занимается специальная программа – имитатор абстрактной машины. (РНР, питон, Ява)
•Нельзя сказать, что язык L1 эффективнее языка L2. Компилятор С1 может сгенерировать более эффективный код, чем С2.
+ компиляции:
· Многие ошибки выявляются еще до запуска программы
· Выполнение программы происходит быстрее
· Высокая защита исход кода (код в один исполняемый файл)
· Переносимость на уровне процессора (ОС)
+ интерпретатора:
· Не требуются дополнительные преобразования(компиляция), более простая технология создания программ
· Запуск программы происходит быстрее
· Не требуется наличие всех компонентов программы
· Переносимость на уровне абстрактной машины
{Процесс трансляции}
Входная часть:
4. Лексический. Выделяет лексемы из входной строки. Преобразует последовательности символов в синтаксические инструкции
5. Синтаксический. Разбирает прогу, строит из лексических единиц иерархические структуры. Строит дерево, соответствующее разбору в контекстно-свободной грамматике ЯП. (если А,В-выражения, то А+В – выражение)
6. Семантический. Проверяется наличие семантических ошибок в исходной программе и накапливается информация о типах данных.
· Этап 1. Проверка соблюдения семантических соглашений – заключается в сопоставлении входных цепочек исходной программы с требованиями семантики входного ЯП.
· Этап 2. Дополнение внутреннего представления программы связано с добавлением в него операторов и действий, неявно предусмотренных семантикой входного языка.
· Этап 3. Проверка элементарных смысловых норм – сервисная функция, обеспечивает проверку компилятором соглашений, выполнение которых связано со смыслом как всей программы в целом, так и в отдельных ее фрагментов. Зависит от качества компилятора.
Выходная часть:
4. Генератор промежуточного кода. Представление исходной программы, которое можно рассматривать как программу для абстрактной машины.
5. Оптимизатор кода. Производится попытка улучшить промежуточный код, чтобы получить более эффективный машинный код.
· Машинно-зависимая оптимизация - использование регистров процессора вместо оперативной памяти.
· Машинно-независимая оптимизация – оптимизация промежуточного представления программы.
· Локальная оптимизация – замена нескольких команд одной или более быстрой.
· Глобальная оптимизация – оптимизация всей программы за счет замены на более быстрые инструкции.
(Отладку лучше проводить при выключенной оптимизации, а тестирование – два раза ( и при включенной и при выключенной).)
6. Генератор кода. Генерация целевого кода, обычно перемещаемого машинного кода или ассемблерного кода.
Диспетчер таблицы символов. Структура данных, содержащая записи о каждом идентификаторе с полями для его атрибутов. Позволяет быстро найти, изменить или добавить инфу об идентификаторе.
Обработчик ошибок позволяет пропустить несущественную ошибку, позволяя найти остальные.
Этапы подготовки программы к выполнению:
29. Макропроцессоры и макрогенераторы.
Макропроцессоры - мощный инструмент повышения емкости действий, образующих процессы информационной обработки. Главное предназначение макросов в системах программирования - достижение гибкости и переносимости текстов программ, применяемых в разных условиях. Многие трудности такого применения макротехники связаны с проблемой контроля типов данных на уровне текста программы. Исследования систем переписывания термов и разметки текстов пока не дали практичных решений в этой области. Современные информационные системы как правило содержат макропроцессоры как инструмент настройки на различные стандарты подготовки и обработки данных.
Макропроцессор может быть встроен в компилятор, быть автономным инструментом системы программирования, таким как текстовый редактор, оптимизатор или отладчик, или существовать самостоятельно как универсальный инструмент общего назначения.
Макросом называют средство замены строки на другую, полученную из исходной по заранее заданным правилам. Такую замену осуществляет макропроцесор, управляемый системой макросов. Макропроцессор перерабатывает текст, содержащий вызовы макроса и новые макроопределения, пополняющие систему макросов. Различают общие и локальные макросы, воздействующие на всю текущую программу или на часть ее текста. Системы макросов могут организовываться в библиотеки.
Общеизвестно, что макрос легче применять, чем определять. Внешняя простота введения макросов сопряжена с вероятностью трудно обнаруживаемых ошибок периода исполнения программы, индуцированных случайным сходством с подпрограммами на основном языке программирования:
· макрос меняет текст программы,
· подпрограмма меняет данные программы и логику процесса исполнения программы.
Макрокоманда — это текстовая подстановка, в ходе выполнения которой каждый идентификатор определенного вида заменяется на цепочку символов из некоторого хранилища данных.
С макрокомандами связаны понятия макрогенерация, макрорасширение, макроподстановка и макропроцессор.
Макрогенерация — процесс выполнения макрокоманды.
Макропроцессор (макрогенератор) — это специальный модуль, обрабатывающий макрокоманды и макроопределения. Макропроцессор получает на вход текст исходной программы, содержащий макроопределения и макрокоманды, а на выходе его появляется текст макрорасширения исходной программы, а не содержащий макроопределений и макрокоманд. Оба текста являются только текстами программы, никакая другая обработка не выполняется. Именно макрорасширение исходного текста поступает на вход компилятора. Синтаксис макрокоманд и макроопределений не является строго заданным. Он может различаться в зависимости от реализации компилятора с языка ассемблера. Но сам принцип выполнения макроподстановок в тексте программы неизменен и не зависит от их синтаксиса. Макрогенератор чаще всего не существует в виде отдельного программного модуля, а входит в состав компилятора языка ассемблера. Макрорасширение исходной программы обычно недоступно ее разработчику. Более того, макроподстановки могут выполняться последовательно при разборе исходного текста на первом проходе компилятора вместе с разбором всего текста программы, и тогда макрорасширение исходной программы в целом может и вовсе не существовать как таковое. Рассмотрим способ задания макрокоманды. |
30. Потоки и процессы. Сходства и различия.
Потоки и процессы — это связанные понятия в вычислительной технике. Оба представляют из себя последовательность инструкций, которые должны выполняться в определенном порядке. Инструкции в отдельных потоках или процессах, однако, могут выполняться параллельно.
Процессы существуют в операционной системе и соответствуют тому, что пользователи видят как программы или приложения. Поток, с другой стороны, существует внутри процесса. По этой причине потоки иногда называются "облегченные процессы". Каждый процесс состоит из одного или более потоков.
Любой ресурс, на доступ к которому претендуют не менее двух параллельных потоков, называется критическим или разделяемым ресурсом. Участок программы, на протяжении которого поток ведет работу с критическим ресурсом, называется критической секцией по отношению к этому ресурсу.
Необходимая минимальная синхронизация включает:
1) Операции чтения могут выполняться параллельно
2) Операции записи не могут выполняться одновременно с чтением.
3) Операции записи не могут выполняться параллельно с другими операциями записи.
31. Мониторы и защищаемые переменные в параллельном программировании.
Для защиты переменных, обозначаемый ключевым словом protected. Такие «защищенные» переменные становятся непосредственно доступны не только в своем классе, но и во всех производных от него.
Инкапсуляция – сокрытие деталей реализации от пользователя (монитор).
Защищенный класс виден внутри самого класса, для потомков данного класса (protected)
32. Семафоры в параллельном программировании. Типы семафоров.
Семафор – механизм синхронизации. Семафорный механизм работает по схеме, в которой сначала исследуется состояние критического ресурса, а затем осуществляется доступ к критическому ресурсу. В состав механизма включаются средства формирования и обслуживание очереди ожидающих процессов. Семафор представляет собой неотрицательную целую переменную, над которой возможно две операции: P, V.
Если семафором больше нуля, то P операция без задержек. Если значение семафора было равно нуля. Процесс, выполняющий P операцию, переводится в состояние ожидания, пока значение семафора не станет больше нуля.
V – увеличение семафора на 1. Если при этом имеются процессы, задерживаемые на управлении P операции на данном семафоре, один из этих процессов выходит из состояния ожидания и может выполнить свою P операцию. Операции P и V выполняются операционной системой, в ответ на запрос, выданный некоторым процессом и содержащий имя семафора в качестве параметра.
Семафор:
1) Значение семафора
2) Идентификатор процесса
3) Число процессов ожидающих увеличения значения семафора
4) Число процессов ожидающих нулевого значения семафора
Основное достоинство – отсутствие состояния активного ожидания.
Типы семафоров
Мьютекс - используется для реализации взаимного исключения в критическом разделе кода. Может быть или занят или свободен. Если он свободен, то действие ожидания мьютекса не блокируется. Если занят, то блокировано.
Блокировки для обеспечения чтения и записи.
Используется для реализации чтения и записи среди потоков.
С их помощью можно разрешить вход в критический раздел сразу нескольким потокам, если они будут только считывать данные из разделяемого ресурса.
Блокировкой для чтения может владеть любое количество потоков. Но записывать и модифицировать только один поток.
Semaphore
Класс реализует классический примитив синхронизации, который позволяет синхронизировать в себе заданное число потоков. Существует два основных действия – взять семафор (WaitOne) и освободить (Release). При создании семафора можно указать количество потоков, которые могут вызвать WaitOneбез ожидания Release от другого потока, то есть, другими словами, сколько потоков могут брать семафор, до того как понадобится синхронизация. Помимо количества потоков можно указать глобальный идентификатор семафора в системе, то есть сделать семафор именованным, чтобы использовать его не в рамках одного процесса, а уже для межпроцессовой синхронизации. Для того чтобы получить именованный семафор (даже если он создан в другом процессе), достаточно использовать метод OpenExisting.
При использовании класса Semaphoreнеобходимо учесть несколько особенностей:
· У семафора нет идентификации потоков, то есть любой поток может освободить семафор, даже если он был взят другим потоком (по сути это просто увеличение/уменьшение счетчика внутри семафора).
· Если, к примеру, два потока вызвали WaitOne, а затем один из них вызвал дважды Release, то когда второй поток попытается освободить семафор, получит исключение SemaphoreFullException.
Monitor
Еще один классический примитив синхронизации, по использованию аналогичен Mutex, однако, сам по себе Monitorне является объектом синхронизации и класс статический. Monitor’унеобходимо указат