.. 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
+ ESTADO: TERMINADO, CORREGIDO, REVISADO
.. _d_lang:
estilo funcional en D_.
A partir de este momento la versión 1.0 quedó *teóricamente* congelada,
-introduciendo solo cambios que arreglen errores (*bug fixes*), introduciendo
-todos las nuevas características solamente en la versión 2.0 del lenguaje. La
-realidad es que se hicieron cambios incompatibles a la versión 1.0 del
-lenguaje en reiteradas ocasiones, pero se fue tendiendo a cada vez introducir
-menos 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.
+introduciendo solo cambios que arreglen errores (*bug fixes*), agregando
+nuevas características solamente en la versión 2.0 del lenguaje. La realidad
+es que se hicieron cambios incompatibles a la versión 1.0 del lenguaje en
+reiteradas ocasiones, pero se fue tendiendo a cada vez introducir menos
+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.
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
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
+de Tango_ (Kris Bell, Sean Kelly, Lars Ivar Igesund y Michael Parker) publican
el libro llamado `Learn to Tango with D`_.
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 2 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 no trivial en asegurarse de
-que funcione con ambas).
+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).
Esto hace que la compatibilidad de programas y bibliotecas esté muy
-fragmentada entre las 2 bibliotecas base. Si bien no parece que vaya a haber
+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
Instanciación implícita de funciones generalizadas:
el lenguaje es capaz de deducir los parámetros siempre que no hayan
- ambigüedades
+ ambigüedades.
Ejemplo::
template hash(string s, uint so_far=0) {
static if (s.length == 0)
- const hash = sofar;
+ const hash = so_far;
else
- const hash = hash!(s[1 .. length], sofar * 11 + s[0]);
+ const hash = hash!(s[1 .. length], so_far * 11 + s[0]);
}
string s = hash!("hola"); // calculado en tiempo de compilación
Cantidad de parámetros variables para *templates*:
Esto permite implementar tuplas u otros algoritmos que inherentemente deben
- tomar parámetros variables en tiempo de compilación.
+ tomar una cantidad variable de parámetros en tiempo de compilación.
Ejemplo::
Rendimiento:
la :ref:`d_generic` permite realizar muchas optimizaciones ya que se
- resuelve en tiempo de compilación y por lo tanto aumentando la
- rendimiento en la ejecución.
+ resuelve en tiempo de compilación y por lo tanto aumenta el rendimiento en
+ la ejecución.
Número de punto flotante de 80 bits:
El tipo ``real`` de D_ tiene precisión de 80 bits si la plataforma lo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Programación de alto nivel se refiere a construcciones más avanzadas que una
-sentencia para iterar; expresiones con una semántica más ricas que permiten
+sentencia para iterar; expresiones con una semántica más ricas que proveen de
mayor expresividad al programador o le permiten focalizarse de mejora manera
en los algoritmos independizándose del *hardware* o de como funciona una
computadora. Es exactamente el opuesto a :ref:`d_low_level`.
-En general estas características tiene como efecto secundario una mejora de la
+En general estas características tienen como efecto secundario una mejora de la
productividad de los programadores. D_ adopta herramientas de muchos lenguajes
de alto nivel, como Java_ y Python_, por ejemplo:
al igual que C/C++ y prácticamente cualquier lenguaje imperativo maneja
automáticamente el *stack*, pero a diferencia de la mayoría de los
lenguajes de bajo nivel, D_ permite manejar el *heap* de manera automática
- también a través de un *recolección de basura*.
+ también a través de un *recolector de basura*.
Sistema de paquetes y módulos (similar a Java_ o Python_):
un módulo es una unidad que agrupa clases, funciones y cualquier otra
bool buscar(T[] arreglo, T item, bool delegate(T x, T y) igual) {
foreach (t, arreglo)
- if (igual(t, elemento))
+ if (igual(t, item))
return true;
return false;
}
foo(a);
Documentación embebida:
- D_ provee un sistema de documentación embebida, análogo a lo que provee
+ D_ provee un sistema de documentación embebida, análogo a lo que proveen
Java_ o Python_ en menor medida. Hay comentarios especiales del código que
pueden ser utilizados para documentarlo de forma tal que luego el
compilador pueda extraer esa información para generar un documento.
estamos ante un valor inválido.
``stringof``:
- representación textual del tipo (ejemplo: ``(1+2).stringof`` -> ``"1
- + 2"``).
+ representación textual del símbolo o expresión (ejemplo:
+ ``(1+2).stringof`` -> ``"1 + 2"``).
``mangleof``:
representación textual del tipo *mutilado* [#dmangle]_.
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 (aunque vio
-la luz un año después aproximadamente), su primer *release* fue a principios
-de 2009 y tuvo 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.
+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.
Además de estos compiladores hay varios otros experimentales, pero ninguno de
ellos de calidad suficiente todavía. Por ejemplo hay un compilador
experimental que emite *CIL* (*Common Intermediate Language*), el *bytecode*
-de `.NET`_, llamado DNet_. También hay un *fron-end* escrito en D_, llamado
-Dil_
+de `.NET`_, llamado DNet_. También hay un *front-end* escrito en D_, llamado
+Dil_.
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
.. Introducción al trabajo, objetivos, alcance, limitaciones y organización
del documento.
- ESTADO: TERMINADO, CORREGIDO
+ ESTADO: TERMINADO, CORREGIDO, REVISADO
.. _intro:
acotando tal vez un poco el alcance de estos avances dado que ese lenguaje
tiene características muy particulares (*tipado* estático, corre sobre una
máquina virtual muy rica en cuanto a información de tipos, etc.) no
-disponibles en otros lenguajes. Sin embargo los lenguajes funcionales y con
+disponibles en otros lenguajes. Sin embargo los lenguajes funcionales y/o con
*tipado* dinámico siguieron teniendo un nivel de investigación y desarrollo
importante, dado que fueron concebidos en su mayoría con la recolección de
basura como parte del diseño.
Probablemente los lenguajes en los cuales es más difícil aplicar los avances
-que se desprendieron de Java_ o de las otras categoría de lenguajes con más
-avances en recolección de basura sean los de más bajo nivel (como C y C++), en
+que se desprendieron de Java_ o de las otras categorías de lenguajes con más
+avances en recolección de basura sean los de más bajo nivel, como C y C++, en
los cuales se da lo inverso en cuanto a disponibilidad de información en
tiempo de ejecución, sumado a la permisividad de estos lenguajes para realizar
manipulación de memoria directamente y trabajar a muy bajo nivel. De la mano
Una categoría de lenguaje que ha quedado prácticamente vacante es un término
intermedio entre los lenguajes de muy alto nivel (como Java_, Python_,
-Haskell_, etc.). El lenguaje de programación D_ está en esta categoría y,
-a pesar de haber sido diseñado con soporte de recolección de basura, al ser un
-lenguaje relativamente nuevo, ha tenido muy poco desarrollo en ese área. El
-lenguaje tiene todas las limitaciones de lenguajes de bajo nivel como C y C++
-pero esas limitaciones suelen estar más aisladas, y provee un poco más de
-información que puede ser aprovechada por un recolector de la que suelen
-proveer los demás lenguajes de estas características. Esto presenta una
-oportunidad única en cuanto a investigación y desarrollo de recolectores que
-se ajusten a estas características.
+Haskell_, etc.) y los de muy bajo nivel (como C y C++). El lenguaje de
+programación D_ está en esta categoría y, a pesar de haber sido diseñado con
+soporte de recolección de basura, al ser un lenguaje relativamente nuevo, ha
+tenido muy poco desarrollo en ese área. El lenguaje tiene todas las
+limitaciones de lenguajes de bajo nivel como C y C++, pero esas limitaciones
+suelen estar más aisladas, y provee un poco más de información que puede ser
+aprovechada por un recolector de la que suelen proveer los demás lenguajes de
+estas características. Esto presenta una oportunidad única en cuanto
+a investigación y desarrollo de recolectores que se ajusten a estas
+características.
D_, investigando el estado del arte en recolección de basura y haciendo un
análisis de viabilidad de los algoritmos principales para optar por el que
mejor se ajuste a D_. Una parte muy importante de este análisis es participar
-de la comunidad del lenguaje y sus diseñadores para poder desarrollar una
-mejora que sea aceptada y pueda ser utilizada por el lenguaje. Por lo tanto el
-algoritmo o mejora que "mejor se ajuste a D_" estará supeditado en gran parte
-a los requerimientos más urgentes de los usuarios de D_.
+de la comunidad del lenguaje para poder desarrollar una mejora que sea
+aceptada y utilizada por dicha comunidad. Por lo tanto el algoritmo o mejora
+que "mejor se ajuste a D_" estará supeditado en gran parte a los
+requerimientos más urgentes de los usuarios de D_.