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