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 .. INTRODUCCION ..............................................................
64 Importancia de la Recolección de Basura
65 ---------------------------------------
66 .. Breve descripción de la utilidad de la recolección de basura
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.
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
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.
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.
111 .. INTRODUCCION ..............................................................
113 El Lenguaje de Programación D
114 -----------------------------
115 .. Breve descripción del lenguaje de programación D
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
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:
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.
141 Lo que podría traducirse como:
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.
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.
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.
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.
172 .. INTRODUCCION ..............................................................
176 .. Objetivo de la tesis
177 ESTADO: TERMINADO, EN REVISION
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.
187 Por lo tanto el objetivo del presente trabajo puede resumirse en los
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
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.
224 .. INTRODUCCION ..............................................................
228 .. Cosas que no se pretenden hacer en esta tesis
229 ESTADO: TERMINADO, EN REVISION
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.
239 De no plantear esta limitación se llegaría indefectiblemente a un recolector
240 conservativo como el que está disponible en la actualidad.
242 .. ===========================================================================
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.
253 .. ===========================================================================
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
263 A continuación se enumeran las principales características de D_,
264 agrupadas por unidades funcional o paradigmas que soporta:
266 .. EL LENGUAJE DE PROGRAMACION D .............................................
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``).
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
304 .. EL LENGUAJE DE PROGRAMACION D .............................................
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
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.
325 .. [#abi] Interfaz de Aplicación Binaria (del inglés *Application Binary
328 .. EL LENGUAJE DE PROGRAMACION D .............................................
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:
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).
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.
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
365 .. [#dalias] Análogo al ``typedef`` de C/C++.
367 .. EL LENGUAJE DE PROGRAMACION D .............................................
369 Programación Orientada a Objetos
370 --------------------------------
371 - Objetos *pesadas* (polimórficos).
373 - Sobrecarga de operadores (con tipos de retorno covariantes [#dcovariant]_).
375 - Propiedades [#dprop]_.
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
386 .. EL LENGUAJE DE PROGRAMACION D .............................................
388 Programación Confiable
389 ----------------------
390 - Diseño por contrato [#ddbc]_:
394 - Invariantes de representación.
395 - Afirmaciones (*asserts*).
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``).
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]_.
416 .. ===========================================================================
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
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*
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-
461 .. ===========================================================================
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
471 .. ANALISIS DE LA SOLUCION ...................................................
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]_.
485 .. _`versión 1.001`: http://www.digitalmars.com/d/changelog.html#new1_001
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
496 .. ANALISIS DE LA SOLUCION ...................................................
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]_
506 .. ANALISIS DE LA SOLUCION ...................................................
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
521 .. ===========================================================================
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.
534 .. ===========================================================================
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.
547 .. ===========================================================================
548 .. ============================ FIN DEL DOCUMENTO ============================
549 .. ===========================================================================
552 .. Pone links "offline" (para generar PDF para imprimir).
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/
575 .. |date| date:: %e de %B de %Y
579 .. [JOLI96] Richard Jones, Rafael D Lins. Garbage Collection: Algorithms
580 for Automatic Dynamic Memory Management. John Wiley & Sons, 1996.
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,
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.
634 .. vim: set ts=2 sts=2 sw=2 et tw=75 :