Domanda

So che GC non era popolare ai tempi in cui fu sviluppato Ada e per il caso d'uso principale della programmazione embedded non è ancora una buona scelta.

Ma considerando che Ada è un linguaggio di programmazione di uso generale, perché non è stato introdotto un garbage collector parziale e facoltativo (traccia solo oggetti di memoria esplicitamente contrassegnati) nelle revisioni successive del linguaggio e nelle implementazioni del compilatore.

Semplicemente non riesco più a pensare di sviluppare una normale applicazione desktop senza un garbage collector.

È stato utile?

Soluzione

Ada è stato progettato con le applicazioni militari in mente. Uno dei grandi priorità nel suo design è stato il determinismo. cioè voleva un programma di Ada per eseguire costantemente esattamente nello stesso modo ogni volta, in qualsiasi ambiente, sotto tutti i sistemi operativi ... che genere di cose.

spazzino si trasforma un'applicazione in due, lavorando uno contro l'altro. programmi Java sviluppare singhiozzo a intervalli casuali quando il GC decide di andare a lavorare, e se è troppo lento a questo proposito c'è una possibilità che un'applicazione si esaurirà di heap volte e non altri.

semplificata: un garbage collector introduce una certa variabilità in un programma che i progettisti non hanno voluto. Si fanno un pasticcio - si pulisce in su! Stesso codice, stesso comportamento ogni volta.

Non che Ada è diventato un successo in tutto il mondo, la mente si infuria.

Altri suggerimenti

A causa Ada è stato progettato per l'impiego in sistemi di difesa che controllano le armi in tempo reale, e la raccolta dei rifiuti interferisce con i tempi della vostra applicazione. Questo è pericoloso, che è il motivo per cui, per molti anni, Java è venuto con un avvertimento che non doveva essere utilizzata per i sistemi di assistenza sanitaria e di controllo militare.

Credo che la ragione non v'è più una dichiarazione del genere con Java è perché l'hardware sottostante è diventato molto più veloce, così come il fatto che Java ha migliori algoritmi di GC e un migliore controllo sul GC.

Ricordate che Ada è stato sviluppato nel 1970 e 1980 in un momento in cui i computer erano molto meno potenti di quanto lo siano oggi, e nelle applicazioni di controllo problemi di temporizzazione fosse di primaria importanza.

La risposta è più complicata: Ada non richiede un garbage collector, a causa di vincoli di tempo reale e così via. tuttavia, la lingua è stata abilmente progettata in modo da consentire l'attuazione di spazzino.

anche se, molti (quasi tutti) i compilatori non includono un garbage collector, ci sono alcuni notevoli implementazione:

  • una patch per ZANZARA
  • compilatori Ada destinate alla Java Virtual Machine (non so se questi progetti sono ancora supportati). Ha usato il garbage collector della JVM.

Ci sono molte altre fonti circa la raccolta dei rifiuti in Ada giro per il web. Questo argomento è stato discusso a lungo, soprattutto a causa della forte concorrenza con Java nella metà degli anni '90 (dare un'occhiata a questa pagina : "Ada 95 is what the Java language should have been"), quando Java è stato "The Next Big Thing" prima che Microsoft ha attirato C #

Prima di tutto, nella lingua non c'è nulla di veramente simile proibisce raccolta dei rifiuti.

In secondo luogo alcune implementazioni eseguire la raccolta dei rifiuti.In particolare, tutte le implementazioni che prendono di mira la garbage collection JVM.

In terzo luogo, c'è un modo per ottenere una certa quantità di raccolta dei rifiuti con tutti i compilatori.Vedi, quando un accesso tipo va fuori portata, se hai specificatamente detto al linguaggio di riservare una certa quantità di spazio per l'archiviazione dei suoi oggetti, allora quello spazio verrà distrutto a quel punto.L'ho usato in passato per ottenere un minimo di garbage collection.La dichiarazione voodo che usi è:

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

