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 y liberar recursos
51 (en general memoria alocada en el *heap*) de forma automática. Pero
52 no fue hasta avanzados los '90 que esta técnica se empezó a utilizar
53 en lenguajes de programación de uso comercial, cuando fue popularizado
54 por Java_. Incluso luego de más de 30 años para Java_ era costosa la
55 recolección de basura, lo que sumado a la presencia de una máquina
56 virtual para ejecutar los programas producidos, condujo a que estos
57 lenguajes sean notablemente lentos. Aún así Java_ creció y entre las
58 mejoras introducidas hubieron mejoras en la recolección de basura. Otros
59 lenguaje de programación populares que utilizan alguna forma de
60 recolección de basura son Python_, Ruby_, PHP_ y `C#`_, entre otros.
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 *naïve*. 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`_. Poco tiempo después se continúo el
127 desarrollo del lenguaje en la `versión 2.0`_, aún inestable y en la
128 cual se está experimentando principalmente sobre *const-correctness*
129 (ya sea como una forma de programación por contratos como para mejorar
130 las oportunidades de optimización del compilador, en especial con
131 código multi-hilo), reflexión y características para soportar mejor
132 programación funcional (como *clausuras* completas) y programación
135 Su creador, `Walter Bright`_, desarrollador principal de Zortech C++,
136 uno de los primeros compilador de C++ que compilaba a código nativo,
137 dice bien claro como nace el lenguaje, citando en su sitio web:
139 It seems to me that most of the "new" programming languages fall
140 into one of two categories: Those from academia with radical new
141 paradigms and those from large corporations with a focus on RAD and
142 the web. Maybe it's time for a new language born out of practical
143 experience implementing compilers.
145 .. _D: http://www.digitalmars.com/d/
146 .. _`versión 1.0`: http://www.digitalmars.com/d/1.0/changelog.html
147 .. _`versión 2.0`: http://www.digitalmars.com/d/changelog.html
148 .. _`Walter Bright`: http://www.walterbright.com/
150 Lo que podría traducirse como:
152 Parece que la mayoría de los lenguajes de programación "nuevos" caen
153 en 2 categorías: aquellos académicos con nuevos paradigmas radicales y
154 aquellos de grandes corporaciones con el foco en el desarrollo rápido
155 y web. Tal vez es hora de que nazca un nuevo lenguaje de la experiencia
156 práctica implementando compiladores.
158 D_ es un lenguaje de programación con sintaxis tipo C, multiparadigma,
159 compilado, con tipado fuerte y estático, con buenas capacidades tanto de
160 programación de bajo nivel (*system programming*) como de alto nivel,
161 siendo incluso compatible binariamente con C (se puede enlazar código
162 objeto C con código objeto D). Y este es tal vez el punto más fuerte
163 de D_, brindar lo mejor de los 2 mundos. Si bien tiene herramientas
164 de muy bajo nivel, que por lo tanto son muy propensas a errores, da
165 una infinidad de mecanismos para evitar el uso de estas herramientas
166 a menos que sea realmente necesario. Además pone mucho énfasis en
167 la programación confiable, para lo cual provee muchos mecanismos para
168 detectar errores en los programas de forma temprana.
170 Si puede pensarse en C++ como un "C mejor", podría decirse que D_ es
171 un "C++ mejor", ya que el objetivo del lenguaje es muy similar a C++,
172 pero implementa muchas características que jamás pudieron entrar en
173 el estándar de C++ y lo hace de una forma mucho más limpia, ya que
174 no debe lidiar con problemas de compatibilidad hacia atrás, y cuenta
175 con la experiencia del camino recorrido por C++, pudiendo extraer de
176 él los mejores conceptos pero evitando sus mayores problemas también.
178 Una de las características que nunca pudo entrar en el estándar de C++
179 es la recolección de basura. D_ no comete el mismo error.
181 .. INTRODUCCION ..............................................................
185 .. Objetivo de la tesis
186 ESTADO: TERMINADO, EN REVISION
188 La recolección de basura en D_ es un problema prácticamente nuevo. Si bien
189 pueden considerarse válidos todos los modelos propuestos para recolección
190 de basura en C, estos son muy restrictivos y poco eficientes, por lo
191 promiscuo que este lenguaje. Por otro lado D_ provee muchas construcciones
192 de alto nivel, lo que hace que la necesidad de utilizar construcciones de
193 bajo nivel sea muy escasa, por lo tanto brinda un campo importante a
194 explorar en cuanto a mejoras para el recolector de basura.
196 Por lo tanto el objetivo del presente trabajo puede resumirse en los
199 - Investigar y analizar la viabilidad de mejoras al recolector de
200 basura de D_, tanto mejoras menores dentro de las limitaciones actuales
201 del lenguaje (incluyendo pero no limitado a mejoras en el algoritmo
202 actual de recolección y soluciones en *espacio de usuario* -como
203 biblioteca-), como proponiendo mejoras al lenguaje que permitan la
204 implementación recolectores más precisos y eficientes.
205 - Elegir un conjunto de las mejores soluciones halladas e implementarlas.
206 Las soluciones que necesiten modificaciones en el lenguaje serán
207 implementadas modificando el compilador libre de D_ GDC_, que
208 también será utilizado como plataforma principal de desarrollo y
209 prueba (debido a la disponibilidad completa del código fuente y
210 la libertad de usarlo y modificarlo libremente). De todas formas,
211 siempre se priorizarán las modificaciones al *frontend* [#frontend]_
212 sobre las modificaciones al *backend*, permitiendo así que las mejoras
213 puedan ser probadas eventualmente en otros compiladores que utilicen
214 el *frontend* publicado por DigitalMars_, como DMD_.
215 - Realizar pruebas sobre aplicaciones lo más variadas y reales posible
216 sobre todas las soluciones implementadas, de manera de determinar de
217 forma fehaciente las ventajas de unas y otras en cuanto a latencia,
218 consumo de memoria, consumo de procesador, tiempos de pausa, etc.
219 - Presentar las conclusiones obtenidas del análisis y las pruebas
220 realizadas, tanto en el ámbito académico de la facultad como a la
221 comunidad de D_ (con el objetivo de sumar lo construido en este trabajo
224 .. [#frontend] El *frontend* es el módulo del compilador que realiza el
225 análisis sintáctico y semántico del lenguaje. GDC_ utiliza como
226 *frontend* el que provee libremente DigitalMars_.
227 .. [#backend] El *backend* es el módulo del compilador que emite
228 el código binario (o *assembly*, o el lenguaje que produzca el
229 compilador como resultado final). GDC utiliza el *backend* del GCC_
230 (*GNU Compiler Collection*), uno de los compiladores más populares.
233 .. INTRODUCCION ..............................................................
237 .. Cosas que no se pretenden hacer en esta tesis
238 ESTADO: TERMINADO, EN REVISION
240 Dado que el lenguaje de programación D_ puede ser enlazado con código
241 objeto C, y por lo tanto interactuar directamente con éste, habrán
242 limitaciones en el recolector resultante con respecto a esto. En este
243 trabajo se busca lograr un recolector que sea eficiente para casos en donde
244 el código que interactúa con C esté bien aislado, por lo que estas
245 porciones de código pueden quedar por fuera del recolector de basura o
246 necesitar un manejo especial.
248 De no plantear esta limitación se llegaría indefectiblemente a un recolector
249 conservativo como el que está disponible en la actualidad.
251 .. ===========================================================================
254 Recolección de Basura
255 =====================
256 .. Introducción a la importancia de la recolección de basura y sus
257 principales técnicas, con sus ventajas y desventajas. También se da
258 un breve recorrido sobre el estado del arte.
262 .. ===========================================================================
265 El Lenguaje de Programación D
266 =============================
267 .. Introducción y breve reseña del lenguaje de programación D. También
268 se presentan las necesidades particulares de D con respecto al
269 recolector de basura y su estado actual.
270 ESTADO: SIN EMPEZAR, REVISAR LO HECHO
272 A continuación se enumeran las principales características de D_,
273 agrupadas por unidades funcional o paradigmas que soporta:
275 .. EL LENGUAJE DE PROGRAMACION D .............................................
277 Programación Genérica
278 ---------------------
279 - Clases y funciones pueden ser parametrizadas.
280 - Instanciación implícita de funciones parametrizadas.
281 - Especialización parcial y explícita.
282 - Acepta tipos, valores y plantillas como parámetros.
283 - Acepta cantidad de parámetros variables.
284 - Soporta *mixins* [#dmixin]_.
285 - ``if`` estático (``static if``) [#dstaticif]_.
286 - Inferencia de tipos básica implícita [#dtypeinf]_ y explícita
287 (mediante ``typeof``) [#dtypeof]_.
288 - Expresiones ``is`` [#difexpr]_.
289 - Iteración sobre colecciones (``foreach``).
291 .. [#dmixin] *Mixin* tiene significados distintos en varios lenguajes de
292 programación. En D_ *mixin* significa tomar una secuencia arbitraria de
293 declaraciones e insertarla en el contexto (*scope*) actual. Esto puede
294 realizarse a nivel global, en clases, estructuras o funciones. Más
295 información en http://www.digitalmars.com/d/mixin.html
296 .. [#dstaticif] Esta construcción puede verse como similar a la
297 directiva del preprocesador de C/C++ ``#if``, pero a diferencia de
298 esto, en D_ el ``static if`` tiene acceso a todos los símbolos del
299 compilador (constantes, tipos, variables, etc). Más información
300 en http://www.digitalmars.com/d/version.html#staticif
301 .. [#dtypeinf] Si no se especifica un tipo al declarar una variable,
302 se infiere del tipo de su inicializador. Más información en
303 http://www.digitalmars.com/d/declaration.html#AutoDeclaration
304 .. [#dtypeof] ``typeof`` permite especificar un tipo
305 inferido de una expresión. Más información en
306 http://www.digitalmars.com/d/declaration.html#typeof
307 .. [#difexpr] Las *expresiones ``if``* permiten la compilación condicional
308 basada en las características de un tipo. Esto se realiza en favor
309 a una técnica utilizada en C++ de realizar *pattern matching*
310 sobre los parámetros de las plantillas. Más información en
311 http://www.digitalmars.com/d/expression.html#IsExpression
313 .. EL LENGUAJE DE PROGRAMACION D .............................................
315 Programación de Bajo Nivel (*system programming*)
316 -------------------------------------------------
317 - Compila a código de máquina nativo (no necesita una máquina virtual).
318 - Provee acceso a *assembly* (y por lo tanto, acceso directo al
321 - Soporta todos los tipos de C.
322 - ABI [#abi]_ compatible con C (genera archivos objeto estándar por lo que
323 se puede enlazar con código C).
324 - Permite manejo de memoria explícito (permitiendo alocar estructuras en
325 el *stack* o en el *heap*).
326 - Objetos *livianos* (no polimórficos) y arreglos *livianos* (estáticos,
327 sin *overhead* como C).
328 - La `programación genérica`_ permite realizar muchas optimizaciones
329 ya que se resuelve en tiempo de compilación y por lo tanto aumentando
330 la *performance* en la ejecución.
331 - Número de punto flotante de 80 bits.
332 - Control de alineación de miembros de una estructura.
334 .. [#abi] Interfaz de Aplicación Binaria (del inglés *Application Binary
337 .. EL LENGUAJE DE PROGRAMACION D .............................................
339 Programación de Alto Nivel
340 --------------------------
341 - Manejo de memoria automática (recolección de basura).
342 - Sistema de módulos (similar a Python_).
343 - Funciones y delegados:
345 - Son ciudadanos de primera clase [#1stclasscity]_.
346 - Pueden ser sobrecargados.
347 - Pueden estar anidados.
348 - Argumentos de entrada/salida.
349 - Argumentos por omisión.
350 - Evaluación perezosa (*lazy*) de argumentos.
351 - Cantidad de argumentos variables (con tipado seguro).
353 - Arreglos *dinámicos* (de longitud variable) y arreglos asociativos
354 (también conocidos como *hashes* o diccionarios) y son ciudadanos
355 de primera clase [#1stclasscity]_, soporta rebanado (*array slicing*
356 [#dslicing]_) y chequeo de límites (*bound checking*).
357 - Soporta *strings* como tipo nativo (con codificación utf-8), incluyendo
358 la capacidad de hacer un ``switch`` sobre estos.
359 - ``alias`` [#dalias]_.
360 - Documentación embebida.
363 .. [#1stclasscity] Por ciudadano de primera clase se entiende que se
364 trata de un tipo soportado por completo por el lenguaje, disponiendo de
365 expresiones literales anónimas, pudiendo ser almacenados en variables,
366 estructuras de datos, teniendo una identidad intrínseca, más allá
367 de un nombre dado, etc. En realidad los arreglos asociativos no pueden
368 ser expresados como literales anónimos pero sí tienen una sintaxis
369 especial soportada directamente por el lenguaje.
370 .. [#dslicing] Se refiere a la capacidad de referirse a una porción de
371 un arreglo. Profundizaremos sobre esta característica más adelante
372 porque es importante a la hora de elegir un método de recolección
374 .. [#dalias] Análogo al ``typedef`` de C/C++.
376 .. EL LENGUAJE DE PROGRAMACION D .............................................
378 Programación Orientada a Objetos
379 --------------------------------
380 - Objetos *pesadas* (polimórficos).
382 - Sobrecarga de operadores (con tipos de retorno covariantes [#dcovariant]_).
384 - Propiedades [#dprop]_.
386 .. [#dcovariant] Tipo de retorno covariante se refiere a la
387 capacidad de que una función sobreescrita por una clase derivada
388 puede retornar un tipo que sea derivado del tipo retornado
389 por la función original sobreescrita. Más información en
390 http://www.digitalmars.com/d/function.html
391 .. [#dprop] En D_ se refiere a funciones miembro que pueden ser tratadas
392 sintácticamente como campos de esa clase/estructura. Más información
393 en http://www.digitalmars.com/d/property.html#classproperties
395 .. EL LENGUAJE DE PROGRAMACION D .............................................
397 Programación Confiable
398 ----------------------
399 - Diseño por contrato [#ddbc]_:
403 - Invariantes de representación.
404 - Afirmaciones (*asserts*).
407 - Orden de construcción estática (inicialización de módulos) determinado.
408 - Inicialización garantizada.
409 - RAII [#draii]_ (*Resource adquisition is initialization*).
410 - Guardias de contexto (*scope guards*).
411 - Excepciones (con ``try``, ``catch`` y ``finally``).
412 - Primitivas de sincronización de hilos (``synchronized``).
414 .. [#ddbc] El diseño por contrato es un concepto creado por Eiffel_ a
415 mediados/finales de los '80. Más información sobre el soporte de D_ en
416 http://www.digitalmars.com/d/dbc.html
417 .. [#draii] Es una técnica muy utilizada en C++ que consiste en reservar
418 recursos por medio de la construcción de un objeto y liberarlos cuando
419 se libera éste. Al llamarse al destructor de manera automática cuando
420 se sale del *scope*, se asegura que el recurso será liberado también.
421 Esta técnica es la base para desarrollar código seguro en cuanto a
422 excepciones (*exception-safe*) [SUTT99]_.
424 .. _Eiffel: http://www.eiffel.com/
427 .. ===========================================================================
430 Definición del Problema
431 =======================
432 .. Describe más detalladamente los problemas actuales del recolector de
433 basura de D, sentando las bases para el análisis de los requerimientos
434 de recolección de basura en dicho lenguaje (se explica por qué las
435 particularidades descriptas en la sección anterior complican la
436 recolección de basura).
437 ESTADO: SIN EMPEZAR, REVISAR LO HECHO
439 Como se ha visto, D_ es un lenguaje de programación muy completo,
440 pero aún tiene algunos aspectos inconclusos. Su recolector de basura
441 está en un estado de evolución muy temprana. Se trata de un marcado y
442 barrido (*mark and sweep*) conservativo que, en ciertas circunstancias,
443 no se comporta como es debido, ya que revisa toda la memoria del programa
444 en busca de referencias a objetos en el *heap* (en vez de revisar sólo
445 las partes que almacenan punteros). Esto produce que, en ciertos casos,
446 por ejemplo al almacenar arreglos de número o *strings* en la pila, el
447 recolector de basura se encuentre con *falsos positivos*, pensando que
448 un área del *heap* está siendo utilizada cuando en realidad el puntero
449 que hacía referencia a ésta no era tal. Este efecto puede llevar a la
450 pérdida de memoria masiva, llegando al límite de que eventualmente
451 el sistema operativo tenga que matar al programa por falta de memoria
452 [DNG46407]_. Aún cuando el programa no tenga estos problemas de por sí,
453 por usar datos que no pueden ser confundidos con direcciones de memoria,
454 este problema podría ser explotado por ataques de seguridad, inyectando
455 valores que sí sean punteros válidos y provocando el efecto antes
456 mencionado que deriva en la terminación abrupta del programa [DNG35364]_.
457 Finalmente, a estos problemas se suman los problemas de *performance*
460 Es difícil que D_ pueda ser un lenguaje de programación exitoso si
461 no provee un recolector de basura eficiente y que realmente evite la
462 pérdida masiva de memoria. Por otro lado, D_ podría atraer a una base de
463 usuarios mucho más amplia, si la gama de estrategias de recolección es
464 más amplia, pudiendo lograr adaptarse a más casos de uso sin llegar al
465 límite de tener que caer en el manejo explícito de memoria y perder por
466 completo las ventajas de la recolección de basura (con la consecuencia
467 ya mencionada de que el manejo de memoria tenga que pasar a ser parte
468 de las interfaces y la complejidad que esto agrega al diseño -y uso-
472 .. ===========================================================================
475 Análisis de la Solución
476 =======================
477 .. Describe los resultados del análisis y explica los fundamentos para
478 elegir los algoritmos seleccionados para implementar, en base a los
479 requerimientos hallados anteriormente.
480 ESTADO: SIN EMPEZAR, REVISAR LO HECHO
482 .. ANALISIS DE LA SOLUCION ...................................................
484 Soluciones Propuestas
485 ---------------------
486 Para poder implementar un recolector de basura no conservativo es
487 necesario disponer de un soporte de reflexión (en tiempo de compilación
488 [DNG44607]_ y de ejecución [DNG29291]_) bastante completo . De otra forma
489 es imposible distinguir si un área de memoria de la pila es utilizada
490 como un puntero o como un simple conjunto de datos. D_ provee algún
491 grado de reflexión, pero muy limitado como para poder obtener este
492 tipo de información. Ya hay un plan para agregar mayores capacidades
493 de reflexibilidad [DNG6842]_, y un pequeño avance en este sentido en la
494 `versión 1.001`_, pero con algunos problemas [DNG6890]_ [DNG6893]_.
496 .. _`versión 1.001`: http://www.digitalmars.com/d/changelog.html#new1_001
498 Se han propuesto otros métodos e implementaciones de recolector de
499 basura, por ejemplo colectores con movimiento (*moving collectors*)
500 [DNG42557]_ y conteo de referencias [DNG38689]_. Pero D_ es un
501 lenguaje muy particular en cuanto a la recolección de basura (al
502 permitir `programación de bajo nivel (system programming)`_ hay muchas
503 consideraciones a las que otros lenguajes no deben enfrentarse) y no es
504 sencillo pensar en otras implementaciones sin hacer modificaciones de
507 .. ANALISIS DE LA SOLUCION ...................................................
509 Problemas para Implementar Colectores con Movimiento
510 ----------------------------------------------------
511 El principal problema es la capacidad de D_ de manipular punteros y
512 otras estructuras de bajo nivel, como uniones. O incluso la capacidad
513 de interactuar con C. Al mover un objeto de un área de memoria a otro,
514 es necesario actualizar todos los punteros que apuntan a éste. En D_
515 esta tarea no es trivial [DNG42564]_
517 .. ANALISIS DE LA SOLUCION ...................................................
519 Problemas para Implementar Conteo de Referencias
520 ------------------------------------------------
521 Este tipo de recolectores reparten la carga de la recolección de forma
522 uniforme a lo largo (y a la par) de la ejecución del programa. El
523 problema principal para implementar este tipo de recolección es
524 la necesidad de soporte en el compilador (cada asignación debe ser
525 acompañada por el incremento/decremento de contadores de referencia), a
526 menos que se implemente en una biblioteca. Por otro lado, características
527 como el rebanado de arreglos (ver `Programación de Alto Nivel`_) son
528 difíciles de proveer con el conteo de referencias, entre otros problemas
532 .. ===========================================================================
535 Implementación de la solución:
536 ==============================
537 .. Describe el diseño e implementación de los algoritmos
538 seleccionados. Se detalla si la solución se implementa como
539 biblioteca o si fue necesario modificar el compilador y de ser así
540 si se modificó el *frontend* o el GDC y se comentan problemas y
541 limitaciones encontradas.
545 .. ===========================================================================
550 .. Se presentan las conclusiones del trabajo, comparando los resultados
551 obtenidos con el punto de partida. Se mencionan puntos pendientes o
552 nuevas líneas de investigación.
558 .. ===========================================================================
559 .. ============================ FIN DEL DOCUMENTO ============================
560 .. ===========================================================================
562 .. Pone links "offline" (para generar PDF para imprimir).
566 .. |date| date:: %e de %B de %Y
569 .. [JOLI96] Richard Jones, Rafael D Lins. Garbage Collection: Algorithms
570 for Automatic Dynamic Memory Management. John Wiley & Sons, 1996.
572 .. [SUTT99] Herb Sutter. Exceptional C++: 47 Engineering Puzzles,
573 Programming Problems, and Solutions, 1ra edición. Addison-Wesley
574 Professional, 1999. ISBN 0-201-61562-2.
575 .. [DNG46407] Oskar Linde. The problem with the D GC. Grupo de noticias
576 digitalmars.D, 8 de enero de 2007. `Mensaje número 46407`_.
577 .. _`Mensaje número 46407`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=46407
578 .. [DNG43991] Andrey Khropov. [Performance] shootout.binarytrees when
579 implemented with gc is 10x slower than C# on .NET 2.0. Grupo de noticias
580 digitalmars.D, 11 de noviembre de 2006. `Mensaje número 43991`_.
581 .. _`Mensaje número 43991`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=43991
582 .. [DNG35364] Frank Benoit. GC implementation. Grupo de noticias
583 digitalmars.D, 18 de marzo de 2006. `Mensaje número 35364`_.
584 .. _`Mensaje número 35364`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=35364
585 .. [DNG44607] Russ Lewis. A TODO for somebody: Full Reflection Gets You
586 Smarter GC. Grupo de noticias digitalmars.D, 20 de noviembre de
587 2006. `Mensaje número 44607`_.
588 .. _`Mensaje número 44607`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=44607
589 .. [DNG29291] Larry Evans. How does RTTI help gc?. Grupo de noticias
590 digitalmars.D, 21 de octubre de 2005. `Mensaje número 29291`_.
591 .. _`Mensaje número 29291`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=29291
592 .. [DNG6842] Walter Bright. Transitioning to a type aware Garbage
593 Collector. Grupo de noticias digitalmars.D.announce, 22 de enero de
594 2007. `Mensaje número 6842`_.
595 .. _`Mensaje número 6842`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.announce&article_id=6842
596 .. [DNG42557] Lionello Lunesu. Is a moving GC really needed?. Grupo de
597 noticias digitalmars.D, 2 de octubre de 2006. `Mensaje número 42557`_.
598 .. _`Mensaje número 42557`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=42557
599 .. [DNG38689] Frank Benoit. GC, the simple solution. Grupo de noticias
600 digitalmars.D, 4 de junio de 2006. `Mensaje número 38689`_.
601 .. _`Mensaje número 38689`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=38689
602 .. [DNG42564] xs0. Re: Is a moving GC really needed?. Grupo de noticias
603 digitalmars.D, 2 de octubre de 2006. `Mensaje número 42564`_.
604 .. _`Mensaje número 42564`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=42564
605 .. [DNG38704] Walter Bright. Re: GC, the simple solution. Grupo de
606 noticias digitalmars.D, 4 de junio de 2006. `Mensaje número 38704`_.
607 .. _`Mensaje número 38704`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=38704
608 .. [DNG6890] Lionello Lunesu. std.string.split is broken :( (Re: DMD 1.001
609 release). Grupo de noticias digitalmars.D.announce, 24 de enero de
610 2007. `Mensaje número 6890`_.
611 .. _`Mensaje número 6890`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.announce&article_id=6890
612 .. [DNG6893] Oskar Linde. Re: DMD 1.001 release. Grupo de noticias
613 digitalmars.D.announce, 24 de enero de 2007. `Mensaje número 6893`_.
614 .. _`Mensaje número 6893`: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.announce&article_id=6893
615 .. [HDH03] Martin Hirzel, Amer Diwan, and Matthew Hertz, Proceedings
616 of the 18th Conference on Object-Oriented Programming, Systems,
617 Languages, and Applications (OOPSLA 2003), Anaheim, CA, Oct. 26-30,
619 .. [LINS05] Rafael D Lins. A New Multi-Processor Architecture for
620 Parallel Lazy Cyclic Reference Counting. Proceedings of the 17th
621 International Symposium on Computer Architecture on High Performance
622 Computing - Volume 00 (páginas 35-43), 2005.
624 .. vim: set ts=2 sts=2 sw=2 et tw=75 :