.. Introducción y breve reseña del lenguaje de programación D. También
se presentan las necesidades particulares de D con respecto al
recolector de basura y su estado actual.
- ESTADO: TERMINADO, CORREGIDO, REVISADO
+ ESTADO: TERMINADO, CORREGIDO (A)
.. _d_lang:
D_ es un lenguaje de programación relativamente joven. Nació en 1999 y el
2 de enero de 2007 salió su `versión 1.0`__. Poco tiempo después se continúo
-el desarrollo del lenguaje en la `versión 2.0`__, aún inestable y en la cual
-se está experimentando principalmente sobre multi-procesamiento.
+el desarrollo del lenguaje en la `versión 2.0`__, que pasó a ser considerada
+estable aproximadamente en junio de 2010 con el lanzamiento del libro "The
+D Programming Language" [ALX10]_, pero aún es un trabajo en progreso.
__ `D 1.0`_
__ `D 2.0`_
El lenguaje fue diseñado e implementado por `Walter Bright`_, desarrollador
-principal de Zortech C++, uno de los primeros compilador de C++ que compilaba
-a código nativo, y está fuertemente influenciado éste. Sin embargo toma muchos
-conceptos de otros lenguajes de más alto nivel, como Java_ o incluso lenguajes
-dinámicos como Perl_.
+principal de Zortech C++, uno de los primeros compiladores de C++ que
+compilaba a código nativo, y está fuertemente influenciado por éste. Sin
+embargo toma muchos conceptos de otros lenguajes de más alto nivel, como Java_
+o incluso lenguajes dinámicos como Perl_, Python_ y Ruby_.
El origen del lenguaje está plasmado en su sitio web, en donde se cita:
práctica implementando compiladores.
La versión 1.0 fue más bien una etiqueta arbitraria que un indicador real de
-estar ante una versión estable y completa. Luego de liberarse se siguieron
-agregando nuevas características al lenguaje hasta que se empezó el desarrollo
-en paralelo de la versión 2.0 al introducirse el concepto de inmutabilidad
-y funciones *puras* [#dpure]_ (a mediados de 2007).
+estabilidad y completitud. Luego de liberarse se siguieron agregando nuevas
+características al lenguaje hasta que se empezó el desarrollo en paralelo de
+la versión 2.0 al introducirse el concepto de inmutabilidad y funciones
+*puras* [#dpure]_ (a mediados de 2007).
.. [#dpure] Por funciones *puras* en D_ se entiende que no tienen efectos
colaterales. Es decir, una función pura siempre que se llame con la misma
entrada producirá el mismo resultado. Esto es análogo a como funcionan los
- lenguajes funcionales en general, abríendo la puerta a la programación de
+ lenguajes funcionales en general, abriendo la puerta a la programación de
estilo funcional en D_.
A partir de este momento la versión 1.0 quedó *teóricamente* congelada,
cambios incompatibles. Sin embargo al día de hoy el compilador de referencia
sigue teniendo algunas características presentes en la especificación del
lenguaje sin implementar, por lo que todavía no hay una implementación
-completa de la versión 1.0 del lenguaje, siendo esta etiqueta todavía un poco
-arbitraria.
+completa de la versión 1.0 del lenguaje.
El lenguaje ha sido, hasta el desarrollo de la versión 2.0 al menos, un
esfuerzo unipersonal de `Walter Bright`_, dados sus problemas a la hora de
Para comienzos de 2006, se empieza a trabajar en la combinación de ambas
bibliotecas para lograr una biblioteca estándar alternativa con un alto grado
de cohesión. Finalmente a principios de 2007, coincidiendo por casualidad con
-la aparición de D_ 1.0, se anuncia el resultado de este combinación bajo el
+la aparición de `D 1.0`_, se anuncia el resultado de este combinación bajo el
nombre de Tango_, proveyendo una alternativa completa y madura a la biblioteca
estándar de D_ Phobos_. A principios de 2008 los principales desarrolladores
de Tango_ (Kris Bell, Sean Kelly, Lars Ivar Igesund y Michael Parker) publican
-el libro llamado `Learn to Tango with D`_.
+el libro llamado `Learn to Tango with D`_ [BKIP08]_.
Esto por un lado fue un gran avance porque dio un impulso muy considerable al
-lenguaje pero por otro un gran retroceso, porque todavía al día de hoy D_ 1.0
-tiene dos bibliotecas base, una estándar pero de peor calidad y menos
-mantenida y una alternativa de mayor calidad y apertura a la comunidad (pero
-no estándar). El peor problema es que ambas son **incompatibles**, por lo que
-un programa hecho con Tango_ no funciona con Phobos_ y viceversa (a menos que
-el programador haya invertido una cantidad de tiempo considerable en
-asegurarse de que funcione con ambas).
+lenguaje pero por otro un gran retroceso, porque todavía al día de hoy `D
+1.0`_ tiene dos bibliotecas base, una estándar pero de peor calidad, menos
+mantenida y usada; y una alternativa de mayor calidad y apertura a la
+comunidad (pero no estándar). El peor problema es que ambas son
+**incompatibles**, por lo que un programa hecho con Tango_ no funciona con
+Phobos_ y viceversa (a menos que el programador haya invertido una cantidad de
+tiempo considerable en asegurarse de que funcione con ambas).
Esto hace que la compatibilidad de programas y bibliotecas esté muy
fragmentada entre las dos bibliotecas base. Si bien no parece que vaya a haber
-solución alguna a este problema para D 1.0, D 2.0 va en camino a solucionar
-este problema ya que utiliza DRuntime_, un nuevo intento de Sean Kelly por
-proveer una biblioteca *runtime* bien organizada y mantenida, que es una
-adaptación de la biblioteca *runtime* de Tango_ a D 2.0. Si bien todavía
-Tango_ no fue adaptada a D 2.0, se espera que cuando esto pase compartan la
-misma biblioteca *runtime* permitiendo que bibliotecas y programas hechos para
-Tango_ y Phobos_ 2.0 puedan coexistir sin problemas.
+solución alguna a este problema para `D 1.0`_, `D 2.0`_ va en camino
+a solucionar este problema ya que utiliza DRuntime_, un nuevo intento de Sean
+Kelly por proveer una biblioteca *runtime* bien organizada y mantenida, que es
+una adaptación de la biblioteca *runtime* de Tango_ a `D 2.0`_. Sin embargo
+Tango_ no fue adaptada a `D 2.0`_ todavía, y no hay muchas perspectivas de que
+sea portada en algún momento, por un lado porque en general la comunidad sigue
+fragmentada entre muchos usuarios de `D 1.0`_ que no están contentos con los
+cambios introducidos en `D 2.0`_, en su mayoría usuarios de Tango_, y que no
+planean migrar a esa versión; y por otro porque el desarrollo de Phobos_ 2.0
+se ha abierto mucho y tiene muchos colaboradores, por lo tanto la mayor parte
+de la gente que utiliza `D 2.0`_ está contenta con el estado de Phobos_ 2.0.
Descripción general
D_ es un lenguaje de programación con sintaxis tipo C, multi-paradigma,
compilado, con *tipado* fuerte y estático, buenas capacidades tanto de
-programación de bajo nivel (*system programming*) como de alto nivel. Es
-compatible de forma binaria con C (se puede enlazar código objeto C con código
-objeto D). Con estas características, D_ logra llenar un vacío importante que
-hay entre lo lenguajes de alto bajo nivel y los de alto nivel [BKIP08]_. Si
-bien tiene herramientas de muy bajo nivel, que por lo tanto son muy propensas
-a errores, da una infinidad de mecanismos para evitar el uso de estas
-herramientas a menos que sea realmente necesario. Además pone mucho énfasis
-en la programación confiable, para lo cual provee muchos mecanismos para
-detectar errores en los programas de forma temprana.
+programación de bajo nivel (*system programming*) como de alto nivel; además
+es compatible de forma binaria con C (se puede enlazar código objeto C con
+código objeto D). Con estas características, D_ logra llenar un vacío
+importante que hay entre lo lenguajes de alto bajo nivel y los de alto nivel
+[BKIP08]_. Si bien tiene herramientas de muy bajo nivel, que por lo tanto son
+muy propensas a errores, da una infinidad de mecanismos para evitar el uso de
+estas herramientas a menos que sea realmente necesario. Además pone mucho
+énfasis en la programación confiable, para lo cual provee muchos mecanismos
+para detectar errores en los programas de forma temprana.
Si puede pensarse en C++ como un "mejor C", podría decirse que D_ es un "mejor
C++", ya que el objetivo del lenguaje es muy similar a C++, pero implementa
hace de una forma mucho más limpia, ya que no debe lidiar con problemas de
compatibilidad hacia atrás, y cuenta con la experiencia del camino recorrido
por C++, pudiendo extraer de él los mejores conceptos pero evitando sus
-mayores problemas también.
+mayores problemas.
Otra gran diferencia con C++ es la facilidad para ser analizado
-sintácticamente (*parsing*), ya fue especialmente diseñado para ser sencillo
-y a diferencia de C y C++ su gramática es independiente del contexto
+sintácticamente (*parsing*), ya que fue especialmente diseñado para ser
+sencillo y a diferencia de C y C++ su gramática es independiente del contexto
(*context-free grammar*). Esto permite que D pueda ser compilado en pequeños
pasos bien separados:
5. Generación de código.
Esto favorece la creación de herramientas dada la facilidad de usar solamente
-la cantidad de análisis necesario para cada herramienta (por ejemplo un editor
-de textos puede tener hasta análisis sintáctico para proveer resaltado o un
-entorno de desarrollo puede proveer herramientas de re-factorización de código
+la cantidad de análisis necesario para cada una (por ejemplo un editor de
+textos puede tener hasta análisis sintáctico para proveer resaltado o un
+entorno de desarrollo puede proveer herramientas para re-factorizar el código
haciendo uso del análisis semántico).
Una de las características que nunca pudo entrar en el estándar de C++ es la
----------------------------------------------------------------------------
A continuación se enumeran las principales características de D_, agrupadas
-por unidades funcional o paradigmas que soporta:
+por unidades funcionales o paradigmas que soporta:
Expresiones ``is``
las *expresiones ``is``* permiten la compilación condicional basada en las
- características de un tipo. Esto se realiza en favor a una técnica
- utilizada en C++ de realizar *pattern matching* sobre los parámetros de las
- plantillas.
+ características de un tipo.
Ejemplo::
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Programación confiable se refiere a las capacidades o facilidades que provee
-el lenguaje para evitar fallas de manera temprano (o la capacidad de evitar
+el lenguaje para evitar fallas de manera temprana (o la capacidad de evitar
que ciertas fallas puedan existir directamente). D_ presta particular atención
a esto y provee las siguientes herramientas:
__ http://www.digitalmars.com/d/1.0/changelog.html#new1_041
El compilador GDC_ es el *front-end* de DMD_ utilizando al compilador GCC_
-como *back-end*. Fue un muy buen compilador pero en la actualidad está
-abandonado. No hay un *release* desde agosto de 2007 y no hay actualizaciones
-serias del código desde mediados de 2008, por lo que no parece haber muchas
-probabilidades de que se siga manteniendo.
-
-LDC_ es lo opuesto; un compilador joven, nacido a mediados de 2007 como un
-proyecto personal y privado de Tomas Lindquist Olsen, que estuvo trabajando de
-forma privada en el proyecto hasta mediados de 2008, momento en que decide
-publicar el código mediante una licencia libre. Para ese entonces el
-compilador era todavía inestable y faltaban implementar varias cosas, pero el
-estado era lo suficientemente bueno como para captar varios colaboradores muy
-capaces, como `Christian Kamm`_ y Frits Van Bommel que rápidamente se
-convirtieron en parte fundamental del proyecto. El primer *release* (0.9) de
-una versión relativamente completa y estable fue a principios de 2009 que fue
-seguido por la versión 0.9.1 que como puntos más salientes agregó soporte para
-x86-64 y assembly embebido. El compilador tuvo y sigue teniendo un crecimiento
-excepcional. En la actualidad inclusive pasa más pruebas de estrés que el
-compilador de referencia DMD_. Como *back-end* utiliza LLVM_, otro proyecto
-joven y con una tasa de crecimiento muy alta.
+como *back-end*. Fue un muy buen compilador pero estuvo abandonado por casi
+tres años. A mediados de este año recibió un nuevo impulso y de a poco se está
+poniendo al día con los *front-ends* actuales de DMD_ 1.0 y 2.0, aunque la
+versión 2.0 viene bastante más rezagada y todavía no es una alternativa viable
+a DMD_.
+
+LDC_ sufrió una suerte similar, es un compilador joven que utiliza como
+*back-end* a LLVM_ (una infraestructura modera para construir compiladores),
+nacido a mediados de 2007 como un proyecto personal y privado de Tomas
+Lindquist Olsen, que estuvo trabajando de forma privada en el proyecto hasta
+mediados de 2008, momento en que decide publicar el código mediante una
+licencia libre. Para ese entonces el compilador era todavía inestable
+y faltaban implementar varias cosas, pero el estado era lo suficientemente
+bueno como para captar varios colaboradores muy capaces, como `Christian
+Kamm`_ y Frits Van Bommel que rápidamente se convirtieron en parte fundamental
+del proyecto. El primer *release* (0.9) de una versión relativamente completa
+y estable fue a principios de 2009 que fue seguido por la versión 0.9.1 que
+como puntos más salientes agregó soporte para x86-64 y assembly embebido. El
+compilador tuvo un crecimiento excepcional pero estuvo muy inactivo por algún
+tiempo y, si bien sigue siendo mantenido, en general los nuevos *front-end* de
+DMD_ llevan tiempo de integrar y no está al día con el *back-end* de LLVM_
+(por ejemplo desde que se actualizó para utilizar LLVM_ 2.7 que perdió la
+capacidad de generar símbolos de depuración).
Además de estos compiladores hay varios otros experimentales, pero ninguno de
ellos de calidad suficiente todavía. Por ejemplo hay un compilador
Originalmente, dado que GDC_ estaba siendo mantenido y que LDC_ no existía,
este trabajo iba a ser realizado utilizando GDC_ como compilador, dado que al
-ser `Software Libre`_ podía ser modificado de ser necesario. Finalmente,
-gracias a la excepcional tasa de crecimiento de LDC_ y al abandono de GDC_ se
-terminó desarrollando el trabajo utilizando LDC_.
-
+ser `Software Libre`_ podía ser modificado de ser necesario. Pero finalmente,
+dada la poca confiabilidad que presenta la continuidad del desarrollo de tanto
+GDC_ como LDC_, y que el código de DMD_ está disponible en su totalidad
+(aunque no sea `Software Libre`_ por completo), se optó por utilizar este
+último, dado que es la implementación de referencia que fue más constantemente
+mantenida y desarrollada.
.. include:: links.rst