X-Git-Url: https://git.llucax.com/z.facultad/75.00/informe.git/blobdiff_plain/5f79318a52fc6ada10154cb148008bd9d44fa22e..03b62e9899469e294fbd7d7e1622ec27cac669c2:/source/d.rst diff --git a/source/d.rst b/source/d.rst index 1fd5436..b4af95d 100644 --- a/source/d.rst +++ b/source/d.rst @@ -173,6 +173,7 @@ A continuación se enumeran las principales características de D_, agrupadas por unidades funcional o paradigmas que soporta: + .. _ref_d_generic: Programación genérica y meta-programación @@ -452,11 +453,14 @@ Provee acceso a *assembly*: ``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, ...); @@ -519,9 +523,6 @@ Control de alineación de miembros de una estructura: // paquete_de_red.sizeof == 3 -.. [#abi] Interfaz de Aplicación Binaria (del inglés *Application Binary - Interface*). - .. _ref_d_high_level: @@ -592,6 +593,14 @@ Funciones y delegados: 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) { @@ -688,14 +697,6 @@ Números complejos: 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 @@ -716,6 +717,20 @@ Objetos *pesados*: 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 @@ -812,6 +827,9 @@ Propiedades (*properties*): 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"``). @@ -819,6 +837,13 @@ Propiedades (*properties*): ``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. @@ -831,26 +856,6 @@ Propiedades (*properties*): 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1058,6 +1063,15 @@ Artistic_/GPL_ y es utilizado por los otros dos compiladores, por lo 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 @@ -1092,14 +1106,6 @@ gracias a la excepcional tasa de crecimiento de LDC_ y al abandono de GDC_ 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