
- •Обчислення виразів
- •Типи виразів
- •Арифметичні вирази, відношення, логічні, базові вирази
- •Приклади виразів
- •Використання та зміна значення виразів
- •Правила конструювання виразів
- •Суворо типізована мова
- •Зведення типів
- •Явне зведення типів
- •Неявне зведення типів
- •Уникнення суворої типізації
- •Існування та дія програмних об'єктів
- •Період існування та область дії
- •Нумерація, номер і глибина вкладеності блока
- •Блокова структура програми
- •Мембранний ефект.
- •Регулювання області дії блока
- •Регулювання періоду існування
- •Блокова структура програми
- •Глобальне розрізнення видимості позначень (імен)
- •Стратегії розподілу пам'яті
- •Стратегія статичного розподілу пам'яті
- •Стратегія динамічного розподілу пам'яті на основі блока
- •Стратегія динамічного розподілу пам'яті на основі блока (продовження)
- •Стратегія розподілу пам'яті в купі
- •Стратегія розподілу пам'яті в купі (продовження)
- •Динамічний розподіл пам'яті на основі купи (Pascal)
- •Динамічний розподіл пам'яті на основі купи (c)
- •Приклади утворення сміття
Стратегія динамічного розподілу пам'яті на основі блока
зв'язок між ім'ям змінної та генерованим вмістом установлюється під час виконання програми, при обробці блока, тому може змінюватися при повторному входженні у блок;
розподіл пам'яті відбувається під час обробки відповідної частини блока, що містить описи об'єктів;
всі об'єкти у блоці є локальними, мають локальний період існування та локальну область дії, які обмежені даним блоком і підпорядковані мембранному ефекту;
пам'ять для об'єктів захоплюється у міру появи описів об'єктів у блоці та вивільняється у зворотному порядку при закритті блока;
Стратегія динамічного розподілу пам'яті на основі блока (продовження)
для організації цієї пам'яті використовується механізм стека типу «перший прийшов – останнім пішов» [];
стек організовується у спеціальному місці пам'яті програми - сегменті стека, що має обмежений розмір, зазвичай близько 64 К;
захоплення та вивільнення пам'яті здійснюються автоматично;
генерований вміст значенням не ініціалізується.
Стратегія розподілу пам'яті в купі
зв'язок між ім'ям змінної та генерованим вмістом, установлюється під час виконання програми, тому може змінюватися;
розподіл пам'яті для вмісту здійснюється ручним запуском генератора на спеціальну ділянку пам'яті за принципом «куди-небудь – на вільне місце»;
ділянка пам'яті організується у спеціальному місці пам'яті програми - купі (heap), яка має доволі|досить| великий розмір;
об'єкти, для яких розподіляється пам'ять (звичайно це вказівні типізовані змінні), можуть бути як глобальними, так і локальними, але в останньому необхідно враховувати період існування та області дії;
Стратегія розподілу пам'яті в купі (продовження)
захоплення та вивільнення пам'яті відбувається вручну шляхом використання спеціальних операторів;
оскільки генерований вміст не має постійного зв'язку з відповідним ім'ям, а пам'ять, що займає її вміст у купі, автоматично не вивільняється, то в деякий момент часу цей зв'язок можна розірвати, і якщо на даний вміст не посилається жодне інше ім'я, то цей вміст стає недоступним, і являє собою в купі «сміття» (garbage);
«сміття» не можна зайняти під значення іншого вмісту;
для вивільнення зайнятої «сміттям» пам'яті передбачаються спеціальні процедури збирання «сміття»;
генерований вміст значенням не ініціалізується.
Реалізація стратегії статичного розподілу пам'яті (Pascal)
program My;
var
nA : integer;
cA : char;
pA : pointer;
pnA : ^integer;
const
nB: integer = 5;
Begin
…
End.
Реалізація стратегії статичного розподілу пам'яті (C)
static int nA;
void main ()
{
static int nB;
{
static char cA;
}
}
Реалізація стратегії динамічного розподілу пам'яті на основі блоку (Pascal)
program My;
procedure A;
var ____//_____
const ____//_____
begin
…
end;
Begin
…
End.
Реалізація стратегії динамічного розподілу пам'яті на основі блоку (С)
void main ()
{
auto int nB;
{
char cA;
}
}
пам'ять під об'єкти (змінні) nB і cA буде розподілено динамічно «при вході» у блок, а конструкції об'єктів буде розміщено у стеку. Оскільки більшість об'єктів розподіляється саме в такий спосіб, то в мові С прийнято рішення замовчувати описувач auto.
Динамічний розподіл пам'яті на основі купи
Купа (heap) - це спеціальний спосіб розподілювана пам'ять. Особливість розподілу купи полягає в тому, він здійснюється на вільне місце в пам'яті-купі під управлінням спеціального засобу – менеджера купи.
Спільним для більшості мов є те, що для реалізації цієї стратегії використовується вказівна типізована змінна. При цьому сама змінна розподіляється статично або динамічно на основі блока, а її розіменований уручну вміст розміщується в купі.
Рис. Розподіл пам’яті в купі за допомогою
вказівної типізованої змінної