Question

Je sais que GC n'a pas été populaire dans les jours où Ada a été développé et pour les principaux cas d'utilisation de la programmation embarquée, il est toujours pas un bon choix.

Mais étant donné que Ada est un langage de programmation général pourquoi n'était pas une vue partielle et facultative (traces que les objets de mémoire marqués explicitement) garbage collector introduit dans les révisions ultérieures de la langue et les implémentations du compilateur.

Je ne peux tout simplement pas penser à développer une application de bureau normale sans un éboueur plus.

Était-ce utile?

La solution

Ada a été conçu avec des applications militaires à l'esprit. L'une des grandes priorités dans sa conception était déterminisme. dire voulait un programme Ada pour effectuer systématiquement la même manière à chaque fois, dans un environnement sous tous les systèmes d'exploitation ... ce genre de chose.

Un collecteur d'ordures tourne une application en deux, travaillant contre l'autre. Les programmes Java développent hoquet à des intervalles aléatoires lorsque le GC décide d'aller travailler, et si elle est trop lent à ce sujet il y a une chance qu'une application à court de tas parfois et pas d'autres.

simplifié: Un éboueur introduit une certaine variabilité dans un programme que les concepteurs ne voulaient pas. Vous faites un gâchis - vous nettoyer! Même code, même comportement à chaque fois.

Non que Ada est devenu un succès mondial qui fait rage, vous l'esprit.

Autres conseils

Parce que Ada a été conçu pour être utilisé dans les systèmes de défense qui contrôlent les armes en temps réel, et la collecte des ordures interfère avec le moment de votre demande. Cette situation est dangereuse qui est pourquoi, depuis de nombreuses années, Java est venu avec un avertissement qu'il ne devait pas être utilisé pour les systèmes de contrôle et de la santé militaire.

Je crois que la raison pour laquelle il n'y a plus un avertissement avec Java est parce que le matériel sous-jacent est devenu beaucoup plus rapide, ainsi que le fait que Java a de meilleurs algorithmes de GC et un meilleur contrôle sur GC.

Rappelez-vous que Ada a été développé dans les années 1970 et 1980 à un moment où les ordinateurs étaient beaucoup moins puissants qu'ils ne le sont aujourd'hui, et dans les applications de contrôle les délais étaient primordiaux.

la réponse est plus compliquée: Ada ne nécessite pas un collecteur de déchets, en raison des contraintes en temps réel et tel. cependant, la langue a été intelligemment conçu de manière à permettre la mise en œuvre d'un éboueur.

bien, beaucoup (presque tous) compilateurs ne comprennent pas un éboueur, il y a une mise en œuvre notable:

  • un patch pour GNAT
  • compilateurs Ada ciblant la machine virtuelle Java (je ne sais pas si ces projets sont encore pris en charge). Il a utilisé le garbage collector de la machine virtuelle Java.

il y a beaucoup d'autres sources au sujet de la collecte des ordures dans Ada autour du web. ce sujet a été longuement discuté, principalement en raison de la concurrence féroce avec Java dans le milieu des années 90 (un coup d'oeil à cette page : "Ada 95 is what the Java language should have been"), lorsque Java était "The Next Big Thing" avant que Microsoft a tiré C #

Tout d'abord, il n'y a rien dans la langue vraiment que prohibe la collecte des ordures.

Deuxièmement certaines implémentations ne pas effectuer la collecte des ordures . En particulier, toutes les implémentations qui ciblent les ordures JVM recueillent.

En troisième lieu, il est un moyen d'obtenir une certaine quantité de la collecte des ordures avec tous les compilateurs. Vous voyez, quand un accès type est hors de portée, si vous avez dit specifially la langue de mettre de côté une quantité certian d'espace pour le stockage de ses objets, alors que l'espace sera détruit à ce moment-là. Je l'ai utilisé dans le passé pour obtenir un minimum d'enlèvement des ordures. La déclaration voodo que vous utilisez est:

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

