Після перегляду декількох відповідей на переповнення стека, зрозуміло, що деякі натільно складені мови мають збір сміття . Але мені незрозуміло, як саме це працювало б.
Я розумію, як збирання сміття могло працювати з інтерпретованою мовою. Збірник сміття просто працює поруч з інтерпретатором і видаляє невикористані та недоступні об'єкти із пам'яті програми. Вони обоє бігають разом.
Як би це працювало зі складеними мовами? Я розумію, що після того, як компілятор скомпілював вихідний код до цільового коду - конкретно нативного машинного коду - це робиться. Його робота закінчена. То як же складена програма може також збирати сміття?
Чи компілятор працює з процесором якимось чином, поки виконується програма для видалення об'єктів "сміття"? Або компілятор містить якийсь мінімальний збирач сміття у виконаному файлі складеної програми.
Я вважаю, що моє останнє твердження матиме більшу валідність, ніж перше, завдяки цій уривці з цієї відповіді про переповнення стека :
Однією з таких мов програмування є Ейфель. Більшість компіляторів Ейфеля генерують код C з міркувань портативності. Цей код C використовується для створення машинного коду стандартним компілятором C. Реалізації Ейфеля забезпечують GC (а іноді навіть точний GC) для цього складеного коду, і в VM немає необхідності. Зокрема, компілятор VisualEiffel генерував власний машинний код x86 безпосередньо з повною підтримкою GC .
Останнє твердження, мабуть, означає, що компілятор включає якусь програму в остаточному виконуваному файлі, яка виконує функції збору сміття під час роботи програми.
Сторінка на веб-сайті мови D про збирання сміття - яка є власне зібраною і має необов'язковий збірник сміття - також начебто натякає, що деяка фонова програма працює поряд з оригінальною виконуваною програмою для здійснення збору сміття.
D - мова програмування систем з підтримкою збору сміття. Зазвичай не потрібно явно звільняти пам’ять. Просто виділіть за потребою, і сміттєзбірник періодично повертає всю невикористану пам'ять у пул доступної пам’яті.
Якщо метод згаданий вище буде використовуватися, як саме він буде працювати? Чи зберігає компілятор копію якоїсь програми збору сміття та вставляє її у кожен створений нею виконаний файл?
Або я хибний у своєму мисленні? Якщо так, то які методи використовуються для здійснення збору сміття для складених мов і як саме вони працюватимуть?
malloc()
.