Existe uma necessidade de coleta de lixo em um idioma baseado em pilha?

16

Qual é a necessidade de coleta de lixo (GC) em um idioma baseado em pilha? Em um idioma como Forth ou RPL (nas calculadoras HP ), há necessidade de coleta de lixo?

Eu pensaria que, como a saída é removida da pilha, não haveria necessidade. Estou esquecendo de algo?

Todd Moses
fonte

Respostas:

14

O GC é normalmente aplicado à memória alocada no heap. Não estou familiarizado com Forth ou RPL, mas se não houver heap e tudo estiver armazenado em uma pilha global, não haverá nada para o GC fazer.

Mike Baranczak
fonte
2
O padrão típico de uso de memória dos quatro programas que li nos primeiros dias era como se fossem programas de montagem, pois usavam endereços de dados globais estáticos previamente combinados. Isso funciona porque a Forth tem a capacidade de transferir dados entre a pilha e endereços específicos. Além disso, ele tem a capacidade de calcular endereços. Assim, seria possível criar uma biblioteca de alocadores com base em um conceito de heap e a biblioteca de alocadores precisaria de alguma maneira de lidar com o tamanho finito do heap. Se um quarto usuário seguisse esse caminho, ele poderia querer e implementar o GC.
cardiff space man
13

Sim, você está certo. Mas a base da pilha é apenas uma parte de toda a história. Por exemplo, o interpretador Java bytecode também é baseado em pilha (o código compilado funciona - por razões de eficiência - de maneira diferente). Isso nos diz que qualquer idioma pode ser transformado em um idioma de pilha.

O que importa são os objetos fora da pilha, aqueles que podem sobreviver à execução atual do método. Desde que a linguagem não tenha nada parecido mallocou newnão, não existem esses objetos e você não precisará deletenem do GC.

Um idioma sem alocação dinâmica de memória é bastante limitado em sua utilidade.

maaartinus
fonte
não tenho certeza de que concordo com a última linha, o java bytecode não é útil?
jk.
@jk., java bytecode possui alocação de memória dinâmica.
Peter Taylor
1
Na verdade, existem várias linguagens de uso geral baseadas em pilha. Dê uma olhada no factorcode.org
Yam Marcovic
1
Na verdade fator é lixo coletado
Andrea
1

A coleta de lixo é necessária se o idioma suportar estruturas de dados dinâmicas inerentemente. O que é quase uma necessidade se você deseja fazer algo além do nível C. Sem isso, você fica preso apenas a estruturas de dados de tamanho fixo e gerenciando a memória por conta própria. É o que o Forth original faz, é claro, mas provavelmente não é algo que você gostaria de fazer hoje, a menos que você esteja apenas codificando sistemas de baixo nível.

trans
fonte
1

A coleta de lixo não é necessária se o idioma usar alocação estática em vez de alocação de pilha. Por exemplo, o Fortran 77 com a opção -s (armazenamento estático) aloca toda a memória quando o programa é iniciado, portanto, nenhuma alocação de memória ocorre no tempo de execução para ser liberada. Embora exija alguma disciplina, é possível escrever programas, especialmente simulações para usar a alocação de memória estática. A alocação estática remove qualquer vazamento de memória e leva a um ótimo desempenho do cache, pois o compilador pode usar a análise estática para determinar o que carregar no cache.

Michael Shopsin
fonte