2 .. Introducción a la importancia de la recolección de basura y sus
3 principales técnicas, con sus ventajas y desventajas. También se da
4 un breve recorrido sobre el estado del arte.
11 ============================================================================
15 .. Breve descripción de la utilidad de la recolección de basura
18 La recolección de basura es muchas veces vista por sus críticos de
19 una forma bastante *naïve*. Muchas veces se argumenta que sólo es
20 útil para programadores descuidados o que su necesidad es sólo una
21 manifestación de un mal diseño. Si bien estas dos afirmaciones pueden
22 ser, en algunos casos, ciertas, es falaz pensar que ese es la única
23 ventaja de un recolector de basura. Uno de los aspectos más importantes
24 de un recolector de basura es lograr un mayor nivel de abstracción
25 [JOLI96]_. En particular, al diseñar o programar bibliotecas, de no
26 haber un recolector de basura, **la administración de memoria pasa a ser
27 parte de la interfaz de la biblioteca**. Y lo peor de este aspecto es
28 que muy pocas veces esto es tenido en cuenta, derivando en bibliotecas
29 muy difíciles de usar correctamente sin perder memoria, por no quedar
30 bien clara la responsabilidad del manejo de memoria.
32 Esto se debe a que, como se mencionó anteriormente, el manejo de memoria
33 es un *artefacto* proveniente del *hardware*, no un concepto propio
34 de los algoritmos a representar y como tal, nos impide desarrollar una
37 Muchas veces se aduce también que la recolección de basura impide
38 el desarrollo de programas eficientes. Si bien es innegable que la
39 recolección de basura impone una carga extra, ésta es, en la mayoría
40 de los casos, imperceptible. Incluso algunos algoritmos de recolección
41 de basura pueden aumentar la eficiencia en casos determinados, como los
42 recolectores que compactan, que pueden minimizar considerablemente la
43 cantidad de páginas de memoria referenciadas por el programa, mejorando
44 el *hit-ratio* tanto de la memoria virtual como del *cache*. Aún si
45 este no fuera el caso, o en casos de sistemas de tiempo real o zonas muy
46 críticas en cuanto a la eficiencia, muchas veces es posible suspender
47 el recolector de basura en dicho fragmento de código. Es cierto que esto
48 rompe un poco con la idea de ganar abstracción, pero es necesario sólo
49 en casos donde hay que realizar optimizaciones y las optimizaciones son,
50 en general, dependientes de la plataforma (*hardware*) y por lo tanto
51 de difícil abstracción.
53 El recolector de basura debe tener un comportamiento correcto y predecible
54 para que sea útil, si el programador no puede confiar en el recolector
55 de basura, éste se vuelve más un problema que una solución, porque
56 introduce nuevos puntos de falla en los programas, y lo que es peor,
57 puntos de falla no controlados por el programador, volviendo mucho más
58 difícil la búsqueda de errores.
60 .. Presenta el problema y temas a ser tratados en el trabajo.
63 Los lenguajes de programación modernos tienen una tendencia cada vez
64 más marcada a adoptar técnicas sofisticadas, haciéndolos más ricos y
65 convirtiéndolos realmente en lenguajes, no en meros preprocesadores que
66 convierten de una forma muy directa el código en *assembly*, permitiendo
67 construcciones semánticamente más ricas y permitiendo al programar una
68 mayor expresividad para plasmar algoritmos sin detenerse en los detalles
71 Estos conceptos supuestamente avanzados provienen, en general, de
72 lenguajes académicos (muchos de ellos funcionales) que implementan estas
73 funcionalidades hace mucho tiempo, pero que para su época, o bien no
74 tuvieron suficiente difusión en el ambiente comercial, o bien eran muy
75 lentos por la baja capacidad de procesamiento de la época o incluso
76 demasiado *revolucionarios* para ser adoptados por programadores que no
77 podían ver las ventajas que esos nuevos conceptos proveen.
79 El caso de la recolección de basura (*garbage collection* en inglés)
80 es uno de los más representativos. Lisp_ introdujo a principio de los
81 '60 este concepto, como un mecanismo para alocar y liberar recursos
82 (en general memoria alocada en el *heap*) de forma automática. Pero
83 no fue hasta avanzados los '90 que esta técnica se empezó a utilizar
84 en lenguajes de programación de uso comercial, cuando fue popularizado
85 por Java_. Incluso luego de más de 30 años para Java_ era costosa la
86 recolección de basura, lo que sumado a la presencia de una máquina
87 virtual para ejecutar los programas producidos, condujo a que estos
88 lenguajes sean notablemente lentos. Aún así Java_ creció y entre las
89 mejoras introducidas hubieron mejoras en la recolección de basura. Otros
90 lenguaje de programación populares que utilizan alguna forma de
91 recolección de basura son Python_, Ruby_, PHP_ y `C#`_, entre otros.
96 ----------------------------------------------------------------------------
102 Algoritmos principales
103 ----------------------------------------------------------------------------
109 Conteo de referencias
110 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
117 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
124 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
131 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
138 ----------------------------------------------------------------------------
140 .. explicar la cantidad de cosas que hay (que son muchas) y dar algunos
146 .. include:: links.rst
148 .. vim: set ts=2 sts=2 sw=2 et tw=75 :