Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы на ЯП.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
661.54 Кб
Скачать

Среда программирования

•Это набор инструментов, используемых для преобразования символов в выполняемые вычисления.

<Элементы (операторы)>

•Редактор - инструментальное средство для создания и изменения исходных файлов(текстов), содержащих написанную на ЯП программу.

•Транслятор - переводит синтаксические конструкции исходного кода в т.н. объектный модуль, который содержит команды в машинном коде конкретного вычислительного устройства.

•Библиотекарь - поддерживает совокупность объектных файлов, называемых библиотеками.

•Компоновщик - собирает объектные файлы отдельных компонентов программы и разрешает внешние ссылки от одного компонента к другому, формируя исполняемый файл.

•Загрузчик – копирует исполняемый файл с диска в память и инициализирует компьютер перед выполнением программы.

•Отладчик – Инструментальное средство, которое дает возможность программисту управлять выполнением программы на уровне отдельных операторов. (диагностика ошибок)

◘Используется для диагностики ошибок:

  1. Трассировка (пошаговое выполнение программы)

  2. Контрольная точка – ограничение (ставит точки от каких и до каких пределов трассировать)

  3. Проверка и изменение данных – (Зафиксировали данные в регистре, потом проверяем изменения после использования программы).

  4. Профилировщик – измеряет трудемкость отдельных частей программы.

  5. Среда тестирования – автоматизирует процесс тестирования программ, создавая и выполняя тесты и анализируя результаты тестирования.

  6. Средства конфигурирования – автоматизируют поддержку версий программного продукта.

  7. Процессор(макропроцессор) – собирает предварительную информацию, необходимую для компоновки программы, осуществляет раскрытие сокращений, называемых макросами.

  8. Средства автоматизированной генерации кода и средства визуальной разработки – позволяет на основе некоторых шаблонов и визуальных инструментов автоматически генерировать исходный код.

<Трансляторы>

Компилятор – переводит весь исходный код в объектный (исполняемый), который затем выполняется операционной системой. (за один проход) (С, Паскаль, Ассемблер)

Интерпретатор – выполняет перевод команды в объектный код непосредственно перед ее выполнением, а выполнением команд занимается специальная программа – имитатор абстрактной машины. (РНР, питон, Ява)

•Нельзя сказать, что язык L1 эффективнее языка L2. Компилятор С1 может сгенерировать более эффективный код, чем С2.

+ компиляции:

  • Многие ошибки выявляются еще до запуска программы

  • Выполнение программы происходит быстрее

  • Высокая защита исход кода (код в один исполняемый файл)

  • Переносимость на уровне процессора (ОС)

+ интерпретатора:

  • Не требуются дополнительные преобразования(компиляция), более простая технология создания программ

  • Запуск программы происходит быстрее

  • Не требуется наличие всех компонентов программы

  • Переносимость на уровне абстрактной машины

{Процесс трансляции}

Входная часть:

  1. Лексический. Выделяет лексемы из входной строки. Преобразует последовательности символов в синтаксические инструкции

  2. Синтаксический. Разбирает прогу, строит из лексических единиц иерархические структуры. Строит дерево, соответствующее разбору в контекстно-свободной грамматике ЯП. (если А,В-выражения, то А+В – выражение)

  3. Семантический. Проверяется наличие семантических ошибок в исходной программе и накапливается информация о типах данных.

  • Этап 1. Проверка соблюдения семантических соглашений – заключается в сопоставлении входных цепочек исходной программы с требованиями семантики входного ЯП.

  • Этап 2. Дополнение внутреннего представления программы связано с добавлением в него операторов и действий, неявно предусмотренных семантикой входного языка.

  • Этап 3. Проверка элементарных смысловых норм – сервисная функция, обеспечивает проверку компилятором соглашений, выполнение которых связано со смыслом как всей программы в целом, так и в отдельных ее фрагментов. Зависит от качества компилятора.

Выходная часть:

  1. Генератор промежуточного кода. Представление исходной программы, которое можно рассматривать как программу для абстрактной машины.

  2. Оптимизатор кода. Производится попытка улучшить промежуточный код, чтобы получить более эффективный машинный код.

  • Машинно-зависимая оптимизация - использование регистров процессора вместо оперативной памяти.

  • Машинно-независимая оптимизация – оптимизация промежуточного представления программы.

  • Локальная оптимизация – замена нескольких команд одной или более быстрой.

  • Глобальная оптимизация – оптимизация всей программы за счет замены на более быстрые инструкции.

(Отладку лучше проводить при выключенной оптимизации, а тестирование – два раза ( и при включенной и при выключенной).)

  1. Генератор кода. Генерация целевого кода, обычно перемещаемого машинного кода или ассемблерного кода.

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

Обработчик ошибок позволяет пропустить несущественную ошибку, позволяя найти остальные.

Этапы подготовки программы к выполнению:

27. Декомпозиция программ.

ДЕКОМПОЗИЦИЯ – процесс разбиения задачи на части и её решение.

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

