Распределение памяти во время трансляции - процесс, который ставит в соответствие лексическим единицам исходной программы (переменным, константам, функциям и т.п.) адрес, размер и атрибуты области памяти, необходимой для лексической единицы. Исходными данными для процесса распределения памяти служит таблица идентификаторов и область описания данных исходной программы.
Область памяти, отводимая для лексической единицы, классифицируется по разным параметрам.
По роли (доступности) области памяти в результирующей программе могут быть локальными и глобальными.
По способам распределения области памяти могут быть статическими и динамическими. Динамическая область памяти, в свою очередь, делится на распределяемую разработчиком исходной программы (с помощью специальных команд или директив транслятору) или компилятором (с помощью специального алгоритма).
Переменные, которые программист использует в своих программах, можно условно разделить на 2 типа: простые (базовые) типы данных и сложные структуры данных. К простым типам данных относятся, как правило, те данные, которые аппаратно поддерживаются микропроцессором: байт (знаковое или беззнаковое целое, символ), слово и т.п. К сложным структурам данных относят различного рода массивы, записи, объекты или классы.
|
|
Архитектура многих современных вычислительных систем позволяет выполнять более эффективную обработку данных, если адрес по которому выбираются данные, кратен определенному числу байтов (как правило, в зависимости от ширины шины данных микропроцессора) - говорят о выравнивании границ областей памяти. При каждом обращении к памяти считывается все слово, однако может использоваться только его часть - в зависимости от разрядности считываемых данных. К примеру, если шина данных является 32-х разрядной, то при считывании переменной длиной в 1 байт, считается из памяти 32-х разрядное слово, однако использоваться будет только младшие 8 бит этого слова.
Как правило, компилятор сам выбирает оптимальный метод распределения адресов под области памяти и изменяя границы выделенных областей, всегда корректно осуществляет доступ к ним. Проблемы могут возникнуть, когда с данными программы написанной на одном языке, начинают работать программы, написанные на другом языке программирования.