- •1.Группы системных программ
- •5. Реализация понятия последовательного процесса в ос
- •6. Понятие процесса и потока.
- •7.Прерывания
- •9.. Обработка прерываний при участии супервизора.
- •10.Основные виды ресурсов
- •12. Функции ос по управлению задачами.
- •13. Планировщики и стратегии планирования.
- •14. Дисциплины диспетчеризации fcfs, srt, sjn.
- •15. Дисциплина диспетчеризации rr.
- •17. Качество диспетчеризации, гарантии обслуживания.
- •19. Память и отображения, виртуальное адресное пространство
- •20.Простое непрерывное распределение, оверлейные структуры
- •21. Разделы с фиксированными границами.
- •22. Разделы с подвижными границами
- •23. Сегментный способ организации виртуальной памяти
- •24. Страничный способ организации виртуальной памяти
- •25. Сегментно-страничный способ организации виртуальной памяти
- •26. Основные понятия и концепции организации ввода/вывода в ос
- •27.Режимы управления вводом/выводом
- •28. Закрепление устройств, общие устройства ввода/вывода
- •29.Синхронный и асинхронный ввод/вывод
- •30. Кэширование операций ввода/вывода при работе с накопителями на магнитных дисках
- •32. Функции файловой системы ос и иерархия данных
- •33. Трансляторы, интерпретаторы, компиляторы.
- •34. Этапы трансляции. Общая схема работы транслятора
- •35. Понятие прохода, особенности ассемблеров
- •36.Назначение и особенности построения таблиц идентификаторов
34. Этапы трансляции. Общая схема работы транслятора
в целом процесс компиляции состоит из двух основных этапов –синтеза и анализа.
На этапе анализа выполняется распознавание текста исходной программы, создание и заполнение таблиц идентификаторов. Результатом его работы служит некое внутреннее представление программы, понятное компилятору.
На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблице (таблицах) идентификаторов, порождается текст результирующей программы. Результат этого этапа – объектный код.
Кроме того, в составе компилятора присутствует часть, ответственная за анализ и исправление ошибок, которая при наличии ошибки в тексте исходной программы должна максимально полно информировать пользователя о типе ошибки и месте ее возникновения. В лучшем случае компилятор может предложить пользователю вариант исправления ошибки.
Эти этапы, в свою очередь, состоят из более мелких этапов, называемых фазами компиляции. Состав фаз компиляции приведен в самом общем виде, их конкретная реализация и процесс взаимодействия могут различаться в зависимости от версии компилятора. Однако в том или ином виде все представленные фазы практически всегда присутствуют в компиляторах.
Рассмотрим основные фазы (части) компиляции:
Лексический анализ (сканер) – это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического разбора. С теоретической точки зрения лексический анализатор не является обязательной, необходимой частью компилятора. Однако существует причины, которые определяют его присутствие практически во всех компиляторах.
Синтаксический разбор – это основная часть компилятора на этапе анализа. Она выполняет выделение синтаксических конструкций в тексте исходной программы, обработанном лексическим анализатором. На этой же фазе компиляции проверяется синтаксическая правильность программы. Синтаксический разбор играет главную роль – роль распознавателя текста входного языка программирования.
Семантический анализ – это часть компилятора, проверяющая правильность текста исходной программы с точки зрения семантики входного языка. Кроме непосредственно проверки, семантический анализ должен выполнять преобразования текста, требуемые семантикой входного языка (такие, как добавление функций неявного преобразования типов). В различных реализациях
компиляторов семантический анализ может частично входить в фазу синтаксического разбора, частично – в фазу подготовки к генерации кода.
Подготовка к генерации кода – это фаза, на которой компилятором выполняются предварительные действия, непосредственно связанные с синтезом текста результирующей программы, но еще не ведущие к порождению текста на выходном языке. Обычно сюда входят действия, связанные с идентификацией элементов языка, распределением памяти и т. п.
Генерация кода – это фаза, непосредственно связанная с порождением команд, составляющих предложения выходного языка и в целом текст результирующей программы. Это основная фаза на этапе синтеза результирующей программы. Кроме непосредственного порождения текста результирующей программы, генерация обычно включает в себя также оптимизацию – процесс, связанный с обработкой уже порожденного текста. Иногда оптимизацию выделяют в отдельную фазу компиляции, так как она оказывает существенное влияние на качество и эффективность результирующей программы.
Таблицы идентификаторов (иногда «таблицы символов») – это специальным образом организованные наборы данных, служащие для хранения информации об элементах исходной программы, которые затем используются для порождения текста результирующей программы. Элементами исходной программы, информацию о которых нужно хранить в процессе компиляции, являются переменные, константы, функции и т. п. – конкретный состав набора элементов
зависит от используемого входного языка программирования. Понятие «таблицы» вовсе не предполагает, что это хранилище данных должно быть организовано именно в виде таблиц или других массивов информации