Чи є необхідність у збиранні сміття мовою на основі стека?


16

Яка потреба у збиранні сміття (GC) мовою на основі стека? Такою мовою, як Forth або RPL (на калькуляторах HP ), чи є необхідність у збиранні сміття?

Я б подумав, оскільки вихід вискокує з стека, що це не буде потреби. Я щось пропускаю?

Відповіді:


14

GC зазвичай застосовується до пам'яті, виділеної на купі. Я не знайомий з Forth або RPL, але якщо немає купи, і все натомість зберігається на глобальному стеці, то GC нічого робити не може.


2
Типовою схемою використання пам'яті програм Forth, яку я читав у перші дні, було те, що вони схожі на програми складання, оскільки вони використовували заздалегідь встановлені статичні глобальні адреси даних. Це працює, тому що Forth має можливість передавати дані між стеком і конкретними адресами. Далі він має можливість обчислювати адреси. Таким чином, можна було б створити бібліотеку алокаторів на основі концепції купи, і бібліотеці розподільника буде потрібен певний спосіб впоратися з кінцевим розміром купи. Якщо четвертий користувач пішов по цьому шляху, він міг би захотіти і реалізувати GC.
Кардіфф космічний чоловік

13

Так, ви праві. Але основоположність стеку - це лише частина всієї історії. Наприклад, інтерпретатор байт-кодів Java також базується на стеці (складений код працює - з міркувань ефективності - інакше). Це говорить нам, що будь-яка мова може бути перетворена на мову стека.

Важливими є об'єкти поза стеком, ті, хто може пережити поточне виконання методу. Поки мова не має нічого подібного mallocабо new, немає таких об'єктів і вам не потрібен deleteні GC.

Мова, що не має динамічного розподілу пам'яті, досить обмежена у своїй корисності.


не впевнений, що я згоден з останнім рядком, чи не корисний байт-код Java?
jk.

@jk., байт-код Java має динамічне розподіл пам'яті.
Пітер Тейлор

1
Насправді, існує кілька мов загального призначення, які базуються на стеках. Подивіться на factorcode.org
Ям Маркович

1
Фактично чинником є ​​збирання сміття
Андреа

1

Збір сміття необхідний, якщо мова буде підтримувати динамічні структури даних по суті. Що майже необхідне, якщо ви хочете зробити що-небудь понад рівень С. Без цього ви застрягли лише у структурах даних фіксованого розміру та самостійно керуєте пам'яттю. Це те, що робить оригінальний Forth, звичайно, але це, мабуть, не те, що ви хотіли б зробити сьогодні, якщо тільки ви робите лише кодування систем низького рівня.


1

Збір сміття не потрібен, якщо мова використовує статичне виділення замість розподілу стека. Наприклад, Fortran 77 з опцією -s (статичне зберігання) виділяє всю пам'ять під час запуску програми, тому не відбувається виділення пам'яті під час виконання, щоб звільнитися. Хоча це вимагає певної дисципліни, можна писати програми, особливо симуляції, щоб використовувати статичний розподіл пам'яті. Статичний розподіл усуває будь-які витоки пам'яті та призводить до приголомшливої ​​продуктивності кешу, оскільки компілятор може використовувати статичний аналіз, щоб визначити, що завантажувати в кеш.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.