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