- •Лабораторная работа № 1 Работа с таблицей символов
- •Краткие теоретические сведения Простейшие способы организации таблицы идентификаторов
- •Принципы работы хеш-функций
- •Построение таблиц идентификаторов на основе хеш-функций
- •Построение таблиц идентификаторов по методу цепочек
- •Комбинированные способы построения таблиц идентификаторов
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 2 Проектирование лексического анализатора
- •Краткие теоретические сведения
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 3 Построение простейшего дерева вывода
- •Краткие теоретические сведения
- •Распознавание цепочек кс-языков
- •Грамматики предшествования
- •Алгоритм “сдвиг-свертка” для грамматик простого и операторного предшествования
- •Общий алгоритм работы синтаксического анализатора
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты исходных грамматик
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 4 Генерация и оптимизация объектного кода
- •Краткие теоретические сведения
- •Алгоритм генерации объектного кода по дереву вывода
- •Построение ассемблерного кода по дереву вывода
- •Построение списка триад по дереву вывода.
- •Оптимизация объектного кода методом свертки
- •Оптимизация объектного кода методом исключения лишних операций
- •Общий алгоритм генерации и оптимизации объектного кода
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 5 Определения объема памяти для структур данных
- •Краткие теоретические сведения Принципы распределения памяти
- •Виды переменных и областей памяти Распределение памяти для переменных скалярных типов
- •Распределение памяти для сложных структур данных
- •Выравнивание границ областей памяти
- •Виды областей памяти. Статическое и динамическое связывание Глобальная и локальная память
- •Статическая и динамическая память
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты исходных грамматик
- •Варианты заданий
- •Рекомендуемая литература
- •Лабораторная работа № 6 Разработка простейшего приложения на основе технологии «клиент-сервер»
- •Краткие теоретические сведения Методы организации распределенных вычислений
- •Технология odbc
- •Технологии ole db и ado
- •Поддержка технологий доступа к субд в системах программирования
- •Проблемы и недостатки архитектуры «клиент-сервер»
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
Статическая и динамическая память
Статическая область памяти — это область памяти, размер которой известен на этапе компиляции.
Поскольку для статической области памяти известен ее размер, компилятор всегда может выделить эту область памяти и связать ее с соответствующим элементом программы. Поэтому для статической области памяти компилятор порождает некоторый адрес (как правило, это относительный адрес в программе). Статические области памяти обрабатываются компилятором самым простейшим образом, поскольку напрямую связаны со своим адресом. В этом случае говорят о статическом связывании области памяти и лексической единицы входного языка.
Динамическая область памяти — это область памяти, размер которой на этапе компиляции программы не известен.
Размер динамической области памяти будет известен только в процессе выполнения результирующей программы. Поэтому для динамической области памяти компилятор не может непосредственно выделить адрес — для нее он порождает фрагмент кода, который отвечает за распределение памяти (ее выделение и освобождение). Как правило, с динамическими областями памяти связаны многие операции с указателями и с экземплярами объектов (классов) в объектно-ориентированных языках программирования. При использовании динамических областей памяти говорят о динамическом связывании области памяти и лексической единицы входного языка.
Динамические области памяти, в свою очередь, можно разделить на динамические области памяти, выделяемые пользователем, и динамические области памяти, выделяемые непосредственно компилятором.
Динамические области памяти, выделяемые пользователем, появляются в тех случаях, когда разработчик исходной программы явно использует в тексте программы функции, связанные с распределением памяти (примером таких функций являются New и Dispose в языке Pascal, malloc и free в языке C, new и delete в языке C++ и другие). Функции распределения памяти могут использовать либо напрямую средства ОС, либо средства исходного языка (которые, в конце концов, все равно основаны на средствах ОС). В этом случае за своевременное выделение и освобождение памяти отвечает сам разработчик, а не компилятор. Компилятор должен только построить код вызова соответствующих функций и сохранения результата — в принципе, для него работа с динамической памятью пользователя ничем не отличается от работы с любыми другими функциями и дополнительных сложностей не вызывает.
Другое дело — динамические области памяти, выделяемые компилятором. Они появляются тогда, когда пользователь использует типы данных, операции над которыми предполагают перераспределение памяти, не присутствующее в явном виде в тексте исходной программы. Примерами таких типов данных могут служить строки в некоторых языках программирования, динамические массивы и, конечно, многие операции над экземплярами объектов (классов) в объектно-ориентированных языках (наиболее характерный пример — тип данных string в Borland Delphi). В этом случае сам компилятор отвечает за порождение кода, который будет всегда обеспечивать своевременное выделение памяти под элементы программы и за освобождение ее по мере использования.
Как статические, так и динамические области памяти сами по себе могут быть глобальными или локальными.
