Pergunta

Eu sei GC não era popular nos dias em que Ada foi desenvolvido e para o caso de uso principal da programação incorporada ainda não é uma boa escolha.

Mas, considerando que Ada é uma linguagem de programação de propósito geral por que não foi um coletor de lixo (traços únicos objetos de memória explicitamente marcadas) parciais e opcionais introduzidos em revisões posteriores da língua e as implementações do compilador.

Eu simplesmente não pode pensar em desenvolver uma aplicação normal desktop sem um coletor de lixo mais.

Foi útil?

Solução

Ada foi projetado com aplicações militares em mente. Uma das grandes prioridades na sua concepção foi determinismo. ou seja, um queria um programa Ada consistentemente executar exatamente da mesma forma todas as vezes, em qualquer ambiente, em todos os sistemas operacionais ... que tipo de coisa.

Um coletor de lixo vira um aplicativo em dois, trabalhando um contra o outro. programas Java desenvolver soluços a intervalos aleatórios quando o GC decide ir para o trabalho, e se ele é muito lento sobre isso há uma chance de que um aplicativo vai ficar sem pilha, por vezes, e não outros.

simplificado: introduz coletor de lixo Uma alguma variabilidade em um programa que os designers não queria. Você faz uma bagunça - você limpá-lo! Mesmo código, mesmo comportamento de cada vez.

Não que Ada se tornou um grande sucesso em todo o mundo, você mente.

Outras dicas

Porque Ada foi projetado para uso em sistemas de defesa que controlam as armas em tempo real, e interfere de coleta de lixo com o momento da sua aplicação. Isso é perigoso e é por isso, por muitos anos, Java veio com um aviso de que não era para ser usado para sistemas de saúde e de controle militar.

Eu acredito que a razão não há mais tal aviso com Java é porque o hardware subjacente tornou-se muito mais rápido, bem como o fato de que o Java tem melhores algoritmos de GC e melhor controle sobre GC.

Lembre-se que Ada foi desenvolvido na década de 1970 e 1980, numa época em que os computadores eram muito menos poderoso do que são hoje, e em aplicações de controle de problemas de tempo foram primordiais.

A resposta é mais complicada: a Ada não requer um coletor de lixo, por causa de restrições de tempo real e tal. No entanto, a língua foram inteligentemente concebido de modo a permitir a implementação de um coletor de lixo.

embora, muitos (quase todos) os compiladores não incluem um coletor de lixo, há alguns notável implementação:

  • um patch para GNAT
  • compiladores Ada visando a Máquina Virtual Java (eu não sei se esses projetos ainda são suportados). É usado o coletor de lixo da JVM.

existem muitas outras fontes sobre a coleta de lixo em Ada em torno da web. este assunto foi discutido longamente, principalmente por causa da concorrência feroz com Java em meados dos anos 90 '(dê uma olhada no desta página : "Ada 95 is what the Java language should have been"), quando o Java foi "The Next Big Thing" antes de a Microsoft chamou C #

.

Em primeiro lugar, não há nada na língua realmente que proíbe coleta de lixo.

Em segundo lugar algumas implementações executam a coleta de lixo . Em particular, todas as implementações que visam o lixo JVM coleta.

Em terceiro lugar, há uma maneira de obter uma certa quantidade de coleta de lixo com todos os compiladores. Você vê, quando um acesso tipo sai do escopo, se você disse specifially a língua para anular uma quantidade certian de espaço para armazenamento de seus objetos, em seguida, que o espaço será destruído naquele ponto. Eu usei isso no passado para obter algum mínimo de coleta de lixo. O voodo declaração que você usa é:

type Foo is access Blah;
for Foo'storage_size use 100_000_000; --// 100K

Se você fizer isso, então tudo (100K de) memória alocada para Blah objetos apontado por ponteiros Foo vai ser limpo quando o tipo Foo sai do escopo. Desde Ada permite sub-rotinas ninho dentro de outras sub-rotinas, isto é particularmente poderosa.

