Яка потреба у збиранні сміття (GC) мовою на основі стека? Такою мовою, як Forth або RPL (на калькуляторах HP ), чи є необхідність у збиранні сміття?
Я б подумав, оскільки вихід вискокує з стека, що це не буде потреби. Я щось пропускаю?
Яка потреба у збиранні сміття (GC) мовою на основі стека? Такою мовою, як Forth або RPL (на калькуляторах HP ), чи є необхідність у збиранні сміття?
Я б подумав, оскільки вихід вискокує з стека, що це не буде потреби. Я щось пропускаю?
Відповіді:
GC зазвичай застосовується до пам'яті, виділеної на купі. Я не знайомий з Forth або RPL, але якщо немає купи, і все натомість зберігається на глобальному стеці, то GC нічого робити не може.
Так, ви праві. Але основоположність стеку - це лише частина всієї історії. Наприклад, інтерпретатор байт-кодів Java також базується на стеці (складений код працює - з міркувань ефективності - інакше). Це говорить нам, що будь-яка мова може бути перетворена на мову стека.
Важливими є об'єкти поза стеком, ті, хто може пережити поточне виконання методу. Поки мова не має нічого подібного malloc
або new
, немає таких об'єктів і вам не потрібен delete
ні GC.
Мова, що не має динамічного розподілу пам'яті, досить обмежена у своїй корисності.
Збір сміття необхідний, якщо мова буде підтримувати динамічні структури даних по суті. Що майже необхідне, якщо ви хочете зробити що-небудь понад рівень С. Без цього ви застрягли лише у структурах даних фіксованого розміру та самостійно керуєте пам'яттю. Це те, що робить оригінальний Forth, звичайно, але це, мабуть, не те, що ви хотіли б зробити сьогодні, якщо тільки ви робите лише кодування систем низького рівня.
Збір сміття не потрібен, якщо мова використовує статичне виділення замість розподілу стека. Наприклад, Fortran 77 з опцією -s (статичне зберігання) виділяє всю пам'ять під час запуску програми, тому не відбувається виділення пам'яті під час виконання, щоб звільнитися. Хоча це вимагає певної дисципліни, можна писати програми, особливо симуляції, щоб використовувати статичний розподіл пам'яті. Статичний розподіл усуває будь-які витоки пам'яті та призводить до приголомшливої продуктивності кешу, оскільки компілятор може використовувати статичний аналіз, щоб визначити, що завантажувати в кеш.