Pregunta

Sé que GC no era popular en los días en que se desarrolló Ada y para el caso de uso principal de programación integrada todavía no es una buena opción.

Pero considerando que Ada es un lenguaje de programación de propósito general, ¿por qué no se introdujo un recolector de basura parcial y opcional (sólo rastrea objetos de memoria etiquetados explícitamente) en revisiones posteriores del lenguaje y las implementaciones del compilador?

Simplemente ya no puedo pensar en desarrollar una aplicación de escritorio normal sin un recolector de basura.

¿Fue útil?

Solución

Ada fue diseñada pensando en aplicaciones militares.Una de las grandes prioridades en su diseño fue el determinismo.es decir.uno quería que un programa Ada funcionara consistentemente exactamente de la misma manera cada vez, en cualquier entorno, bajo todos los sistemas operativos...ese tipo de cosas.

Un recolector de basura convierte una aplicación en dos, trabajando una contra la otra.Los programas Java desarrollan problemas a intervalos aleatorios cuando el GC decide ponerse a trabajar, y si es demasiado lento, existe la posibilidad de que una aplicación se quede sin pila algunas veces y otras no.

Simplificado:Un recolector de basura introduce cierta variabilidad en un programa que los diseñadores no querían.Si haces un desastre, ¡lo limpias!Mismo código, mismo comportamiento cada vez.

No es que Ada se haya convertido en un gran éxito mundial, eso sí.

Otros consejos

Debido a Ada fue diseñado para su uso en sistemas de defensa que controlan las armas en tiempo real, y la recolección de basura interfiere con el momento de su aplicación. Esto es peligroso y por eso, desde hace muchos años, Java viene con una advertencia de que no iba a ser utilizado para los sistemas sanitarios y de control militar.

Creo que la razón por la que ya no hay tal declaración con Java se debe a que el hardware subyacente se ha convertido en mucho más rápido, así como el hecho de que Java tiene mejores algoritmos de GC y un mejor control de GC.

Recuerde que Ada fue desarrollado en los años 1970 y 1980 en un momento en que los ordenadores eran mucho menos poderosos de lo que son hoy en día, y en aplicaciones de control de problemas de tiempo fueron de suma importancia.

la respuesta es más complicada: Ada no requiere un recolector de basura, debido a restricciones de tiempo real y tal. Sin embargo, el lenguaje ha sido diseñado inteligentemente a fin de permitir la ejecución de un recolector de basura.

A pesar de que muchos (casi todos) los compiladores no incluyen un recolector de basura, hay algunas notables aplicación:

  • un parche para GNAT
  • compiladores Ada dirigidos a la máquina virtual de Java (no sé si esos proyectos todavía son compatibles). Se utiliza el recolector de basura de la JVM.

Hay muchas otras fuentes acerca de la recolección de basura en Ada alrededor de la web. este tema ha sido discutido ampliamente, principalmente debido a la fuerte competencia con Java en mediados de los 90 (echar un vistazo a esta página : "Ada 95 is what the Java language should have been"), cuando era de Java "La próxima gran cosa" antes de que Microsoft sacó C #

En primer lugar, no hay nada en el lenguaje que realmente prohíbe recolección de basura.

En segundo lugar algunas implementaciones no realizar la recolección de basura . En particular, todas las implementaciones que se dirigen a la basura JVM recogen.

En tercer lugar, hay una manera de conseguir una cierta cantidad de recolección de basura con todos los compiladores. Usted ve, cuando un acceso type se sale del ámbito, si specifially dijo el idioma de dejar de lado una cantidad certian de espacio para el almacenamiento de sus objetos, entonces ese espacio será destruido en ese punto. Lo he utilizado en el pasado para conseguir alguna pizca de recolección de basura. La declaración voodo que se utiliza es:

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

