1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
11 \paperpackage widemarginsa4
15 \use_numerical_citations 0
16 \paperorientation portrait
19 \paragraph_separation indent
21 \quotes_language english
25 \paperpagestyle default
34 Leandro Lucarella (77891)
43 El lenguaje de programación D fue concebido en el año 1999 como una reingeniería
44 de C y C++, que apunta a un lenguaje compilado de alto rendimiento pero
45 con un nivel un poco más alto que C o C++.
46 D pretende ser compatible con C (al menos a nivel de código objeto), pero
54 Una de las cosas más importantes que elimina D es el preprocesador de C,
55 poniendo la funcionalidad necesaria directamente en el compilador (incluyendo
56 manejo de módulos, compilación condicional, etc.).
59 El lenguaje sigue, al día de hoy, sin estar completamente definido y con
60 algunas cosas sin implementar.
69 D tiene una gran variedad de tipos básicos, ya que, además de poseer todos
70 los tipos básicos para poder desarrollar a bajo nivel como en C, dispone
71 de números complejos y otros tipos no tan comunes.
74 Entre los tipos compatibles con C se encuentra:
84 char wchar byte short int long
90 char wchar ubyte ushort uint ulong
107 no tienen su contraparte signada, ya que son para uso explícito de variables
108 de caracter (UTF-8 y UTF-16 respectivamente).
109 Además agrega algunos nuevos tipos:
125 (128 bits, reservado para uso futuro);
129 (tipo de punto flotante más grande representable por la arquitectura, en
130 Intel es de 80 bits) y
137 Finalmente agrega el tipo básico imaginario, cuyos tipos son iguales que
142 (de punto flotante) pero anteponiendo una
155 con imaginarios se pueden forma complejos, cuyos variaciones son de la
156 misma forma, sólo que se antepone una
174 De los tipos básicos pueden derivarse otros tipos.
175 Esto tipos son punteros, array y funciones, siendo estas últimas tal vez
176 un caso muy particular.
177 Los array tal vez podrían considerarse tipos compuestos, pero como la variable
178 en sí es un puntero, en realidad no lo es.
179 Es decir, para obtener un elemento del array hay que aplicar aritmética
188 utilizando el operador corchetes.
194 D dispone de varias formas de definir tipos de usuario, entre ellos varios
197 \layout Subsubsection
202 Un alias es la forma más primitiva de tipo de usuario, simplemente es otra
203 forma de escribir un tipo ya definido (es análogo al typedef de C).
213 tipo t = i; // Correcto (semánticamente son los dos int)
216 A partir de ahora puedo hacer referencia a
225 Es decir, son semánticamente idénticos.
226 \layout Subsubsection
231 typedef es similar al alias, con la salvedad de que define un tipo semánticament
232 e distinto (por más que la estructura en memoria y la forma de manejarlo
234 Como concecuencia de esto, se efectua chequeo de tipos y, por ejemplo,
235 no puedo asignar a una variable de un tipo que es un typedef de otro:
244 // No compila porque se está asignando un int a un tipo
250 tipo t = cast(tipo)(i); // Correcto (conversión explícita)
251 \layout Subsubsection
256 Enum es en realidad un
260 que puede tener sólo un número predefinido de valores, que además son represent
264 enum Dias { DOMINGO, LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO }
267 Dias d = Dias.MARTES;
268 \layout Subsubsection
273 Union es otro tipo de dato definido por el usuario proveniente de C, que
274 permite ver una misma
278 de memoria de distintas formas.
313 se guarda en la misma celda de memoria, por lo que se utilizan como mecanismos
314 alternativos para operar en ella, usando semántica de uno u otro tipo.
315 Esto es particularmente útil para aplicaciones de bajo nivel, donde el
316 espacio en memoria es muy reducido.
317 Esta técnica permite tener una variable cuyo tipo es, en cierto modo, variable.
318 \layout Subsubsection
323 El struct es muy similar al de C, con algunos agregados, como la posibilidad
324 de tener funciones miembro, inicializadores, etc.
325 No es más que el agrupamiento de un conjunto de variables, a las que se
326 accede a través de un identificador:
350 printf("dia: %d, mes: %d, anio: %d
371 \layout Subsubsection
376 Las clases son la forma en la que D implementa la orientación a objetos,
377 que veremos en detalle más adelante.
378 Por ahora sólo adelantaremos que es muy similar a un struct, sólo que guarda
379 algo más de información de control (como la tabla virtual) para poder implement
380 ar polimorfismo y herencia.
389 D provee operaciones las operaciones básicas que provee prácticamente cualquier
390 lenguaje: asignación, comparación, incremento, decremento, suma, resta,
391 multiplicación, división, resto, algebra booleana (and, or, xor, not),
393 También provee llamadas a funciones.
394 Los procedimientos son un caso particular de funciones que no devuelven
398 Además de esto, provee operaciones propias de un lenguaje imperativo de
399 bajo nivel: aritmética de punteros, operador [] como método alternativo
400 para acceder a una posición de un array, desreferenciamiento, obtención
401 de una dirección de memoria de una variable, etc.
402 También incluye un operador para comparar si 2 referencias referencian
403 al mismo objeto y algunas operaciones propias de los arrays, como para
404 saber si un elemento está dentro del array o concatenación de arrays y
408 Finalmente provee un operador de resolución de scope, para acceder a variables
409 definidas dentro de tipos compuestos (como estructuras o uniones) o módulos.
415 Si hay o no variables sin nombre
418 El lenguaje cuenta con tipado débil, con conversiones implícitas, por ejemplo,
422 Representación de la memoria
425 La representación en memoria es muy similar a cualquier lenguaje imperativo
426 compilado, como C o C++.
427 Cada tipo de variable ocupa una cierta cantidad de bytes y se almacenan
428 en memoria de forma contigua (al menos lógicamente), según la alineación
429 de la arquitectura para la que fue compilado.
430 Esto trae el clásico problema de los
434 que pueden quedar, para que cada variable ocupe un múltiplo de palabras
435 de la arquitectura, para manejarla con mayor eficiencia, por lo que el
436 compilador provee formas de especificar la alineación a usar.
439 Las variables globales (que incluye a las estáticas) se almacenan en tiempo
440 de compilación (estáticamente) dentro del código del programa, en el área
442 Las variables locales a las funciones se almacenan en una pila de ejecución,
443 por lo tanto debe tener una pila por cada hilo de ejecución.
444 Por último hay un área de memoria
448 que se le pide al sistema operativo a medida que se nececesita (heap).
449 Una particularidad extra de D es que los tipos definidos por el usuario
454 , se almacenan en el heap.
455 En el stack y en el área de datos del programa sólo pueden guardarse referencia
456 s (punteros) a instancias de una clase (en realidad hay excepciones, ya
457 que se puede pedir memoria del stack
461 e inicializar el objeto en esa memoria, pero no es el caso general).
467 D es un lenguaje imperativo compilado, por lo que d
473 Recolección de basura
480 \layout Subsubsection
485 Por copia en demanda (copy on write) y objetos por referencia.
486 \layout Subsubsection
491 Estructura del programa
494 Módulos, espacios de nombres, Interfaces
497 Orientación a objetos
506 Si hay orientación a objetos y describir cómo es.
509 Paralelismo / Concurrencia
512 ¿Para qué no sirve este lenguaje?
515 ¿Para qué sí sirve este lenguaje?