Para ver mais sobre o que STORAGE_SIZE e armazenamento de piscinas pode fazer por você, veja LRM 13,11

programas Ada quarto lugar, bem escritos não tendem a contar com alocação dinâmica de memória quase tanto como programas C fazem. C teve um número de buracos design que praticantes aprenderam a usar ponteiros para pintar sobre. Muitas dessas expressões não são nessecary em Ada.

Primeiro, eu gostaria de saber quem está usando Ada estes dias. Eu realmente gosto da língua, e não há sequer uma biblioteca GUI para Linux / Ada, mas eu não ouvi nada sobre desenvolvimento Ada ativa durante anos. Graças às suas conexões militares, estou realmente não tenho certeza se isso é história antiga ou tão grande sucesso que qualquer menção de seu uso é classificado.

Eu acho que há um par de razões para não GC em Ada. Em primeiro lugar, e acima de tudo, que remonta a uma época onde as línguas mais compilados usado empilhar principalmente ou memória estática, ou em alguns casos, pilha explícita alocar / livre. GC como uma filosofia geral realmente só tomou cerca de 1990 ou assim, quando OOP, melhores algoritmos de gerenciamento de memória e processadores suficientes poderosa para poupar os ciclos para executar tudo veio em seu próprio. O que simplesmente compilar Ada poderia fazer para um IBM 4331 de mainframe em 1989 era simplesmente implacável. Agora eu tenho um telefone celular que pode superar CPU dessa máquina.

Outra boa razão é que há pessoas que pensam que o design rigoroso programa inclui um controle preciso sobre os recursos de memória, e que não deve haver qualquer tolerância para deixar objetos dinamicamente adquirido float. Infelizmente, demasiadas pessoas acabaram vazando memória como memória dinâmica tornou-se mais e mais a regra. Além disso, como a "eficiência" da linguagem de montagem sobre linguagens de alto nível, e a "eficiência" da matéria-JDBC sobre sistemas ORM, a "eficiência" da gestão de memória manual tende a inverter como escalas até (eu vi benchmarks ORM onde o equivalente JDBC era apenas metade tão eficiente). Contra-intuitivo, eu sei, mas esses sistemas dias são muito melhores em otimizando globalmente grandes aplicações, mais eles são capazes de fazer re-otimizações radicais em resposta a superficialmente menor changes.Including re-equilibrar dinamicamente algoritmos em tempo real baseado em detectado carga.

Eu estou receoso que eu vou ter que diferem com aqueles que dizem que os sistemas em tempo real não pode ter recursos de memória GC. GC não é mais algo que congela todo o sistema a cada dois minutos. Nós temos muito mais inteligentes maneiras de recuperar a memória nestes dias.

Eu pensei que eu iria partilhar um exemplo muito simples de como implementar um procedimento gratuito () (que seria usado em uma maneira familiar a todos os programadores C) ...

with Ada.Integer_Text_IO, Ada.Unchecked_Deallocation;
use Ada.Integer_Text_IO;

procedure Leak is
   type Int_Ptr is access Integer;
   procedure Free is new Ada.Unchecked_Deallocation (Integer, Int_Ptr);

   Ptr : Int_Ptr := null;
begin
   Ptr := new Integer'(123);
   Free (Ptr);
end Leak;

chamadas gratuitas no final do programa irá retornar o Integer atribuído ao pool de armazenamento ( "pilha" em C jargão). Você pode usar valgrind para demonstrar que esta de fato impedem 4 bytes de memória ser vazado.

O Ada.Unchecked_Deallocation (um procedimento genericamente definido) pode ser usado em (eu acho) qualquer tipo que pode ser atribuído usando a "nova" palavra-chave. O Ada Reference Manual ( "13.11.2 Desmarcado armazenamento Desalocação") tem mais detalhes.

A sua pergunta é incorreta. Ele faz. Veja a ada.finalization pacote que lida com GC para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top