Si lo hace, entonces todo (100K de) memoria asignada a los objetos Blah apuntado por punteros Foo será limpiado cuando el tipo de Foo sale del ámbito. Desde Ada le permite anidar subrutinas dentro de otras subrutinas, esto es particularmente poderosa.

Para ver más sobre lo STORAGE_SIZE y las piscinas de almacenamiento pueden hacer por usted, consulte LRM 13.11

En cuarto lugar, los programas de Ada bien escrito no tienden a depender de asignación de memoria dinámica casi tanto como los programas de C hacen. C tenía una serie de agujeros de diseño que practicantes aprendieron a utilizar punteros para pintar sobre. Muchas de esas expresiones no son nessecary en Ada.

En primer lugar, me gustaría saber quién utiliza Ada estos días.De hecho, me gusta el lenguaje, e incluso hay una biblioteca GUI para Linux/Ada, pero no he oído nada sobre el desarrollo activo de Ada en años.Gracias a sus conexiones militares, realmente no estoy seguro de si es historia antigua o si es tan tremendamente exitoso que toda mención de su uso es clasificada.

Creo que hay un par de razones para que Ada no tenga GC.En primer lugar, se remonta a una era en la que la mayoría de los lenguajes compilados usaban principalmente memoria estática o de pila o, en algunos casos, asignación/liberación explícita de montón.La GC como filosofía general realmente despegó alrededor de 1990, cuando la programación orientada a objetos, los algoritmos de administración de memoria mejorados y los procesadores lo suficientemente potentes como para ahorrar los ciclos necesarios para ejecutarlo todo cobraron importancia.Lo que la simple compilación de Ada podía hacer en una computadora central IBM 4331 en 1989 fue simplemente despiadado.Ahora tengo un teléfono celular que puede superar en rendimiento a la CPU de esa máquina.

Otra buena razón es que hay personas que piensan que el diseño riguroso de programas incluye un control preciso sobre los recursos de memoria y que no debería haber ninguna tolerancia para dejar flotar objetos adquiridos dinámicamente.Lamentablemente, demasiadas personas terminaron perdiendo memoria a medida que la memoria dinámica se convirtió cada vez más en la regla.Además, al igual que la "eficiencia" del lenguaje ensamblador sobre los lenguajes de alto nivel y la "eficiencia" del JDBC sin formato sobre los sistemas ORM, la "eficiencia" de la gestión manual de la memoria tiende a invertirse a medida que aumenta (he visto puntos de referencia de ORM). donde el equivalente JDBC era sólo la mitad de eficiente).Es contrario a la intuición, lo sé, pero hoy en día los sistemas son mucho mejores a la hora de optimizar globalmente grandes aplicaciones, además de que son capaces de realizar reoptimizaciones radicales en respuesta a cambios superficialmente menores. Incluyendo algoritmos de reequilibrio dinámico sobre la marcha basados ​​en los datos detectados. carga.

Me temo que tendré que discrepar con quienes dicen que los sistemas en tiempo real no pueden permitirse el lujo de tener memoria GC.GC ya no es algo que congela todo el sistema cada dos minutos.Hoy en día tenemos formas mucho más inteligentes de recuperar la memoria.

Yo pensé en compartir un ejemplo muy simple de cómo poner en práctica un procedimiento gratuito () (que se utiliza de una manera familiar para todos los programadores de 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;

Llamando gratis al final del programa devolverá el entero asignado al bloque de almacenamiento ( "montón" en el lenguaje C). Puede utilizar valgrind para demostrar que esto, de hecho, a prevenir 4 bytes de memoria que se filtraron.

El Ada.Unchecked_Deallocation (un procedimiento genéricamente definido) se puede utilizar en (creo) de cualquier tipo que puede ser asignada usando la "nueva" palabra clave. El Manual de Referencia Ada ( "13.11.2 sin control de almacenamiento desasignación") tiene más detalles.

Su pregunta no es correcta. Lo hace. Ver el ada.finalization paquete que maneja GC para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top