Se si esegue questa operazione, tutta la memoria (100 KB) allocata agli oggetti Blah puntati dai puntatori Foo verrà ripulita quando il tipo Foo esce dall'ambito.Poiché Ada ti consente di annidare subroutine all'interno di altre subroutine, ciò è particolarmente potente.

Per ulteriori informazioni su cosa storage_size e pool di archiviazione possono fare per te, consulta LRM 13.11

In quarto luogo, i programmi Ada ben scritti non tendono a fare affidamento sull'allocazione dinamica della memoria tanto quanto i programmi C.C aveva una serie di buchi di progettazione su cui i professionisti hanno imparato a usare i puntatori per dipingere.Molti di questi idiomi non sono necessari in Ada.

Prima di tutto, mi piacerebbe sapere chi sta usando Ada in questi giorni. Io in realtà come la lingua, e c'è anche una libreria GUI per Linux / Ada, ma non ho sentito nulla sullo sviluppo Ada attiva da anni. Grazie alle sue connessioni militari, io non sono davvero sicuro se è storia antica o almeno così grande successo che ogni menzione del suo utilizzo è classificato.

Penso che ci sono un paio di ragioni per non GC in Ada. In primo luogo, e soprattutto, risale a un'epoca in cui lingue più utilizzate principalmente compilati impilare o memoria statica, o in alcuni casi, mucchio esplicito allocare / libero. GC come una filosofia generale veramente preso solo fuori circa 1990 o giù di lì, quando OOP, algoritmi e processori abbastanza potenti da risparmiare i cicli per eseguire il tutto di gestione della memoria migliorata è entrato in proprio. Che semplicemente compilando Ada potrebbe fare a un mainframe IBM 4331, nel 1989 era semplicemente impietoso. Ora ho un telefono cellulare in grado di sovraperformare CPU della macchina.

Un altro buon motivo è che ci sono persone che pensano che il design rigoroso programma include un controllo preciso su risorse di memoria, e che non ci dovrebbe essere alcuna tolleranza per lasciare gli oggetti in modo dinamico-acquisite galleggiano. Purtroppo, troppe persone finirono memoria che perde la memoria dinamica è diventata sempre più la regola. Inoltre, come la "efficienza" del linguaggio assembly su linguaggi di alto livello, e la "efficienza" di JDBC grezzo rispetto ai sistemi ORM, l ' "efficienza" della gestione manuale della memoria tende ad invertire benchmark ORM come scalare fino (che ho visto dove l'equivalente JDBC era solo mezzo più efficiente). Contro-intuitivo, lo so, ma in questi giorni i sistemi sono molto meglio ad ottimizzare a livello globale applicazioni di grandi dimensioni, più sono in grado di effettuare radicali re-ottimizzazioni in risposta a superficialmente minore changes.Including dinamicamente riequilibrando algoritmi al volo sulla base rilevata carico.

Ho paura che ho intenzione di avere a differire con chi dice che i sistemi in tempo reale non possono permettersi di memoria GC. GC non è più qualcosa che blocca l'intero sistema ogni paio di minuti. Abbiamo molto più intelligente modi per recuperare la memoria di questi tempi.

ho pensato di condividere davvero un semplice esempio di come implementare una procedura Gratis () (che potrebbe essere utilizzato in un modo familiare a tutti i programmatori 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;

chiamate gratuite al termine del programma restituirà il numero intero assegnato al lotto di memoria ( "cumulo" in gergo C). È possibile utilizzare Valgrind per dimostrare che ciò di fatto impedisce 4 byte di memoria che è trapelato.

L'Ada.Unchecked_Deallocation (una procedura genericamente definito) può essere utilizzato su (Credo) qualsiasi tipo che possono essere assegnati applicando il "nuovo" parola. Il manuale di Ada riferimento ( "13.11.2 incontrollato bagagli Deallocation") ha più dettagli.

La tua domanda non è corretta. Lo fa. Vedere l'ada.finalization pacchetto che gestisce GC per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top