agrupadas por unidades funcional o paradigmas que soporta:
+
.. _ref_d_generic:
Programación genérica y meta-programación
``goto``:
al igual que C y C++, D_ provee la flexibilidad del uso de ``goto``.
-Compatibilidad con C
+Compatibilidad con C:
soporta todos los tipos de C y es ABI [#abi]_ compatible con éste. Esto
permite enlazar archivos objeto estándar de C y D_ en un mismo programa.
Además permite interoperar con C a través de ``extern (C)``.
+ .. [#abi] Interfaz de Aplicación Binaria (del inglés *Application Binary
+ Interface*).
+
Ejemplo::
extern (C) printf(const char* format, ...);
// paquete_de_red.sizeof == 3
-.. [#abi] Interfaz de Aplicación Binaria (del inglés *Application Binary
- Interface*).
-
.. _ref_d_high_level:
evaluados de forma perezosa no son más que un delegado que se ejecuta
solo cuando es necesario.
+ .. [#1stclasscity] Por ciudadano de primera clase se entiende que se trata
+ de un tipo soportado por completo por el lenguaje, disponiendo de
+ expresiones literales anónimas, pudiendo ser almacenados en variables,
+ estructuras de datos, teniendo una identidad intrínseca, más allá de un
+ nombre dado, etc. En realidad los arreglos asociativos no pueden ser
+ expresados como literales anónimos pero sí tienen una sintaxis especial
+ soportada directamente por el lenguaje.
+
Ejemplo::
bool buscar(T[] arreglo, T item, bool delegate(T x, T y) igual) {
float re = 1.0;
cfloat c = re + im; // c == 1.0 + 5.0i
-.. [#1stclasscity] Por ciudadano de primera clase se entiende que se
- trata de un tipo soportado por completo por el lenguaje, disponiendo de
- expresiones literales anónimas, pudiendo ser almacenados en variables,
- estructuras de datos, teniendo una identidad intrínseca, más allá
- de un nombre dado, etc. En realidad los arreglos asociativos no pueden
- ser expresados como literales anónimos pero sí tienen una sintaxis
- especial soportada directamente por el lenguaje.
-
Programación orientada a objetos
problemas con los que se enfrenta C++ (como *slicing* [#dslicing]_)
debido a que permite semántica por valor [#dvalsem]_.
+ .. [#drefsem] Semántica de referencia significa que el tipo es tratado como
+ si fuera un puntero. Nunca se hacen copias del objeto, siempre se pasa
+ por referencia.
+
+ .. [#dslicing] Este problema se da en C++ cuando se pasa una clase derivada
+ a una función que acepta una clase base por valor como parámetro. Al
+ realizarse una copia de la clase con el constructor de copia de la clase
+ base, se pierden (o *rebanan*) los atributos de la clase derivada, y la
+ información de tipos en tiempo de ejecución (*RTTI*).
+
+ .. [#dvalsem] Semántica de valor significa que el tipo es tratado como si
+ fuera un valor concreto. En general se pasa por valor y se hacen copias
+ a menos que se utilice explícitamente un puntero.
+
D_ además soporta tipos de retorno covariantes para funciones virtuales.
Esto significa que una función sobreescrita por una clase derivada puede
retornar un tipo que sea derivado del tipo retornado por la función
valor de inicialización por omisión (ejemplo: ``float.init`` -> *NaN*
[#dnan]_).
+ .. [#dnan] Del inglés *Not A Number*, es un valor especial que indica que
+ estamos ante un valor inválido.
+
``stringof``:
representación textual del tipo (ejemplo: ``(1+2).stringof`` -> ``"1
+ 2"``).
``mangleof``:
representación textual del tipo *mutilado* [#dmangle]_.
+ .. [#dmangle] *Name mangling* es el nombre dado comunmente a una técnica
+ necesaria para poder sobrecargar nombres de símbolos. Consiste en
+ codificar los nombres de las funciones tomando como entrada el nombre de
+ la función y la cantidad y tipo de parámetros, asegurando que dos
+ funciones con el mismo nombre pero distintos parámetros (sobrecargada)
+ tengan nombres distintos.
+
``alignof``
alineación de una estructura o tipo.
http://www.digitalmars.com/d/1.0/property.html
-.. [#drefsem] Semántica de referencia significa que el tipo es tratado como
- si fuera un puntero. Nunca se hacen copias del objeto, siempre se pasa
- por referencia.
-.. [#dslicing] Este problema se da en C++ cuando se pasa una clase derivada
- a una función que acepta una clase base por valor como parámetro. Al
- realizarse una copia de la clase con el constructor de copia de la clase
- base, se pierden (o *rebanan*) los atributos de la clase derivada, y la
- información de tipos en tiempo de ejecución (*RTTI*).
-.. [#dvalsem] Semántica de valor significa que el tipo es tratado como
- si fuera un valor concreto. En general se pasa por valor y se hacen
- copias a menos que se utilice explícitamente un puntero.
-.. [#dnan] Del inglés *Not A Number*, es un valor especial que indica que
- estamos ante un valor inválido.
-.. [#dmangle] *Name mangling* es el nombre dado comunmente a una técnica
- necesaria para poder sobrecargar nombres de símbolos. Consiste en
- codificar los nombres de las funciones tomando como entrada el nombre de
- la función y la cantidad y tipo de parámetros, asegurando que dos
- funciones con el mismo nombre pero distintos parámetros (sobrecargada)
- tengan nombres distintos.
-
Programación confiable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tanto en realidad hay solo un compilador disponible con 3 *back-ends*
[#backend]_ diferentes.
+.. [#frontend] *Front-end* es la parte del compilador encargada de hacer el
+ análisis léxico, sintáctico y semántico del código fuente, generando una
+ representación intermedia que luego el *back-end* convierte a código de
+ máquina.
+
+.. [#backend] El *back-end* es la parte del compilador encargada de convertir
+ la representación intermedia generada por el *front-end* a código de
+ máquina.
+
Con `DMD 1.041`__ se publicó el código fuente completo del compilador,
pero con una licencia muy restrictiva para uso personal, por lo que el
único efecto logrado por esto es que la gente pueda mandar parches
se terminó desarrollando el trabajo utilizando LDC_.
-.. [#frontend] *Front-end* es la parte del compilador encargada de hacer el
- análisis léxico, sintáctico y semántico del código fuente, generando una
- representación intermedia que luego el *back-end* convierte a código de
- máquina.
-.. [#backend] El *back-end* es la parte del compilador encargada de
- convertir la representación intermedia generada por el *front-end*
- a código de máquina.
-
.. include:: links.rst