Si vous faites cela, alors tout (100K) mémoire allouée aux objets Blah pointé par des pointeurs Foo sera nettoyé lorsque le type Foo est hors de portée. Depuis Ada vous permet d'imbriquer dans d'autres sous-routines sous-routines, ce qui est particulièrement puissant.

Pour en savoir plus sur ce STORAGE_SIZE et des pools de stockage peuvent faire pour vous, voir LRM 13,11

En quatrième lieu, bien écrit des programmes Ada ne tendent pas à compter sur l'allocation dynamique de mémoire presque autant que les programmes C font. C avait un certain nombre de trous de conception qui ont appris à utiliser les praticiens conseils pour peindre. Beaucoup de ces idiomes ne sont pas nessecary en Ada.

Tout d'abord, je voudrais savoir qui utilise Ada ces jours-ci. En fait, je comme la langue, et il y a même une bibliothèque graphique pour Linux / Ada, mais je ne l'ai pas entendu parler de développement actif Ada pendant des années. Merci à ses relations militaires, je ne suis vraiment pas sûr que ce soit l'histoire ancienne ou un tel succès que d'une manière extravagante toute mention de son utilisation est classée.

Je pense qu'il ya deux raisons sans GC en Ada. Tout d'abord, et avant tout, il remonte à une époque où les langues les plus utilisées principalement compilées pile ou mémoire statique, ou dans quelques cas, tas explicite allouent / gratuit. GC en tant que philosophie générale vraiment pris son essor vers 1990 ou alors, quand POO, l'amélioration des algorithmes de gestion de la mémoire et des processeurs assez puissants pour épargner les cycles pour l'exécuter tous sont venus dans leur propre. Qu'est-ce que Ada simplement la compilation pourrait faire pour IBM mainframe 4331 en 1989 était tout simplement impitoyable. Maintenant, j'ai un téléphone cellulaire qui peut surpasser la CPU de cette machine.

Une autre bonne raison est qu'il ya des gens qui pensent que la conception du programme rigoureux comprend un contrôle précis sur les ressources de mémoire, et qu'il ne devrait pas y avoir de tolérance pour laisser des objets dynamiquement acquis flotter. Malheureusement, beaucoup trop de gens ont fini par une fuite de mémoire comme la mémoire dynamique devient de plus en plus la règle. De plus, comme le « efficacité » du langage assembleur sur des langages de haut niveau, et la « efficacité » de JDBC brut par rapport aux systèmes ORM, la gestion de la mémoire manuelle « efficacité » a tendance à inverser au fil des besoins (je l'ai vu des repères ORM où l'équivalent JDBC était seulement la moitié aussi efficace). Contre-intuitif, je sais, mais ces jours-systèmes sont beaucoup mieux à l'échelle mondiale de grandes applications optimisation, plus ils sont en mesure de faire re-optimisations radicales en réponse à changes.Including superficielle mineure algorithmes ré-équilibrage dynamique à la volée sur la base détectée charge.

Je crains que je vais devoir être d'accord avec ceux qui disent que les systèmes en temps réel ne peuvent pas se permettre la mémoire GC. GC est plus quelque chose qui bloque toutes les deux minutes tout le système. Nous avons des moyens beaucoup plus intelligents pour récupérer la mémoire ces jours-ci.

Je pensais que je partagerais un exemple très simple de la façon de mettre en œuvre une procédure gratuite () (qui serait utilisé d'une manière familière à tous les programmeurs 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;

Appel gratuit à la fin du programme renverra le alloué entier au pool de stockage ( « tas » dans le langage C). Vous pouvez utiliser valgrind pour démontrer que cela ne l'empêche en fait 4 octets de mémoire étant une fuite.

Le Ada.Unchecked_Deallocation (une procédure définie génériquement) peut être utilisé (je pense) tout type qui peut être allouée en utilisant le mot-clé « nouveau ». Le Manuel Ada Référence ( "13.11.2 Décoché Storage désallocation") a plus de détails.

Votre question est incorrecte. Cela fait. Voir le ada.finalization paquet qui gère GC pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top