]> git.llucax.com Git - z.facultad/75.31/presentacion.git/blob - presentacion_d.lyx
e59d8056c87688fd4da145356e5055956cb464f5
[z.facultad/75.31/presentacion.git] / presentacion_d.lyx
1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
2 \lyxformat 221
3 \textclass article
4 \language spanish
5 \inputencoding latin1
6 \fontscheme palatino
7 \graphics default
8 \paperfontsize default
9 \spacing single 
10 \papersize a4paper
11 \paperpackage widemarginsa4
12 \use_geometry 0
13 \use_amsmath 0
14 \use_natbib 0
15 \use_numerical_citations 0
16 \paperorientation portrait
17 \secnumdepth 3
18 \tocdepth 3
19 \paragraph_separation indent
20 \defskip medskip
21 \quotes_language english
22 \quotes_times 2
23 \papercolumns 1
24 \papersides 1
25 \paperpagestyle default
26
27 \layout Title
28
29 Teoría de Lenguaje
30 \newline 
31 Lenguaje D
32 \layout Author
33
34 Leandro Lucarella (77891)
35 \layout Date
36
37 30 de Mayo de 2005
38 \layout Section
39
40 Introducción
41 \layout Standard
42
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
47  
48 \series bold 
49 no
50 \series default 
51  con C++.
52 \layout Standard
53
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.).
57 \layout Standard
58
59 El lenguaje sigue, al día de hoy, sin estar completamente definido y con
60  algunas cosas sin implementar.
61 \layout Section
62
63 Sistema de tipos
64 \layout Subsection
65
66 Tipos básicos
67 \layout Standard
68
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.
72 \layout Standard
73
74 Entre los tipos compatibles con C se encuentra:
75 \layout Description
76
77 Vacío 
78 \family typewriter 
79 void
80 \layout Description
81
82 Signados 
83 \family typewriter 
84 char wchar byte short int long
85 \layout Description
86
87 No\SpecialChar ~
88 signados 
89 \family typewriter 
90 char wchar ubyte ushort uint ulong
91 \layout Description
92
93 Punto\SpecialChar ~
94 flotante 
95 \family typewriter 
96 float double
97 \layout Standard
98
99
100 \family typewriter 
101 char
102 \family default 
103  y 
104 \family typewriter 
105 wchar
106 \family default 
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: 
110 \family typewriter 
111 bit
112 \family default 
113  (análogo a 
114 \family typewriter 
115 bool
116 \family default 
117  de C++), 
118 \family typewriter 
119 cent
120 \family default 
121  y 
122 \family typewriter 
123 ucent
124 \family default 
125  (128 bits, reservado para uso futuro); 
126 \family typewriter 
127 real
128 \family default 
129  (tipo de punto flotante más grande representable por la arquitectura, en
130  Intel es de 80 bits) y 
131 \family typewriter 
132 dchar
133 \family default 
134  (UTF-32).
135 \layout Standard
136
137 Finalmente agrega el tipo básico imaginario, cuyos tipos son iguales que
138  los 
139 \emph on 
140 racionales
141 \emph default 
142  (de punto flotante) pero anteponiendo una 
143 \family typewriter 
144 i
145 \family default 
146
147 \family typewriter 
148 ifloat idouble ireal
149 \family default 
150 .
151  Combinando 
152 \emph on 
153 racionales
154 \emph default 
155  con imaginarios se pueden forma complejos, cuyos variaciones son de la
156  misma forma, sólo que se antepone una 
157 \family typewriter 
158 c
159 \family default 
160  en vez de una 
161 \family typewriter 
162 i
163 \family default 
164 :
165 \family typewriter 
166  cfloat cdouble creal
167 \family default 
168 .
169 \layout Subsection
170
171 Tipos derivados
172 \layout Standard
173
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
180  de punteros, ya sea 
181 \emph on 
182 explícitamente
183 \emph default 
184  o 
185 \emph on 
186 implícitamente
187 \emph default 
188  utilizando el operador corchetes.
189 \layout Subsection
190
191 Tipos de usuario
192 \layout Standard
193
194 D dispone de varias formas de definir tipos de usuario, entre ellos varios
195  que provienen de C.
196  Veamos cada uno.
197 \layout Subsubsection
198
199 alias
200 \layout Standard
201
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).
204  Ejemplo:
205 \layout LyX-Code
206
207 alias int tipo;
208 \layout LyX-Code
209
210 int i = 1;
211 \layout LyX-Code
212
213 tipo t = i; // Correcto (semánticamente son los dos int)
214 \layout Standard
215
216 A partir de ahora puedo hacer referencia a 
217 \family typewriter 
218 int
219 \family default 
220  llamándolo 
221 \family typewriter 
222 tipo
223 \family default 
224 .
225  Es decir, son semánticamente idénticos.
226 \layout Subsubsection
227
228 typedef
229 \layout Standard
230
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
233  sea idéntica).
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:
236 \layout LyX-Code
237
238 typedef int tipo;
239 \layout LyX-Code
240
241 int i = 1;
242 \layout LyX-Code
243
244 // No compila porque se está asignando un int a un tipo
245 \layout LyX-Code
246
247 // tipo t = i;
248 \layout LyX-Code
249
250 tipo t = cast(tipo)(i); // Correcto (conversión explícita)
251 \layout Subsubsection
252
253 enum
254 \layout Standard
255
256 Enum es en realidad un 
257 \family typewriter 
258 int
259 \family default 
260  que puede tener sólo un número predefinido de valores, que además son represent
261 ados simbólicamente.
262 \layout LyX-Code
263
264 enum Dias { DOMINGO, LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO }
265 \layout LyX-Code
266
267 Dias d = Dias.MARTES;
268 \layout Subsubsection
269
270 union
271 \layout Standard
272
273 Union es otro tipo de dato definido por el usuario proveniente de C, que
274  permite ver una misma 
275 \emph on 
276 celda
277 \emph default 
278  de memoria de distintas formas.
279 \layout LyX-Code
280
281 union Celda
282 \layout LyX-Code
283
284 {
285 \layout LyX-Code
286
287     int i;
288 \layout LyX-Code
289
290     real r;
291 \layout LyX-Code
292
293 }
294 \layout LyX-Code
295
296 Celda c;
297 \layout LyX-Code
298
299 c.i = 1;
300 \layout LyX-Code
301
302 c.r += 2.5;
303 \layout Standard
304
305 Tanto 
306 \family typewriter 
307 r
308 \family default 
309  como 
310 \family typewriter 
311 i
312 \family default 
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
319
320 struct
321 \layout Standard
322
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:
327 \layout LyX-Code
328
329 struct Fecha
330 \layout LyX-Code
331
332
333 \layout LyX-Code
334
335     uint dia = 1;
336 \layout LyX-Code
337
338     uint mes = 1;
339 \layout LyX-Code
340
341     uint anio = 2005;
342 \layout LyX-Code
343
344     void print()
345 \layout LyX-Code
346
347     {
348 \layout LyX-Code
349
350         printf("dia: %d, mes: %d, anio: %d
351 \backslash 
352 n", dia, mes, anio);
353 \layout LyX-Code
354
355     }
356 \layout LyX-Code
357
358 }
359 \layout LyX-Code
360
361 Fecha f;
362 \layout LyX-Code
363
364 f.dia = 30;
365 \layout LyX-Code
366
367 f.mes = 5;
368 \layout LyX-Code
369
370 f.print();
371 \layout Subsubsection
372
373 class
374 \layout Standard
375
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.
381 \layout Section
382
383 Expresiones
384 \layout Subsection
385
386 Operaciones
387 \layout Standard
388
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),
392  shifting.
393  También provee llamadas a funciones.
394  Los procedimientos son un caso particular de funciones que no devuelven
395  nada (void).
396 \layout Standard
397
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
405  slicing.
406 \layout Standard
407
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.
410 \layout Subsection
411
412 Variables
413 \layout Comment
414
415 Si hay o no variables sin nombre
416 \layout Standard
417
418 El lenguaje cuenta con tipado débil, con conversiones implícitas, por ejemplo,
419  entre punteros.
420 \layout Subsection
421
422 Representación de la memoria
423 \layout Standard
424
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 
431 \emph on 
432 huecos
433 \emph default 
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.
437 \layout Standard
438
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
441  de datos.
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 
445 \emph on 
446 libre
447 \emph default 
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
450  de tipo 
451 \series bold 
452 class
453 \series default 
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 
458 \emph on 
459 a mano
460 \emph default 
461  e inicializar el objeto en esa memoria, pero no es el caso general).
462 \layout Subsection
463
464 Modelo de ejecución
465 \layout Standard
466
467 D es un lenguaje imperativo compilado, por lo que d
468 \layout Subsection
469
470 Punteros
471 \layout Subsection
472
473 Recolección de basura
474 \layout Subsection
475
476 Instrucciones
477 \layout Subsection
478
479 Rutinas
480 \layout Subsubsection
481
482 Pasaje de parámetros
483 \layout Standard
484
485 Por copia en demanda (copy on write) y objetos por referencia.
486 \layout Subsubsection
487
488 Anidamiento
489 \layout Section
490
491 Estructura del programa
492 \layout Subsection
493
494 Módulos, espacios de nombres, Interfaces
495 \layout Section
496
497 Orientación a objetos
498 \layout Subsection
499
500 TAD's
501 \layout Subsection
502
503 Polimorfismo
504 \layout Comment
505
506 Si hay orientación a objetos y describir cómo es.
507 \layout Section
508
509 Paralelismo / Concurrencia
510 \layout Section
511
512 ¿Para qué no sirve este lenguaje?
513 \layout Section
514
515 ¿Para qué sí sirve este lenguaje? 
516 \the_end