Frage

Ich weiß, GC in den nächsten Tagen nicht populär war, als Ada und für den Hauptanwendungsfall von Embedded-Programmierung entwickelt wurde, ist es immer noch keine gute Wahl.

Aber wenn man bedenkt, dass Ada ist eine Allzweck-Programmiersprache, warum nicht ein teilweise und optional (Spuren nur explizit markierten Speicherobjekte) Garbage Collector in späteren Revisionen der Sprache eingeführt und die Compiler-Implementierungen.

Ich kann einfach nicht mehr denkt eine normale Desktop-Anwendung ohne Garbage Collector zu entwickeln.

War es hilfreich?

Lösung

Ada wurde mit militärischen Anwendungen konzipiert. Einer der großen Prioritäten in seinem Design war Determinismus. das heißt man wollte ein Ada-Programm konsequent durchführt genau die gleiche Art und Weise jedes Mal, in jeder Umgebung, unter allen Betriebssystemen ... das Ding irgendwie.

A garbage collector wendet eine Anwendung in zwei, gegeneinander arbeiten. Java-Programme entwickeln Schluckauf in unregelmäßigen Abständen, wenn der GC zur Arbeit zu gehen entscheidet, und wenn es darüber zu langsam ist es eine Chance, dass eine Anwendung aus Haufen läuft manchmal und andere nicht.

Vereinfacht: Ein Garbage Collector eine gewisse Variabilität in ein Programm eingeführt, das die Designer nicht wollen. Sie machen ein Chaos - Sie können es aufzuräumen! Gleicher Code, gleiches Verhalten jedes Mal.

Nicht, dass Ada wurde ein rasender weltweiten Erfolg, Geist Sie.

Andere Tipps

Da Ada wurde für den Einsatz in Verteidigungssystemen entwickelt, die Waffen in Echtzeit steuern und Garbage Collection stört das Timing Ihrer Anwendung. Das ist gefährlich, weshalb seit vielen Jahren, Java mit einer Warnung kam, dass es nicht für das Gesundheitswesen und militärische Kontrollsysteme verwendet werden.

Ich glaube, dass der Grund, warum es nicht mehr solche Erklärung mit Java ist, weil die zugrunde liegende Hardware viel schneller als auch die Tatsache worden ist, dass Java besser GC-Algorithmen und eine bessere Kontrolle über GC hat.

Beachten Sie, dass Ada wurde in den 1970er und 1980er Jahren zu einer Zeit entwickelt, als Computer weit weniger mächtig waren, als sie es heute sind, und in Steuerungsanwendungen Timing-Probleme waren von größter Bedeutung.

Die Antwort ist komplizierter: Ada kein Garbage Collector erfordern, wegen der Echtzeitbedingungen und so weiter. jedoch wurde die Sprache geschickt entworfen, um die Implementierung eines Garbage Collector zu ermöglichen.

obwohl viele (fast alle) Compiler enthalten keinen Garbage Collector, gibt es einige bemerkenswerte Umsetzung:

  • ein Patch für GNAT
  • Ada Compiler die Java Virtual Machine-Targeting (ich weiß nicht, ob diese Projekte noch unterstützt werden). Es verwendet, um die Garbage Collector der JVM.

Es gibt viele andere Quellen über die Garbage Collection in Ada rund um das Web. Dieses Thema wurde wegen des harten Wettbewerbs in der Mitte der 90er Jahre mit Java endlich, vor allem diskutiert (haben einen Blick auf diese Seite : "Ada 95 is what the Java language should have been"), wenn Java war "The Next Big Thing", bevor Microsoft zog C #

Zunächst einmal gibt es nichts in der Sprache wirklich, dass verbietet Garbage Collection.

Zweitens einige Implementierungen Sie führen Garbage Collection . Insbesondere alle Implementierungen, die die JVM Garbage Ziel sammeln.

Drittens gibt es eine Möglichkeit, eine gewisse Menge an Garbage Collection zu erhalten mit allen Compilern. Sie sehen, wenn ein Zugriff geben Sie den Gültigkeitsbereich verlässt, wenn Sie specifially die Sprache gesagt beiseite eine certian Menge an Speicherplatz setzen für die Speicherung seiner Objekte, dann wird dieser Raum an dieser Stelle zerstört werden. Ich habe dies in der Vergangenheit verwendet, um einige kleine Menge von Garbage Collection zu erhalten. Die Erklärung voodo Sie verwenden, ist:

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

