oap_7(транс, компоновка, классы памяти).ppt
- Количество слайдов: 43
Классы памяти и область действия переменных
Область действия та часть программы, в которой переменная может быть использована (доступна) ► Тело функции или блока ► Текущий модуль от места определения до конца мод. ► Все модули
Время жизни – интервал времени работы программы, в течении которого переменная существует ► внутри функций – локальные (внутренние) переменные ► при определении параметров функций формальные параметры ► вне функций – глобальные (внешние ) переменные
Классы памяти ► динамическая память- выделяется при вызове функций и освобождается при выходе (нач. значения мусор) атрибуты – auto (автоматический); register (регистровый) ► статическая память – распределяется на этапе трансляции и заполняется по умолчанию нулем атрибуты extern (внешние); static (статические)
Автоматические переменные auto Локальные (по умолчанию) существуют временно на этапе активности функции, блока, цикла располагаются в стековой области памяти
Регистровые переменные register ► увеличивает быстродействие программы ► хранятся в регистрах общего назначения процессора (или в стековой памяти) ► размер объекта не превышает разрядности регистра (для масс, структур, объединений и вещ. , не применима операц. &)
Статические переменные static имеют ограничение области действия ► Собственные статические переменные функции (сохраняются при повторном вызове функций) ► Статические переменные, определенные вне функции (применим в пределах оставшегося файла)
Внешние переменные ► должна быть определена вне всяких функций ► только одно определение внешней переменной ► выделяется фактическое место в памяти ► включение extern для доступа к переменной, определенной позже ► любая инициализация внешней переменной – в декларации
. Файл a. cpp Файл b. cpp определение переменной объявление переменной int a, B[20]={1, 5, 4, 7}; a, B[]; . . . область действия. . . main() extern int. . . область
Модификатор выделения памяти не указан (по умолчанию static) не указан (по умолчанию auto) auto Место объявления переменной вне функции до конца блока запрещено вне функции в функции – register static вне функции static в функции extern вне функции Время существова ния Обобщенная характеристика до конца файла глобальное глобальная переменная файла в функции запрещено вне функции в функции register Область видимости до конца блока – локальное локальная переменная – – до конца блокальное быстрая локальная переменная до конца глобальное глобальная переменная файла до конца блока глобальное сохраняемая локальная переменная до конца глобальное глобальная переменная
Препроцессор Трансляция Компилирование Библиотеки
трансляторы ► Интерпретаторы - сканируют и проверяют исходный код в один шаг, ► Компиляторы - сканируют исходный код для производства текста программы на машинном языке, которая затем выполняется отдельно.
интерпретаторы ► Бо льшая независимость от платформы исполнения ► Упрощается построчная отладка программы; ► Более совершенные и наглядные средства диагностики ошибок
► Программы выполняются медленнее; ► Программа занимает больше места в памяти; ► Программа не может выполняться отдельно без интерпретатора; ► Практически отсутствует оптимизация кода. Исполняет программы
Алгоритм работы простого интерпретатора ►# "прочитать следующую инструкцию "; ► # "проанализировать инструкцию и определить соответствующие действия "; ► # "выполнить соответствующие действия "; ► # "если не достигнуто условие завершения программы, вернуться к началу ".
Компилятор ► транслятор текста на машинный язык, который считывает исходный текст. Строит программы
Редактирование текста stdio. h Заголовочный файл Исходный текст P. cpp Prog. cpp Транслятор Stdio. c Препроцессор Лексический анализ Синтаксич анализ Библиотечные файлы Семантический анализ Генерация кода, оптимизация prog. obj Объектный модуль p. obj Компоновщик prog. exe Исполняемая программа, загрузочный модуль, программный файл.
1. Трансляция ► Задача препроцессора –(спец. программа обработки) преобразование текста программы до ее компиляции (замену одних частей текста на другие) ► ПРЕПРОЦЕССОР -- предварительная фаза трансляции на уровне преобразования исходного текста программы ►# ►;
возможности ► Лексемное замещение ID ► Макрозамещение ► Включение файлов исходного текста ► Условная компиляция ► Изменение нумерации строк и текущего имени файла
1. 1. Макроподстановка #define ID замещающий текст Имена в #define - как переменные Область действия #define - от данного определения до конца программы
Примеры
1. 2. Макрозамещение (макроопределение) Обобщение лексемного замещения посредством параметризации строки #define ID(парам-ы) стр_с_парам-и
Директивы отмены #undef отменяет самое последнее определение поименованного макроопределения #undef getchar int getchar (void) {…}
#define TRI 3 #define F 5 #undef TRI /* TRI теперь не определен*/ #define F 10 /* F переопределен как 10 */ #undef F /* F снова равен 5 */ #undef F /* F теперь не определен */
#define paste(first, sec) first ## sec //Paste(a, 1) генерирует имя a 1.
1. 3. Условная компиляция управляет ходом препроцессирования (выборочное включение) Директивы: #ifdef, #else, #endif, #elif
► вычисляется предикат условия в #if (не должно sizeof и enum) ► если не ноль, то будут включены все послед строки до #endif #else
1. 4. Включение файла Включает текст заголовочного файла, содержащего объявление внешних функций из библиотеки…. . #include <имя_файла> #include "имя_файла " #include “w. h” - //текущ. , системн. #include <stdio. h> //системн.
Продолжение трансляции ► Лексический анализ (правила правописания слов) ► СИНТАКСИС языка программирования (правила составления предложений и слов) ► СЕМАНТИКА языка программирования (проверка смысловой правильности конструкции) ► ГЕНЕРАЦИЯ КОДА (преобразование во внутреннее представление
2. Компоновка результат трансляции - ОБЪЕКТНЫЙ МОДУЛЬ ► готовые к выполнению коды команд, ► адреса и ► содержимое памяти данных (собственные, внутренние объекты)
Модульное программирование – представление программы в виде нескольких файлов, каждый транслируется отдельно. - Модул прог. - - использ стандарт библ функций
► БИБЛИОТЕКА ОБЪЕКТНЫХ МОДУЛЕЙ ► КОМПОНОВКА – процесс сборки программы из объектных модулей, в котором производится их объединение в исполняемую программу и связывание вызовов функций и кодов (их внутр. представления), расположенных в различных модулях
Различие между определением и объявлением ► ОПРЕДЕЛЕНИЕ ПЕРЕМЕННОЙ ИЛИ ФУНКЦИИ -- процесс создания программного эквивалента переменной или функции транслятором по их описанию в программе (трансляция во внутреннее представление)
В определении переменной: -задан тип переменной; ► -задано имя переменной; ► -определяется размерность и резервируется память; ► -производится инициализация памяти; ► -для доступа к переменной из других модулей в текущем модуле может быть создана точка входа. int a = 5 , B[10]={ 1, 6, 3, 6, 47, 55, 44, 77 }; ►
В определении функции: -задан тип результата; ► -задано имя функции; ► -задан список формальных параметров и их типов; ► -транслируется тело функции; ► -для вызова функции из других модулей в текущем модуле может быть создана точка входа. int strcmp(char *s, char *d) {. . . } ►
► ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ ИЛИ ФУНКЦИИ -- информация транслятору о том, что указанные переменная или функция где-то определены, но неизвестны в данный момент транслятору
В объявлении переменной: -задан тип переменной; ► -задано имя переменной. ► -запоминается факт наличия переменной с указанными именем и типом. ► extern ► int a, B[];
►с Различия определением связан процесс создания программного объекта ► объявление - лишь подтверждение факта существования переменной или функции ► Объявлений одной и той же переменной или функции в программе может быть сколь угодно много, а определение всегда одно. ► объявления транслятор всегда “принимает на веру”
oap_7(транс, компоновка, классы памяти).ppt