На этапе декомпозиции задачи на подзадачи следует придерживаться трех правил:

  1. каждая подзадача должна иметь один и тот же уровень рассмотрения,

  2. каждая подзадача может быть решена независимо,

  3. полученные решения могут быть объединены вместе, позволяя решить исходную задачу.

28. Трансляторы. Интерпретация и компиляция.

Трансля́тор — программа или техническое средство, выполняющее трансляцию программы.

Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. Д

•Транслятор - переводит синтаксические конструкции исходного кода в т.н. объектный модуль, который содержит команды в машинном коде конкретного вычислительного устройства.

Трансляторы – компиляторы и интерпретаторы.

Компилятор (англ. compiler – составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.

Интерпретатор (англ. interpreter – истолкователь, устный переводчик) переводит и выполняет программу строка за строкой. После того, как программа откомпилирована, ни сама исходная программа, ни компилятор более не нужны. В то же время программа, обрабатываемая интерпретатором, должна заново переводиться на машинный язык при каждом очередном запуске программы. Откомпилированные программы работают быстрее, но интерпретируемые проще исправлять и изменять.

Компилятор – переводит весь исходный код в объектный или исполняемый модуль. (С)

Интерпретатор – выполняет перевод команды в объектный код, непосредственно перед ее выполнением. Выполнением самим команд занимается имитатор абстрактной машины. JAVA, PHP, basic.

Компиляция

Исх текст

Лексический анализатор

Синтаксический анализатор

Семантический анализатор

Промежуточный представление

Оптимизация машинозависимая

Генератор кода

Машинозависимый оптимизатор

Объектный код

Интерпретация

Исх текст

Лексический анализатор

Синтаксический анализатор

Семантический анализатор

Абстрактный код

Имитатор абстрактной машины

Лексический анализатор преобразует последовательность символов в синтаксические инструкции (лексемы).

Синтаксический анализатор получает от лексического анализатора лексические единицы и использует их для создания иерархических структур.

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

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

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

Оптимизатор пытается улучшить код, убрать лишние операции, заменить медленные инструкции на более быстрые и т.д.

В результате оптимизации получается объектный код, который не соответствует исходному, из-за чего затрудняется процесс отладки.

Виды оптимизации:

1) Оптимизация промежуточного представления

2) Машинно-ориентированная оптимизация (регистры вместо оперативной памяти)

3) Локальная оптимизация (замена нескольких команд одной более эффективной)

<Трансляторы>

Компилятор – переводит весь исходный код в объектный (исполняемый), который затем выполняется операционной системой. (за один проход) (С, Паскаль, Ассемблер)

Интерпретатор – выполняет перевод команды в объектный код непосредственно перед ее выполнением, а выполнением команд занимается специальная программа – имитатор абстрактной машины. (РНР, питон, Ява)

•Нельзя сказать, что язык L1 эффективнее языка L2. Компилятор С1 может сгенерировать более эффективный код, чем С2.

+ компиляции:

  • Многие ошибки выявляются еще до запуска программы

  • Выполнение программы происходит быстрее

  • Высокая защита исход кода (код в один исполняемый файл)

  • Переносимость на уровне процессора (ОС)

+ интерпретатора:

  • Не требуются дополнительные преобразования(компиляция), более простая технология создания программ

  • Запуск программы происходит быстрее

  • Не требуется наличие всех компонентов программы

  • Переносимость на уровне абстрактной машины

{Процесс трансляции}

Входная часть:

  1. Лексический. Выделяет лексемы из входной строки. Преобразует последовательности символов в синтаксические инструкции

  2. Синтаксический. Разбирает прогу, строит из лексических единиц иерархические структуры. Строит дерево, соответствующее разбору в контекстно-свободной грамматике ЯП. (если А,В-выражения, то А+В – выражение)

  3. Семантический. Проверяется наличие семантических ошибок в исходной программе и накапливается информация о типах данных.

  • Этап 1. Проверка соблюдения семантических соглашений – заключается в сопоставлении входных цепочек исходной программы с требованиями семантики входного ЯП.

  • Этап 2. Дополнение внутреннего представления программы связано с добавлением в него операторов и действий, неявно предусмотренных семантикой входного языка.

  • Этап 3. Проверка элементарных смысловых норм – сервисная функция, обеспечивает проверку компилятором соглашений, выполнение которых связано со смыслом как всей программы в целом, так и в отдельных ее фрагментов. Зависит от качества компилятора.

Выходная часть:

  1. Генератор промежуточного кода. Представление исходной программы, которое можно рассматривать как программу для абстрактной машины.

  2. Оптимизатор кода. Производится попытка улучшить промежуточный код, чтобы получить более эффективный машинный код.

  • Машинно-зависимая оптимизация - использование регистров процессора вместо оперативной памяти.

  • Машинно-независимая оптимизация – оптимизация промежуточного представления программы.

  • Локальная оптимизация – замена нескольких команд одной или более быстрой.

  • Глобальная оптимизация – оптимизация всей программы за счет замены на более быстрые инструкции.

