- •3. Классификация языков по н. Хомскому.
- •4. Нотация Бэкуса-Наура
- •6. Дерево вывода. Левосторонний и правосторонний выводы
- •Пример построения Деревьев
- •Синтаксический анализ кс-языков
- •7. Однозначные и неоднозначные грамматики.
- •8. Основные понятия, связанные с процессами трансляции
- •9. Этапы и фазы процесса трансляции. Характеристики основных этапов
- •10. Цепочки символов. Понятие лексемы. Задачи лексического анализатора
- •11. Лексический анализ с помощью конечных автоматов
- •12. Алгоритм построения детерминированного конечного автомата по недетерминированному конечному автомату
- •14. Нормальная форма Хомского
- •16. Построение дерева синтаксического разбора.
- •17. Нисходящий синтаксический анализ
- •18. Ll(1) – грамматики
- •19. Восходящий синтаксический анализ
- •20. Таблицы транслятора
- •21. Организация таблиц символов компилятора
- •22. Основные элементы, требующие память во время выполнения.
- •23. Механизмы распределения памяти.
- •24. Стековое управление памятью.
- •25. Статическое управление памятью.
- •26. Управление кучей.
- •27. Сборка мусора.
24. Стековое управление памятью.
Простейший метод управления памятью. В начале выполнения свободная память представляет собой блок из последовательных слов памяти. При запросе памяти выделяется область, состоящая из последовательных ячеек этого стека, начинающаяся с одного конца. Память должна освобождаться в порядке, обратном запросам так, что блок освобожденной памяти всегда лежит на вершине стека. Задачи утилизации, уплотнения и повторного использования при такой организации становятся тривиальными. Ед. указатель стека – все, что требуется для управления памятью. Указатель стека всегда указывает на очередное свободное слово в памяти, т.е. на текущую вершину стека.
Вся использующаяся память лежит ниже позиции, на которую указывает указатель стека. Вся сводная память лежит выше этой позиции. Когда запрашивается блок размером k ячеек, указатель просто продвигается на k позиций вверх по стеку. Когда освобождается блок из k ячеек, указатель продвигается на k позиций вниз. Проблемы уплотнения не существует, т.к. оно выполняется автоматически. Привлекательность этого метода объясняется характерной для многих языков строго вложенной структурой входа подпрограмм и выходов из них, подчиняющихся правилу «последним вошел – первым вышел».
Многие элементы программы и данные, требующие памяти, связаны с активацией подпрограмм. Часто оказывается, что стековую память можно использовать как для точек возврата из подпрограмм, так и для таблиц локальной среды подпрограмм. Кроме того, выделение памяти для временных переменных, используемых для вычисления выражений и передачи параметров, так же может быть связано с активацией подпрограмм. Обычно транслятор может определить число временных переменных, требуемых для каждой активации подпрограмм. При выполнении программы память для временных переменных можно выделить в стеке в момент инициирования каждой новой активации подпрограмм и освобождать ее по завершению активации. Большое значение также ограничение, которое состоит в том, то структуры данных могут создаваться программистом только при входе подпрограмм и должны обязательно уничтожаться при выходе. Такая организация памяти позволяет использовать стековое распределение памяти и для структур данных, определяемых программистом. Обычно все элементы, связанные с одной активацией подпрограммы и требующие памяти в стеке, группируются в единую активационную запись. При вызове подпрограммы на вершине стека создается новая активационная запись, которая удаляется при завершении подпрограммы.
25. Статическое управление памятью.
Простейший способ распределения памяти – статическое распределение. То есть распределение памяти, при трансляции, остающееся неизменным в ходе выполнения.
Статически обычно распределяется память для пользовательских и системных программ, а так же для буфера ввода – вывода и различных системных данных. Статическое распределение не требует во время выполнения никаких программных средств управления памятью и при этом отпадают вопросы утилизации памяти и повторного ее распределения, например, в фортране вся память распределена статически и каждая программа компилируется отдельно от остальных, при этом компилятор создает блок памяти, содержащий скомпилированную программу, ее область данных, временные переменные, позиции для точки возврата, а также области системных данных.
Программа – загрузчик выделяет пространство в памяти для этих скомпилированных блоков. В процессе выполнения программы не происходит никакого управления памятью. Статическое распределение памяти эффективно, т.к. на управление памятью во время выполнения не тратится ни времени, ни памяти, но этот метод несовместим с рекурсивными вызовами подпрограмм, со структурами данных, размер которых зависит от вычисляемой или вводимой информации и со многими другими желательными возможностями языка.