Após procurar várias respostas em um estouro de pilha, fica claro que alguns idiomas compilados nativamente têm coleta de lixo . Mas não está claro para mim como exatamente isso funcionaria.
Entendo como a coleta de lixo pode funcionar com uma linguagem interpretada. O coletor de lixo simplesmente rodaria ao lado do intérprete e excluiria objetos não utilizados e inacessíveis da memória do programa. Ambos estão correndo juntos.
Como isso funcionaria com as linguagens compiladas? Meu entendimento é que, uma vez que o compilador tenha compilado o código-fonte para o código de destino - especificamente o código da máquina nativa - isso é feito. Seu trabalho está terminado. Então, como o programa compilado também pode ser coletado de lixo?
O compilador funciona com a CPU de alguma forma, enquanto o programa é executado para excluir objetos "lixo"? Ou o compilador inclui algum coletor de lixo mínimo no executável do programa compilado.
Acredito que minha última declaração teria mais validade do que a anterior devido a esse trecho desta resposta no Stack Overflow :
Uma dessas linguagens de programação é Eiffel. A maioria dos compiladores Eiffel gera código C por motivos de portabilidade. Este código C é usado para produzir código de máquina por um compilador C padrão. As implementações do Eiffel fornecem GC (e às vezes até GC preciso) para esse código compilado, e não há necessidade de VM. Em particular, o compilador VisualEiffel gerou código de máquina x86 nativo diretamente com suporte total ao GC .
A última declaração parece implicar que o compilador inclui algum programa no executável final que atua como um coletor de lixo enquanto o programa está sendo executado.
A página no site da linguagem D sobre coleta de lixo - que é compilada nativamente e possui um coletor de lixo opcional - também parece sugerir que algum programa em segundo plano seja executado ao lado do programa executável original para implementar a coleta de lixo.
D é uma linguagem de programação de sistemas com suporte para coleta de lixo. Geralmente, não é necessário liberar memória explicitamente. Apenas aloque conforme necessário, e o coletor de lixo retornará periodicamente toda a memória não utilizada para o conjunto de memória disponível.
Se o método mencionado acima for usado, como exatamente funcionaria? O compilador armazena uma cópia de algum programa de coleta de lixo e a cola em cada executável gerado?
Ou eu sou falha no meu pensamento? Em caso afirmativo, quais métodos são usados para implementar a coleta de lixo para linguagens compiladas e como exatamente eles funcionariam?
malloc()
.