2009-05-06 26 views
5

Es posible que un lenguaje no interpretado tenga un recolector de basura. Los idiomas interpretados hacen que el intérprete ejecute el programa línea por línea para que el intérprete también proporcione un tiempo de ejecución con un GC. ¿Pero es posible tener un recolector de basura para cualquier otro idioma sin construir el GC en su código?¿Puede un lenguaje no interpretado tener un recolector de basura?

+5

Me pregunto si está asumiendo una dicotomía falsa entre "interpretado" y "nativo". Java y C#, por ejemplo, no son "interpretados" ni "nativos": se ejecutan (esencialmente) en una VM, pero desde una IL. –

+0

¿Puede por favor explicar más:? – Geek

+0

Para esa conversación, vea los comentarios en mi respuesta. –

Respuesta

0

Sí.

C++ con una implementación de puntero inteligente se acumulará como basura cuando los recuentos de referencia del puntero inteligente van a cero.

Tiene recolección de basura. No lo construiste tú mismo.

+1

Creo que la pregunta es sobre el rastreo de la recolección de basura, y el recuento no es un sustituto. –

+1

Eso no es recolección de basura. Conecta varios objetos de forma que tengan un ciclo y nunca se destruyan a menos que rompas el ciclo manualmente. – sharptooth

+0

@sharptooth: tómalo con el resto del mundo, no conmigo: http://www.codeproject.com/KB/cpp/automatic_gc_using_sp.aspx –

11

La recolección de basura solo requiere que las variables del puntero se marquen de manera especial para que el tiempo de ejecución pueda identificarlas y usarlas para la recolección de elementos no utilizados. No tiene nada que ver con la interpretación/compilación, sino que requiere un tiempo de ejecución especial y el almacenamiento de datos adicionales con cada variable.

+0

Los idiomas bien interpretados le dan un tiempo de ejecución. Al menos, es más fácil para el intérprete trabajar en tiempo de ejecución y ejecutar un recolector de basura también. ¿Algún idioma nativo tendrá el sistema operativo como tiempo de ejecución? Y, por tanto, no hay GC? – Geek

+1

GC e interpretación no están relacionadas entre sí. Sí, es potencialmente más fácil para un lenguaje interpretado tener recolección de basura, pero los lenguajes no interpretados también pueden hacer esto. Por lo general, los sistemas operativos no tienen soporte incrustado para la recolección de basura, pero muchos tiempos de ejecución de idiomas sí lo tienen. – sharptooth

+2

E incluso sin marcar las variables del puntero de una manera especial, puede tener el denominado GC conservador que trata todos los contenidos de la memoria como posibles punteros. Ver GC de Boehm en la otra respuesta. –

6

Bueno, los lenguajes .NET (que emiten a IL - C#, VB.NET, MC++, etc.) no son interpretados (especialmente si usa NGEN) - y tiene una recolección de basura completa.

Asimismo, Java.

+0

Java es interpretado como mi amigo. Incluso si es con HotSpot. – Geek

+0

No, puede que no sea "nativo", pero eso no lo "interpreta", al menos, no bajo la definición normal. –

+0

No consigo su respuesta "al menos, no bajo la definición normal"? Se interpreta. ?? – Geek

0

Objective-C 2 tiene recolección de basura ahora, y hay bibliotecas de recolección de basura disponibles para C++ también.

Creo que es posible, siempre que lo haya, el lenguaje le permite inspeccionar los objetos para que pueda atravesar el árbol de objetos.

+1

¿Puede explicar cómo funciona? Esto es como adjuntar un hilo de GC junto con su programa, ¿no es así? – Geek

+1

El subproceso separado no está relacionado con GC; simplemente, es la forma en que Java lo hace.La mayoría de C++ (y Objective-C) lo manejan en el momento de borrar cuando el recuento de ref se pone a cero. –

+1

Objective-C 2 tiene una recolección de basura real; el tiempo de ejecución atraviesa el árbol de objetos. Los recuentos se ignoran cuando la recolección de basura está habilitada. Creo que es parte del ciclo de eventos, pero no estoy seguro. –

2

El nuevo C++ 0x incluye características que facilitan la implementación de la recolección de basura. Vea esto interview por ejemplo.

3

Haskell tiene recolección de basura, si es compilado a código nativo o interpretado.

Cuestiones relacionadas