2 ==========================
3 Recolección de basura en D
4 ==========================
11 :Autor: Leandro Lucarella (77891)
12 :Contacto: llucare@fi.uba.ar
13 :Autor: Tutora: Lic. Rosa Wachenchauzer
14 :Organización: Departamento de Computación, Facultad de Ingeniería
15 :Organización: Universidad de Buenos Aires
24 .. ===========================================================================
29 .. Presenta el problema y temas a ser tratados en el trabajo.
32 Los lenguajes de programación modernos tienen una tendencia cada vez
33 más marcada a adoptar técnicas sofisticadas, haciéndolos más ricos y
34 convirtiéndolos realmente en lenguajes, no en meros preprocesadores que
35 convierten de una forma muy directa el código en *assembly*, permitiendo
36 construcciones semánticamente más ricas y permitiendo al programar una
37 mayor expresividad para plasmar algoritmos sin detenerse en los detalles
40 Estos conceptos supuestamente avanzados provienen, en general, de
41 lenguajes académicos (muchos de ellos funcionales) que implementan estas
42 funcionalidades hace mucho tiempo, pero que para su época, o bien no
43 tuvieron suficiente difusión en el ambiente comercial, o bien eran muy
44 lentos por la baja capacidad de procesamiento de la época o incluso
45 demasiado *revolucionarios* para ser adoptados por programadores que no
46 podían ver las ventajas que esos nuevos conceptos proveen.
48 El caso de la recolección de basura (*garbage collection* en inglés)
49 es uno de los más representativos. Lisp_ introdujo a principio de los
50 '60 este concepto, como un mecanismo para alocar
51 y liberar recursos de forma automática. Pero no fue hasta avanzados los
52 '90 que esta técnica se empezó a utilizar en lenguajes de programación
53 de uso comercial, cuando fue popularizado por Java_. Incluso luego de
54 más de 30 años para Java_ era costosa la recolección de basura, lo que
55 sumado a la presencia de una máquina virtual para ejecutar los programas
56 producidos, condujo a que estos lenguajes sean notablemente lentos. Aún
57 así Java_ creció y entre las mejoras introducidas hubieron mejoras en
58 la recolección de basura. Otros lenguaje de programación populares que
59 utilizan alguna forma de recolección de basura son Python_, Ruby_, PHP_
62 .. _Lisp: http://www.lisp.org/
63 .. _Java: http://www.java.com/
64 .. _Python: http://www.python.org/
65 .. _Ruby: http://www.ruby-lang.org/
66 .. _PHP: http://www.php.net/
67 .. _`C#`: http://www.ecma-international.org/publications/standards/Ecma-334.htm
69 .. INTRODUCCION ..............................................................
71 Importancia de la Recolección de Basura
72 ---------------------------------------
73 .. Breve descripción de la utilidad de la recolección de basura
76 La recolección de basura es muchas veces vista por sus críticos de
77 una forma bastante *naive*. Muchas veces se argumenta que sólo es
78 útil para programadores descuidados o que su necesidad es sólo una
79 manifestación de un mal diseño. Si bien estas dos afirmaciones pueden
80 ser, en algunos casos, ciertas, es falaz pensar que ese es la única
81 ventaja de un recolector de basura. Uno de los aspectos más importantes
82 de un recolector de basura es lograr un mayor nivel de abstracción
83 [JOLI96]_. En particular, al diseñar o programar bibliotecas, de no
84 haber un recolector de basura, **la administración de memoria pasa a ser
85 parte de la interfaz de la biblioteca**. Y lo peor de este aspecto es
86 que muy pocas veces esto es tenido en cuenta, derivando en bibliotecas
87 muy difíciles de usar correctamente sin perder memoria, por no quedar
88 bien clara la responsabilidad del manejo de memoria.
90 Esto se debe a que, como se mencionó anteriormente, el manejo de memoria
91 es un *artefacto* proveniente del *hardware*, no un concepto propio
92 de los algoritmos a representar y como tal, nos impide desarrollar una
95 Muchas veces se aduce también que la recolección de basura impide
96 el desarrollo de programas eficientes. Si bien es innegable que la
97 recolección de basura impone una carga extra, ésta es, en la mayoría
98 de los casos, imperceptible. Incluso algunos algoritmos de recolección
99 de basura pueden aumentar la eficiencia en casos determinados, como los
100 recolectores que compactan, que pueden minimizar considerablemente la
101 cantidad de páginas de memoria referenciadas por el programa, mejorando
102 el *hit-ratio* tanto de la memoria virtual como del *cache*. Aún si
103 este no fuera el caso, o en casos de sistemas de tiempo real o zonas muy
104 críticas en cuanto a la eficiencia, muchas veces es posible suspender
105 el recolector de basura en dicho fragmento de código. Es cierto que esto
106 rompe un poco con la idea de ganar abstracción, pero es necesario sólo
107 en casos donde hay que realizar optimizaciones y las optimizaciones son,
108 en general, dependientes de la plataforma (*hardware*) y por lo tanto
109 de difícil abstracción.
111 El recolector de basura debe tener un comportamiento correcto y predecible
112 para que sea útil, si el programador no puede confiar en el recolector
113 de basura, éste se vuelve más un problema que una solución, porque
114 introduce nuevos puntos de falla en los programas, y lo que es peor,
115 puntos de falla no controlados por el programador, volviendo mucho más
116 difícil la búsqueda de errores.
118 .. INTRODUCCION ..............................................................
120 El Lenguaje de Programación D
121 -----------------------------
122 .. Breve descripción del lenguaje de programación D
125 D_ es un lenguaje de programación joven. Nació en 1999 y el 2 de enero
126 de 2007 salió su `versión 1.0`_. A pesar de alcanzar una versión que podría
127 suponerse estable, D_ conserva algunas falencias y sigue siendo activamente
128 desarrollado (incluyendo nuevas características en prácticamente todas la
129 versiones nuevas, muchas de ellas, además, moviéndose en direcciones muy
130 experimentales) . Su creador, `Walter Bright`_, desarrollador principal de
131 Zortech C++, uno de los primeros compilador de C++ que compilaba a código
132 nativo, dice bien claro como nace el lenguaje, citando en su sitio web:
134 It seems to me that most of the "new" programming languages fall
135 into one of two categories: Those from academia with radical new
136 paradigms and those from large corporations with a focus on RAD and
137 the web. Maybe it's time for a new language born out of practical
138 experience implementing compilers.
140 .. _D: http://www.digitalmars.com/d/
141 .. _`versión 1.0`: http://www.digitalmars.com/d/changelog2.html#new1_00
142 .. _`Walter Bright`: http://www.walterbright.com/
144 Lo que podría traducirse como:
146 Parece que la mayoría de los lenguajes de programación "nuevos" caen
147 en 2 categorías: aquellos académicos con nuevos paradigmas radicales y
148 aquellos de grandes corporaciones con el foco en el desarrollo rápido
149 y web. Tal vez es hora de que nazca un nuevo lenguaje de la experiencia
150 práctica implementando compiladores.
152 D_ es un lenguaje de programación con sintaxis tipo C, multiparadigma,
153 compilado, con tipado fuerte y estático, con buenas capacidades tanto de
154 programación de bajo nivel (*system programming*) como de alto nivel,
155 siendo incluso compatible binariamente con C (se puede enlazar código
156 objeto C con código objeto D). Y este es tal vez el punto más fuerte
157 de D_, brindar lo mejor de los 2 mundos. Si bien tiene herramientas
158 de muy bajo nivel, que por lo tanto son muy propensas a errores, da
159 una infinidad de mecanismos para evitar el uso de estas herramientas
160 a menos que sea realmente necesario. Además pone mucho énfasis en
161 la programación confiable, para lo cual provee muchos mecanismos para
162 detectar errores en los programas de forma temprana.
164 Si puede pensarse en C++ como un "C mejor", podría decirse que D_ es
165 un "C++ mejor", ya que el objetivo del lenguaje es muy similar a C++,
166 pero implementa muchas características que jamás pudieron entrar en
167 el estándar de C++ y lo hace de una forma mucho más limpia, ya que
168 no debe lidiar con problemas de compatibilidad hacia atrás, y cuenta
169 se con la experiencia del camino recorrido por C++, pudiendo extraer de
170 él los mejores conceptos pero evitando sus mayores problemas también.
172 Una de las características que nunca pudo entrar en el estándar de C++
173 es la recolección de basura. D_ no comete el mismo error.
175 .. INTRODUCCION ..............................................................
179 .. Objetivo de la tesis
180 ESTADO: TERMINADO, EN REVISION
182 La recolección de basura en D_ es un problema prácticamente nuevo. Si bien
183 pueden considerarse válidos todos los modelos propuestos para recolección
184 de basura en C, estos son muy restrictivos y poco eficientes, por lo
185 promiscuo que este lenguaje.
187 Por otro lado, la recolección de basura en C y C++ está prácticamente
188 restringida a implementaciones a nivel de bibliotecas, ya que la inclusión
189 de un recolector de basura en el estándar de C/C++ es algo que no va a
190 pasar por largo tiempo. Entonces quedan dos caminos posibles:
192 1. Quedarse con las limitaciones de un recolector de basura a nivel de
193 bibliotecas, lo que es muy restrictivo.
194 2. Construir una solución a nivel de compilador que no cumpla con el
195 estándar y que no pasará de ser una curiosidad académica.
197 La primera opción está ya bastante desarrollada y es casi un sinónimo de un
198 recolector de basura conservativo. La segunda, no es un objetivo viable para
199 una Tesis de Ingeniería, donde se pretende llegar a un resultado lo más
200 práctico posible (hacer un aporte más ingenieril que científico).
202 Por lo tanto el objetivo es abordar la segunda opción sobre un lenguaje que
203 es propenso a absorver nuevas ideas y cambios. Un lenguaje que es además,
204 mucho más rico sintáctica y semánticamente, sin perder utilidad práctica ni
205 eficiencia para cumplir las tareas para las cuales C y C++ fueron
208 Se propone entonces en este trabajo, desarrollar un recolector de basura
209 para un lenguaje de programación imperativo compilado, con tipado estático
210 y enlazable con C (siendo esto último probablemente uno de los desafíos más
211 importantes), agregando soporte al lenguaje o al compilador (de ser
212 necesario) y utlizando las características avanzadas que el lenguaje
215 .. INTRODUCCION ..............................................................
219 .. Alcance de la tesis, qué se pretende hacer
220 ESTADO: TERMINADO, EN REVISION
222 En esta tesis se plantea desarrollar un recolector de basura para el
223 lenguaje de programación D, utilizando como plataforma el compilador GDC_.
224 El objetivo es conseguir un recolector de basura eficiente, en tiempo y
225 espacio, aunque priorizando lo primero. Como objetivo secundario se propone
226 obtener una recolector configurable, para poder elegir los parámetros que
227 mejor se ajusten al problema particular.
229 .. _GDC: http://dgcc.sourceforge.net/
231 .. INTRODUCCION ..............................................................
235 .. Cosas que no se pretenden hacer en esta tesis
236 ESTADO: TERMINADO, EN REVISION
238 Dado que el lenguaje de programación D_ puede ser enlazado con código
239 objeto C, y por lo tanto interactuar directamente con éste, habrán
240 limitaciones en el recolector resultante con respecto a esto. En este
241 trabajo se busca lograr un recolector que sea eficiente para casos en donde
242 el código que interactúa con C esté bien aislado, por lo que estas
243 porciones de código pueden quedar por fuera del recolector de basura.
245 De otra forma probablemente se llegaría a un recolector conservativo y
246 simple como el que está disponible en la actualidad.
248 .. ===========================================================================
251 Recolección de Basura
252 =====================
253 .. Introducción a la importancia de la recolección de basura y sus
254 principales técnicas, con sus ventajas y desventajas. También se da
255 un breve recorrido sobre el estado del arte.
259 .. ===========================================================================
262 El Lenguaje de Programación D
263 =============================
264 .. Introducción y breve reseña del lenguaje de programación D. También
265 se presentan las necesidades particulares de D con respecto al
266 recolector de basura y su estado actual.
267 ESTADO: SIN EMPEZAR, REVISAR LO HECHO
269 A continuación se enumeran las principales características de D_,
270 agrupadas por unidades funcional o paradigmas que soporta:
272 .. EL LENGUAJE DE PROGRAMACION D .............................................
274 Programación Genérica
275 ---------------------
276 - Clases y funciones pueden ser parametrizadas.
277 - Instanciación implícita de funciones parametrizadas.
278 - Especialización parcial y explícita.
279 - Acepta tipos, valores y plantillas como parámetros.
280 - Acepta cantidad de parámetros variables.
281 - Soporta *mixins* [#dmixin]_.
282 - ``if`` estático (``static if``) [#dstaticif]_.
283 - Inferencia de tipos básica implícita [#dtypeinf]_ y explícita
284 (mediante ``typeof``) [#dtypeof]_.
285 - Expresiones ``is`` [#difexpr]_.
286 - Iteración sobre colecciones (``foreach``).
288 .. [#dmixin] *Mixin* tiene significados distintos en varios lenguajes de
289 programación. En D_ *mixin* significa tomar una secuencia arbitraria de
290 declaraciones e insertarla en el contexto (*scope*) actual. Esto puede
291 realizarse a nivel global, en clases, estructuras o funciones. Más
292 información en http://www.digitalmars.com/d/mixin.html
293 .. [#dstaticif] Esta construcción puede verse como similar a la
294 directiva del preprocesador de C/C++ ``#if``, pero a diferencia de
295 esto, en D_ el ``static if`` tiene acceso a todos los símbolos del
296 compilador (constantes, tipos, variables, etc). Más información
297 en http://www.digitalmars.com/d/version.html#staticif
298 .. [#dtypeinf] Si no se especifica un tipo al declarar una variable,
299 se infiere del tipo de su inicializador. Más información en
300 http://www.digitalmars.com/d/declaration.html#AutoDeclaration
301 .. [#dtypeof] ``typeof`` permite especificar un tipo
302 inferido de una expresión. Más información en
303 http://www.digitalmars.com/d/declaration.html#typeof
304 .. [#difexpr] Las *expresiones ``if``* permiten la compilación condicional
305 basada en las características de un tipo. Esto se realiza en favor
306 a una técnica utilizada en C++ de realizar *pattern matching*
307 sobre los parámetros de las plantillas. Más información en
308 http://www.digitalmars.com/d/expression.html#IsExpression
310 .. EL LENGUAJE DE PROGRAMACION D .............................................
312 Programación de Bajo Nivel (*system programming*)
313 -------------------------------------------------
314 - Compila a código de máquina nativo (no necesita una máquina virtual).
315 - Provee acceso a *assembly* (y por lo tanto, acceso directo al
318 - Soporta todos los tipos de C.
319 - ABI [#abi]_ compatible con C (genera archivos objeto estándar por lo que
320 se puede enlazar con código C).
321 - Permite manejo de memoria explícito (permitiendo alocar estructuras en
322 el *stack* o en el *heap*).
323 - Objetos *livianos* (no polimórficos) y arreglos *livianos* (estáticos,
324 sin *overhead* como C).
325 - La `programación genérica`_ permite realizar muchas optimizaciones
326 ya que se resuelve en tiempo de compilación y por lo tanto aumentando
327 la *performance* en la ejecución.
328 - Número de punto flotante de 80 bits.
329 - Control de alineación de miembros de una estructura.
331 .. [#abi] Interfaz de Aplicación Binaria (del inglés *Application Binary
334 .. EL LENGUAJE DE PROGRAMACION D .............................................
336 Programación de Alto Nivel
337 --------------------------
338 - Manejo de memoria automática (recolección de basura).
339 - Sistema de módulos (similar a Python_).
340 - Funciones y delegados:
342 - Son ciudadanos de primera clase [#1stclasscity]_.
343 - Pueden ser sobrecargados.
344 - Pueden estar anidados.
345 - Argumentos de entrada/salida.
346 - Argumentos por omisión.
347 - Evaluación perezosa (*lazy*) de argumentos.
348 - Cantidad de argumentos variables (con tipado seguro).
350 - Arreglos *dinámicos* (de longitud variable) y arreglos asociativos
351 (también conocidos como *hashes* o diccionarios) y son ciudadanos
352 de primera clase [#1stclasscity]_, soporta rebanado (*array slicing*
353 [#dslicing]_) y chequeo de límites (*bound checking*).
354 - Soporta *strings* como tipo nativo (con codificación utf-8), incluyendo
355 la capacidad de hacer un ``switch`` sobre estos.
356 - ``alias`` [#dalias]_.
357 - Documentación embebida.
360 .. [#1stclasscity] Por ciudadano de primera clase se entiende que se
361 trata de un tipo soportado por completo por el lenguaje, disponiendo de
362 expresiones literales anónimas, pudiendo ser almacenados en variables,
363 estructuras de datos, teniendo una identidad intrínseca, más allá
364 de un nombre dado, etc. En realidad los arreglos asociativos no pueden
365 ser expresados como literales anónimos pero sí tienen una sintaxis
366 especial soportada directamente por el lenguaje.
367 .. [#dslicing] Se refiere a la capacidad de referirse a una porción de
368 un arreglo. Profundizaremos sobre esta característica más adelante
369 porque es importante a la hora de elegir un método de recolección
371 .. [#dalias] Análogo al ``typedef`` de C/C++.
373 .. EL LENGUAJE DE PROGRAMACION D .............................................
375 Programación Orientada a Objetos
376 --------------------------------
377 - Objetos *pesadas* (polimórficos).
379 - Sobrecarga de operadores (con tipos de retorno covariantes [#dcovariant]_).
381 - Propiedades [#dprop]_.
383 .. [#dcovariant] Tipo de retorno covariante se refiere a la
384 capacidad de que una función sobreescrita por una clase derivada
385 puede retornar un tipo que sea derivado del tipo retornado
386 por la función original sobreescrita. Más información en
387 http://www.digitalmars.com/d/function.html
388 .. [#dprop] En D_ se refiere a funciones miembro que pueden ser tratadas
389 sintácticamente como campos de esa clase/estructura. Más información
390 en http://www.digitalmars.com/d/property.html#classproperties
392 .. EL LENGUAJE DE PROGRAMACION D .............................................
394 Programación Confiable
395 ----------------------
396 - Diseño por contrato [#ddbc]_:
400 - Invariantes de representación.
401 - Afirmaciones (*asserts*).
404 - Orden de construcción estática (inicialización de módulos) determinado.
405 - Inicialización garantizada.
406 - RAII [#draii]_ (*Resource adquisition is initialization*).
407 - Guardias de contexto (*scope guards*).
408 - Excepciones (con ``try``, ``catch`` y ``finally``).
409 - Primitivas de sincronización de hilos (``synchronized``).
411 .. [#ddbc] El diseño por contrato es un concepto creado por Eiffel_ a
412 mediados/finales de los '80. Más información sobre el soporte de D_ en
413 http://www.digitalmars.com/d/dbc.html
414 .. [#draii] Es una técnica muy utilizada en C++ que consiste en reservar
415 recursos por medio de la construcción de un objeto y liberarlos cuando
416 se libera éste. Al llamarse al destructor de manera automática cuando
417 se sale del *scope*, se asegura que el recurso será liberado también.
418 Esta técnica es la base para desarrollar código seguro en cuanto a
419 excepciones (*exception-safe*) [SUTT99]_.
421 .. _Eiffel: http://www.eiffel.com/
424 .. ===========================================================================
427 Definición del Problema
428 =======================
429 .. Describe más detalladamente los problemas actuales del recolector de
430 basura de D, sentando las bases para el análisis de los requerimientos
431 de recolección de basura en dicho lenguaje (se explica por qué las
432 particularidades descriptas en la sección anterior complican la
433 recolección de basura).
434 ESTADO: SIN EMPEZAR, REVISAR LO HECHO
436 Como se ha visto, D_ es un lenguaje de programación muy completo,
437 pero aún tiene algunos aspectos inconclusos. Su recolector de basura
438 está en un estado de evolución muy temprana. Se trata de un marcado y
439 barrido (*mark and sweep*) conservativo que, en ciertas circunstancias,
440 no se comporta como es debido, ya que revisa toda la memoria del programa
441 en busca de referencias a objetos en el *heap* (en vez de revisar sólo
442 las partes que almacenan punteros). Esto produce que, en ciertos casos,
443 por ejemplo al almacenar arreglos de número o *strings* en la pila, el
444 recolector de basura se encuentre con *falsos positivos*, pensando que
445 un área del *heap* está siendo utilizada cuando en realidad el puntero
446 que hacía referencia a ésta no era tal. Este efecto puede llevar a la
447 pérdida de memoria masiva, llegando al límite de que eventualmente
448 el sistema operativo tenga que matar al programa por falta de memoria
449 [DNG46407]_. Aún cuando el programa no tenga estos problemas de por sí,
450 por usar datos que no pueden ser confundidos con direcciones de memoria,
451 este problema podría ser explotado por ataques de seguridad, inyectando
452 valores que sí sean punteros válidos y provocando el efecto antes
453 mencionado que deriva en la terminación abrupta del programa [DNG35364]_.
454 Finalmente, a estos problemas se suman los problemas de *performance*
457 Es difícil que D_ pueda ser un lenguaje de programación exitoso si
458 no provee un recolector de basura eficiente y que realmente evite la
459 pérdida masiva de memoria. Por otro lado, D_ podría atraer a una base de
460 usuarios mucho más amplia, si la gama de estrategias de recolección es
461 más amplia, pudiendo lograr adaptarse a más casos de uso sin llegar al
462 límite de tener que caer en el manejo explícito de memoria y perder por
463 completo las ventajas de la recolección de basura (con la consecuencia
464 ya mencionada de que el manejo de memoria tenga que pasar a ser parte
465 de las interfaces y la complejidad que esto agrega al diseño -y uso-
469 .. ===========================================================================
472 Análisis de la Solución
473 =======================
474 .. Describe los resultados del análisis y explica los fundamentos para
475 elegir los algoritmos seleccionados para implementar, en base a los
476 requerimientos hallados anteriormente.
477 ESTADO: SIN EMPEZAR, REVISAR LO HECHO
479 .. ANALISIS DE LA SOLUCION ...................................................
481 Soluciones Propuestas
482 ---------------------
483 Para poder implementar un recolector de basura no conservativo es
484 necesario disponer de un soporte de reflexión (en tiempo de compilación
485 [DNG44607]_ y de ejecución [DNG29291]_) bastante completo . De otra forma
486 es imposible distinguir si un área de memoria de la pila es utilizada
487 como un puntero o como un simple conjunto de datos. D_ provee algún
488 grado de reflexión, pero muy limitado como para poder obtener este
489 tipo de información. Ya hay un plan para agregar mayores capacidades
490 de reflexibilidad [DNG6842]_, y un pequeño avance en este sentido en la
491 `versión 1.001`_, pero con algunos problemas [DNG6890]_ [DNG6893]_.
493 .. _`versión 1.001`: http://www.digitalmars.com/d/changelog.html#new1_001
495 Se han propuesto otros métodos e implementaciones de recolector de
496 basura, por ejemplo colectores con movimiento (*moving collectors*)
497 [DNG42557]_ y conteo de referencias [DNG38689]_. Pero D_ es un
498 lenguaje muy particular en cuanto a la recolección de basura (al
499 permitir `programación de bajo nivel (system programming)`_ hay muchas
500 consideraciones a las que otros lenguajes no deben enfrentarse) y no es
501 sencillo pensar en otras implementaciones sin hacer modificaciones de
504 .. ANALISIS DE LA SOLUCION ...................................................
506 Problemas para Implementar Colectores con Movimiento
507 ----------------------------------------------------
508 El principal problema es la capacidad de D_ de manipular punteros y
509 otras estructuras de bajo nivel, como uniones. O incluso la capacidad
510 de interactuar con C. Al mover un objeto de un área de memoria a otro,
511 es necesario actualizar todos los punteros que apuntan a éste. En D_
512 esta tarea no es trivial [DNG42564]_
514 .. ANALISIS DE LA SOLUCION ...................................................
516 Problemas para Implementar Conteo de Referencias
517 ------------------------------------------------
518 Este tipo de recolectores reparten la carga de la recolección de forma
519 uniforme a lo largo (y a la par) de la ejecución del programa. El
520 problema principal para implementar este tipo de recolección es
521 la necesidad de soporte en el compilador (cada asignación debe ser
522 acompañada por el incremento/decremento de contadores de referencia), a
523 menos que se implemente en una biblioteca. Por otro lado, características
524 como el rebanado de arreglos (ver `Programación de Alto Nivel`_) son
525 difíciles de proveer con el conteo de referencias, entre otros problemas
529 .. ===========================================================================
532 Implementación de la solución:
533 ==============================
534 .. Describe el diseño e implementación de los algoritmos
535 seleccionados. Se detalla si la solución se implementa como
536 biblioteca o si fue necesario modificar el compilador y de ser así
537 si se modificó el *frontend* o el GDC y se comentan problemas y
538 limitaciones encontradas.
542 .. ===========================================================================
547 .. Se presentan las conclusiones del trabajo, comparando los resultados
548 obtenidos con el punto de partida. Se mencionan puntos pendientes o
549 nuevas líneas de investigación.
555 .. ===========================================================================
556 .. ============================ FIN DEL DOCUMENTO ============================
557 .. ===========================================================================
559 .. Pone links "offline" (para generar PDF para imprimir).
563 .. |date| date:: %e de %B de %Y
566 .. [JOLI96] Richard Jones, Rafael D Lins. Garbage Collection: Algorithms
567 for Automatic Dynamic Memory Management. John Wiley & Sons, 1996.
569 .. [SUTT99] Herb Sutter. Exceptional C++: 47 Engineering Puzzles,
570 Programming Problems, and Solutions, 1ra edición. Addison-Wesley
571 Professional, 1999. ISBN 0-201-61562-2.
572 .. [DNG46407] Oskar Linde. The problem with the D GC. Grupo de noticias
573 digitalmars.D, 8 de enero de 2007. `Mensaje número 46407`_.
574 .. _`Mensaje número 46407`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=46407
575 .. [DNG43991] Andrey Khropov. [Performance] shootout.binarytrees when
576 implemented with gc is 10x slower than C# on .NET 2.0. Grupo de noticias
577 digitalmars.D, 11 de noviembre de 2006. `Mensaje número 43991`_.
578 .. _`Mensaje número 43991`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=43991
579 .. [DNG35364] Frank Benoit. GC implementation. Grupo de noticias
580 digitalmars.D, 18 de marzo de 2006. `Mensaje número 35364`_.
581 .. _`Mensaje número 35364`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=35364
582 .. [DNG44607] Russ Lewis. A TODO for somebody: Full Reflection Gets You
583 Smarter GC. Grupo de noticias digitalmars.D, 20 de noviembre de
584 2006. `Mensaje número 44607`_.
585 .. _`Mensaje número 44607`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=44607
586 .. [DNG29291] Larry Evans. How does RTTI help gc?. Grupo de noticias
587 digitalmars.D, 21 de octubre de 2005. `Mensaje número 29291`_.
588 .. _`Mensaje número 29291`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=29291
589 .. [DNG6842] Walter Bright. Transitioning to a type aware Garbage
590 Collector. Grupo de noticias digitalmars.D.announce, 22 de enero de
591 2007. `Mensaje número 6842`_.
592 .. _`Mensaje número 6842`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.announce&article_id=6842
593 .. [DNG42557] Lionello Lunesu. Is a moving GC really needed?. Grupo de
594 noticias digitalmars.D, 2 de octubre de 2006. `Mensaje número 42557`_.
595 .. _`Mensaje número 42557`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=42557
596 .. [DNG38689] Frank Benoit. GC, the simple solution. Grupo de noticias
597 digitalmars.D, 4 de junio de 2006. `Mensaje número 38689`_.
598 .. _`Mensaje número 38689`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=38689
599 .. [DNG42564] xs0. Re: Is a moving GC really needed?. Grupo de noticias
600 digitalmars.D, 2 de octubre de 2006. `Mensaje número 42564`_.
601 .. _`Mensaje número 42564`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=42564
602 .. [DNG38704] Walter Bright. Re: GC, the simple solution. Grupo de
603 noticias digitalmars.D, 4 de junio de 2006. `Mensaje número 38704`_.
604 .. _`Mensaje número 38704`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=38704
605 .. [DNG6890] Lionello Lunesu. std.string.split is broken :( (Re: DMD 1.001
606 release). Grupo de noticias digitalmars.D.announce, 24 de enero de
607 2007. `Mensaje número 6890`_.
608 .. _`Mensaje número 6890`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.announce&article_id=6890
609 .. [DNG6893] Oskar Linde. Re: DMD 1.001 release. Grupo de noticias
610 digitalmars.D.announce, 24 de enero de 2007. `Mensaje número 6893`_.
611 .. _`Mensaje número 6893`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.announce&article_id=6893
612 .. [HDH03] Martin Hirzel, Amer Diwan, and Matthew Hertz, Proceedings
613 of the 18th Conference on Object-Oriented Programming, Systems,
614 Languages, and Applications (OOPSLA 2003), Anaheim, CA, Oct. 26-30,
616 .. [LINS05] Rafael D Lins. A New Multi-Processor Architecture for
617 Parallel Lazy Cyclic Reference Counting. Proceedings of the 17th
618 International Symposium on Computer Architecture on High Performance
619 Computing - Volume 00 (páginas 35-43), 2005.
621 .. vim: set ts=2 sts=2 sw=2 et tw=75 :