Wenn Sie dies tun, dann werden alle (100 KB) Speicher Blah Objekten zugeordnet, auf die von Foo Zeiger wird gereinigt, wenn die Foo Typ den Gültigkeitsbereich verlässt. Da Ada Sie nisten Subroutinen innerhalb anderer Subroutinen erlaubt, dies ist besonders leistungsfähig.

Um mehr über zu sehen, was STORAGE_SIZE und Speicherpools für Sie tun können, finden Sie unter LRM 13.11

Viertens gut geschriebene Ada-Programme sind in der Regel nicht annähernd auf dynamische Speicherzuweisung verlassen, so viel wie C-Programme tun. C hatte eine Reihe von Design-Löchern, die Praktiker gelernt Zeiger zu verwenden, um über zu malen. Viele dieser Idiome sind nicht nessecary in Ada.

Zunächst einmal würde Ich mag wissen, wer in diesen Tagen Ada verwenden. Eigentlich mag ich die Sprache, und es gibt sogar eine GUI-Bibliothek für Linux / Ada, aber ich habe nichts über aktive Ada Entwicklung seit Jahren gehört. Dank seiner militärischen Verbindungen, ich bin wirklich nicht sicher, ob es alte Geschichte ist oder so sehr erfolgreich, dass alle Erwähnung ihrer Verwendung klassifiziert wird.

Ich denke, es gibt ein paar Grund für keine GC in Ada. An erster Stelle, es stammt aus einer Zeit, wo die meisten kompilierten Sprachen verwendet in erster Linie oder statischen Speicher stapeln, oder in einigen Fällen explizite Heap / frei zuordnen. GC als allgemeine Philosophie wirklich dauerte nur ab etwa 1990 oder so, wenn OOP, verbesserte Speicherverwaltung Algorithmen und Prozessoren leistungsfähig genug, um die Zyklen zu ersparen sie alle kamen in ihre eigenen laufen. Was einfach kompilieren Ada an einen IBM 4331 Mainframe 1989 tun konnte, war einfach gnadenlos. Jetzt habe ich ein Handy, dass diese Maschine CPU übertreffen kann.

Ein weiterer guter Grund ist, dass es Leute gibt, die denken, dass strenge Programmdesign präzise Kontrolle über Speicherressourcen enthält, und dass es keine Toleranz für die Vermietung dynamisch erworbenen Objekte schweben. Leider endete viel zu viele Menschen undichte Speicher auf, als dynamischer Speicher mehr geworden und mehr die Regel. Plus, wie die „Effizienz“ der Assemblersprache über Hochsprachen, und die „Effizienz“ des rohen JDBC über ORM-Systeme, die „Effizienz“ der manuellen Speicherverwaltung neigt zu invertieren, wie es skaliert (Ich habe ORM Benchmarks gesehen wo die JDBC-äquivalent war nur halb so effizient). Counter-intuitiv, ich weiß, aber in diesen Tage Systeme sind viel besser bei global Optimierung großen Anwendungen, und sie sind in der Lage radikale Re-Optimierungen in Reaktion auf machen zu oberflächlich kleineren changes.Including dynamisch Neugewichtung Algorithmen on the fly Grundlage von erfassten Last.

Ich fürchte, ich werde mit denen müssen unterscheiden, die sagen, dass Echtzeit-Systeme können nicht GC-Speicher leisten. GC ist nicht mehr etwas, das das ganze System alle paar Minuten friert. Wir haben viel intelligenter Weise Speicher in diesen Tagen zurückzufordern.

Ich dachte, ich ein wirklich einfaches Beispiel teilen würde, wie man ein Free () Verfahren zu implementieren (die vertraut zu allen C-Programmierer in einer Weise verwendet werden würde) ...

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;

Der Aufruf am Ende des Programms Freie wird die zugewiesene Ganzzahl in den Speicher-Pool ( „heap“ in C parlance) zurückzukehren. Sie können valgrind verwenden zu zeigen, dass dies in der Tat verhindert aber 4 Byte Speicher durchgesickert.

Die Ada.Unchecked_Deallocation (einer generisch definierten Verfahren) kann weiter verwendet werden (glaube ich), jede Art, die das „neue“ Schlüsselwort zugeordnet werden kann. Das Ada Reference Manual ( "13.11.2 Ungeprüfter Speicher Ausplanung") mehr Details hat.

Ihre Frage ist nicht korrekt. Es tut. Siehe das Paket ada.finalization die GC für Sie behandelt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top