]> git.llucax.com Git - z.facultad/75.00/informe.git/blob - informe.rst
Se completa la introducción, al menos en principio.
[z.facultad/75.00/informe.git] / informe.rst
1
2 ==========================
3 Recolección de basura en D
4 ==========================
5
6
7 -----
8 Tesis
9 -----
10
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
16 :Fecha: |date|
17 :Revisión: 1
18 :Estado: Borrador
19
20
21 .. contents::
22
23
24 .. ===========================================================================
25
26
27 Introducción
28 ============
29 .. Presenta el problema y temas a ser tratados en el trabajo.
30    ESTADO: TERMINADO
31
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
38 del *hardware*.
39
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.
47
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_
60 y `C#`_, entre otros.
61
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
68
69 .. INTRODUCCION ..............................................................
70
71 Importancia de la Recolección de Basura
72 ---------------------------------------
73 .. Breve descripción de la utilidad de la recolección de basura
74    ESTADO: TERMINADO
75
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.
89
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
93 mayor abstracción.
94
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.
110
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.
117
118 .. INTRODUCCION ..............................................................
119
120 El Lenguaje de Programación D
121 -----------------------------
122 .. Breve descripción del lenguaje de programación D
123    ESTADO: TERMINADO
124
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:
133
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.
139
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/
143
144 Lo que podría traducirse como:
145
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.
151
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.
163
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.
171
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.
174
175 .. INTRODUCCION ..............................................................
176
177 Objetivo
178 --------
179 .. Objetivo de la tesis
180    ESTADO: TERMINADO, EN REVISION
181
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.
186
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:
191
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.
196
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).
201
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
206 diseñados.
207
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
213 provee.
214
215 .. INTRODUCCION ..............................................................
216
217 Alcance
218 -------
219 .. Alcance de la tesis, qué se pretende hacer
220    ESTADO: TERMINADO, EN REVISION
221
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.
228
229 .. _GDC: http://dgcc.sourceforge.net/
230
231 .. INTRODUCCION ..............................................................
232
233 Limitaciones
234 ------------
235 .. Cosas que no se pretenden hacer en esta tesis
236    ESTADO: TERMINADO, EN REVISION
237
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.
244
245 De otra forma probablemente se llegaría a un recolector conservativo y
246 simple como el que está disponible en la actualidad.
247
248 .. ===========================================================================
249
250
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.
256    ESTADO: SIN EMPEZAR
257
258
259 .. ===========================================================================
260
261
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
268
269 A continuación se enumeran las principales características de D_,
270 agrupadas por unidades funcional o paradigmas que soporta:
271
272 .. EL LENGUAJE DE PROGRAMACION D .............................................
273
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``).
287
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
309
310 .. EL LENGUAJE DE PROGRAMACION D .............................................
311
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
316   *hardware*).
317 - ``goto``.
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.
330
331 .. [#abi] Interfaz de Aplicación Binaria (del inglés *Application Binary
332    Interface*).
333
334 .. EL LENGUAJE DE PROGRAMACION D .............................................
335
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:
341
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).
349
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.
358 - Números complejos.
359
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
370    de basura.
371 .. [#dalias] Análogo al ``typedef`` de C/C++.
372
373 .. EL LENGUAJE DE PROGRAMACION D .............................................
374
375 Programación Orientada a Objetos
376 --------------------------------
377 - Objetos *pesadas* (polimórficos).
378 - Interfaces.
379 - Sobrecarga de operadores (con tipos de retorno covariantes [#dcovariant]_).
380 - Clases anidadas.
381 - Propiedades [#dprop]_.
382
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
391
392 .. EL LENGUAJE DE PROGRAMACION D .............................................
393
394 Programación Confiable
395 ----------------------
396 - Diseño por contrato [#ddbc]_:
397
398   - Precondiciones.
399   - Postcondiciones.
400   - Invariantes de representación.
401   - Afirmaciones (*asserts*).
402
403 - Pruebas unitarias.
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``).
410
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]_.
420
421 .. _Eiffel: http://www.eiffel.com/
422
423
424 .. ===========================================================================
425
426
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
435
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*
455 [DNG43991]_.
456
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-
466 de una biblioteca).
467
468
469 .. ===========================================================================
470
471
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
478
479 .. ANALISIS DE LA SOLUCION ...................................................
480
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]_.
492
493 .. _`versión 1.001`: http://www.digitalmars.com/d/changelog.html#new1_001
494
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
502 base al lenguaje.
503
504 .. ANALISIS DE LA SOLUCION ...................................................
505
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]_
513
514 .. ANALISIS DE LA SOLUCION ...................................................
515
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
526 [DNG38704]_.
527
528
529 .. ===========================================================================
530
531
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.
539    ESTADO: SIN EMPEZAR
540
541
542 .. ===========================================================================
543
544
545 Conclusiones
546 ============
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.
550    ESTADO: SIN EMPEZAR
551
552
553
554
555 .. ===========================================================================
556 .. ============================ FIN DEL DOCUMENTO ============================
557 .. ===========================================================================
558
559 .. Pone links "offline" (para generar PDF para imprimir).
560 .. .. target-notes::
561
562 .. Macros:
563 .. |date| date:: %e de %B de %Y
564
565 .. Citas:
566 .. [JOLI96] Richard Jones, Rafael D Lins. Garbage Collection: Algorithms
567    for Automatic Dynamic Memory Management. John Wiley & Sons, 1996.
568    ISBN 0-471-94148-4.
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,
615    2003.
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.
620
621 .. vim: set ts=2 sts=2 sw=2 et tw=75 :