(Отладку лучше проводить при выключенной оптимизации, а тестирование – два раза ( и при включенной и при выключенной).)

  1. Генератор кода. Генерация целевого кода, обычно перемещаемого машинного кода или ассемблерного кода.

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

Обработчик ошибок позволяет пропустить несущественную ошибку, позволяя найти остальные.

Этапы подготовки программы к выполнению:

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’у необходимо указать объект, который будет являться признаком синхронизации. Для упрощенного использования мониторов в C# есть инструкция компилятора lock, которая организует блок кода, в котором гарантируется монопольный синхронизированный доступ к объекту, а также освобождение монитора после выхода из блока кода, даже в случае исключения.

Стоит помнить несколько особенностей Monitor:

  • Примитив работает исключительно со ссылочными типами

  • Не рекомендуется использовать публичные объекты для синхронизации, так как это может привести к взаимоблокировке

  • Рекомендуется везде, где это возможно использовать инструкцию lock вместо явного вызова методов класса

33. Отладчики. Генераторы кода и приложений.

Отла́дчик (деба́ггер, англ. debugger) — компьютерная программа, предназначенная для поиска ошибок в других программах, ядрах операционных систем, SQL-запросах и других видах кода. Отладчик позволяет выполнять пошаговую трассировку, отслеживать, устанавливать или изменять значения переменных в процессе выполнения кода, устанавливать и удалять контрольные точки или условия остановки и т.д.

Отладчик – это инструментальное средство, которая дает возможность программисту управлять ходом выполнения программы на уровне отдельных операторов. Используется для диагностики ошибок.

◘Используется для диагностики ошибок:

• Трассировка (пошаговое выполнение программы)

• Контрольная точка – ограничение (ставит точки от каких и до каких пределов трассировать)

• Проверка и изменение данных – (Зафиксировали данные в регистре, потом проверяем изменения после использования программы).

• Профилировщик – измеряет трудемкость отдельных частей программы.

• Среда тестирования – автоматизирует процесс тестирования программ, создавая и выполняя тесты и анализируя результаты тестирования.

• Средства конфигурирования – автоматизируют поддержку версий программного продукта.

• Процессор(макропроцессор) – собирает предварительную информацию, необходимую для компоновки программы, осуществляет раскрытие сокращений, называемых макросами.

• Средства автоматизированной генерации кода и средства визуальной разработки – позволяет на основе некоторых шаблонов и визуальных инструментов автоматически генерировать исходный код.

• Отладчик – Инструментальное средство, которое дает возможность программисту управлять выполнением программы на уровне отдельных операторов. (диагностика ошибок)

• Генератор промежуточного кода. Представление исходной программы, которое можно рассматривать как программу для абстрактной машины. Генерация целевого кода, обычно перемещаемого машинного кода или ассемблерного кода.

34. Параллельная обработка данных и параллелизм. Параллельное и распределенное программирование.

Параллели́зм — это свойство систем, при которой несколько вычислений выполняются одновременно, и при этом, возможно, взаимодействуют друг с другом. Вычисления могут выполняться на нескольких ядрах одного чипа с вытеснящим разделением времени потоков вычислений на одном процессоре, либо выполняться на физически отдельных процессорах. Для выполнения параллельных вычислений разработаны ряд математических моделей, в том числе сети Петри, исчисление процессов, модели параллельных случайных доступов к вычислениям и модели акторов.

Параллельное программирование.

Два события называют одновременными, если они происходят во время одного и того же временного интервала, при этом говорят, что они выполняются параллельно.

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

В многопроцессорной среде при наличии свободных процессоров параллельные вычисления могут выполняться в одни и те же моменты времени, в течении одного и того же временного интервала.

Два основных подхода в достижении параллельности.

1) Параллельное программирование – его методы позволяют распределить работу программы между 2 и больше процессорами в рамках одного физического или одного виртуального компьютера. Преимущество – быстрота выполнения.

2) Распределенное программирование – его методы позволяют распределить работу программы между 2 или более процессорами, причем процессы могут существовать на одном или большем количестве компьютеров.

Распределенное программирование

Развитие современной вычислительной аппаратуры характеризуется четко выраженной тенденцией распространения многопроцессорных компьютеров и вычислительных сетей как локальных, так и глобальных. Уже недалеко то время, когда даже персональные компьютеры будут иметь несколько процессоров а самые мощные из них могут даже иметь сетевую архитектуру.

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

• распределенное программирование в малом;

• распределенное программирование в большом;

• распределенные прикладные программные системы.

<Параллельное программирование>

• Два события могут происходить одновременно, если они происходят в течении одного и того же временного интервала.

• Если несколько задач выполняются в течение одного и того же интервала, то говорят, что они выполняются параллельно.

• В однопроцессорной среде параллельные задачи существуют в одно и то же время и выполняются в течение одного и того же интервала времени за счет контекстного переключения.

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