principios y practica
= Kenneth G. Loudennido
1 Introduccién 1
11
1.2
13
14
15
1.6
{Qué es un lenguaje de programacién? 2
Abstracciones en los lenguajes de programacién 4
Paradigmas de computacién 12
Definici6n de lenguaje 18
Tmduccién del lenguaje 20
Disefio del lenguaje 26
Fjercicios 27
Notas y referencias 29
2 Historia 31
21
22
23
24
25
2.6
2.7
Albores histéricos: el primer programador 32
Los afios 50: Los primeros lenguajes de programacién 33
Los aiios 60: Una explosisn de lenguajes de programacién 35
Los afios 70: Simplicidad, abstraccién, estudio 38
Los afios 80: Nuevas direcciones y la creciente importancia
de la orientacién a objetos 39
Los afios 90: Consolidacién, Internet, bibliotecas y la redaccién de macros 41
El futuro 44
Ejercicios 45
Notas y referencias 47vi CONTENIDO
3 Principios de disefio de los lenguajes 49
3.1 Historia y criterios de disefio 51
3.2. Eficiencia 52
3.3 Regularidad 54
3.4 Principios adicionales sobre disefio de los lenguajes 57
3.5 C++: Un estudio de caso de los disefios de los lenguajes 61
Bjercicios 65
Notas y referencias 68
4 Sintaxis 69
4.1 Estructura léxica de los lenguajes de programacién 70
4.2. Graméticas libres de contexto y BNF 74
4.3. Arboles de anilisis sintactico y arboles de sintaxis abstracta 80
4.4 Ambigiedad, asociatividad y precedencia 83
4.5. EBNF y diagramas sintécticos 87
4.6 Técnicas y herramientas de andlisis sintactico 91
4.7 Léxico comparado con la sintaxis y con la seméntica 102
Ejercicios 104
Notas y referencias 112
5 Semdntica bdsica 113
5.1 Atributos, ligaduras y funciones seménticas 114
5.2 Declaraciones, bloques y alcance 118
5.3. Latablade simbolos 127
Resolucisn y sobrecarga de nombres _139
5.5. Asignacién, tiempo de vida y el entorno 145
5.6 Variables y constantes 153
5.7 Alias, referencias pendientes y basura 159
Ejercicios 165
Notas y referencias 171
6 Tipos de datos 173
6.1 Tipos de datos e informacién de tipos 176
6.2 Tipos simples 180CONTENIDO vii
63
64
65
6.6
67
6.8
6.9
Constructores de tipos 183
Nomenclatura de tipos en lenguajes de ejemplo 196
Equivalencia de tipos 199
Verificacién de tipos 205
Conversion de tipos 211
Verificacién de tipos polimérficos 214
Polimorfismo explicito 222
Fjercicios 228
Notas y referencias 235
7 Control I—Expresiones y enunciados 237
7A
72
73
WA
75
Expresiones 238
Enunciados y guardias condicionales 246
Ciclos y variaciones sobre WHILE 251
La controversia GOTO 255
Manejo de excepciones 257
Ejercicios 272
Notas y referencias 279
8 Control II—Procedimientos y ambientes 231
81
8.2
83
8.4
Definicién y activacién de los procedimientos 283
Seméntica de los procedimientos 285
Mecanismos de paso de parimetros 289
Ambientes, activacién y asignacién de los procedimientos 296
8.5 _Administracién de la memoria dinémica 309
8.6__Manejo de excepciones y de ambientes 313
Ejercicios 315
Notas y referencias 324
9 _Tipos de datos abstractos y médulos 325
91
‘ficaci6n algebraica de los tipos de datos abstractos _328
9.2__Mecanismos de tipos de datos abstractos y médulos _ 332
93
94
Compilacién individual en C, espacios de nombres de C++
ypaquetes Java 335
Paquetes de Ada 343viii CONTENIDO
9.5 Médulos en ML_348
9.6 Médulos en lenguajes anteriores 351
9.7 Problemas que se presentan con los mecanismos de tipos de datos abstractos 356
9.8 Las mateméticas de los tipos de datos abstractos 364
Ejercicios 367
Notas y referencias 372
10 Programacién orientada a objetos 373
10.1
10.2
10.3
10.4
10.5
Reutilizacién e independencia del software 374
Java: objetos, clases y métodos 377
Herencia 382
Ligadura dindmica 393
C++ 396
10.6 Smalltalk _407
10.7
10.8
Cuestiones de disefio en lenguajes orientados a objetos 412
Cuestiones de implementacién en lenguajes orientados a objetos 417
Ejercicios 422
Notas y referencias 429
11 Programacién funcional 431
LL
11.2
113
14
15
11.6
11.7
1L.8
Programas como funciones 433
Programacién funcional en un lenguaje imperativo 436
Scheme: Un dialecto de LISP 440
ML: Programaci6n funcional con tipificado estitico 453
Evaluacién retrasada 464
Haskell: Un lenguaje perezoso completamente Curry con sobrecarga 469
Las matematicas en la Programacién funcional I: Funciones recursivas 476
Las matemiiticas en la Programaci6n funcional Il: Caleulo lambda 479
Ejercicios 484
Notas y referencias 491
12 Programacién légica 493
12.1 Logica y programas légicos 495
12.2
12.3
Clausulas Hom 498
Resolucién y unificacién 501CONTENIDO ix
12.4 El lenguaje Prolog 505
12.5 _Problemas que se presentan con la programacién Iégica 516
12.6 _Extensién de la programacién légica: programacién Iégica con restricciones
y sistemas basados en ecuaciones _520
Ejercicios 523
Notas y referencias 529
13, Semdntica formal 531
13.1 Pequefio lenguaje de muestra 533
13.2 Seméntica operacional 536
13.3__Seméntica denotacional _546
13.4 Seméntica axiomitica 554
13.5 Pruebas para determinar la correctitud de un programa 560
Ejercicios 563
Notas y referencias 567
14 Programacién en paralelo 569
14.1. Introducci6n al procesamiento en paralelo 571
14.2 Procesamiento en paralelo y lenguajes de programacién 575
14.3 Hilos 582
14.4 Seméforos 590
14.5 Monitores 594
14.6 Paso de mensajes _599
14.7. Paralelismo en lenguajes no imperativos 606
Bjercicios 610
| Notas y referencias 616
Bibliografia 617
Indice alfabético 625Eote libro es una introduccién al amplisimo campo de los lenguajes de programacién. Combina
tuna presentacién general de los principios junto con considerables detalles acerca de los lengua-
jes modernos incluyendo algunos de los mds recientes lerguajes funcionales y los orientados a ob-
jetos. A diferencia de muchos textos introductorios, contiene abundante material sobre problemas
de implementacién, las bases tedricas de los lenguajes de programacién y varios ejercicios. Todas
estas caracteristicas hacen de este libro un puente ditil entre los cursos de compiladores y el estu-
dio te6rico de los lenguajes de programacién. Esta, sin embargo, especificamente diseiiado para un
curso general, aunque avanzado, de lenguajes de programacién y cubre la mayorfa de los requisi-
tos de los lenguajes de programacién especificados en el 2001 ACM/IEEE-CS Joint Curriculum
Task Force Report y el curso CS8 del 1978 ACM Curriculum.
Mis objetivos para esta nueva edicién son poner material especifico del lenguaje acorde
con los cambios ocurridos en la popularidad y uso de los lenguajes de programacién desde la
publicacién de la primera edicin en 1993, expandir y mejorar la cobertura de ciertas dreas, asf
como mejorar la presentacidn y la utilidad de ejemplos y ejercicios conservando al mismo
tiempo, tanto como fue posible, el texto y la organizacién originales.
‘No se espera que los estudiantes conozcan algiin lenguaje en particular. Sin embargo, es ne-
cesaria cierta experiencia con por lo menos un lenguaje, asf como cierto grado de “sofisticacién
computacional” como el que se conseguirfa con un curso en estructuras de datos y con uno so-
bre mateméticas discretas. Los principales lenguajes que se utilizan en esta edicién incluyen C,
C++, Java, Ada, ML, Haskell, Scheme y Prolog; y algunos otros se analizan someramente.
Panorama general y organizacién
En la mayoria de los casos, cada uno de los capitulos es independiente de los demas, pero no se
restringe artficialmente al material incluido en cada uno de ellos. Con el fin de llenar cualquier
vacfo que se pudiera presentar tanto para el estudiante como para el profesor, en caso de que se
haya pasado por alto un capftulo o una seccién en particular, se han previsto referencias cruza-
das a todo lo largo del texto.
El capitulo 1 investiga los conceptos que se estudiardn en capftulos posteriores ¢ introduce
los diferentes paradigmas del lenguaje mediante ejemplos simples con los lenguajes tipicos.
Los capitulos 2 y 3 aportan panoramas generales sobre la historia de los lenguajes de pro-
‘gramaciGn los prineipios de disefio de éstos, respectivamente. El capftulo 3 bien pudiera ser el
culminante del libro, pero me he dado cuenta de que despierta interés en temas posteriores cuan-
do se presenta en este orden.
El capftulo 4 se ocupa con cierto detalle de la sintaxis, i
los diagramas sintécticos. Una breve seccién se ocupa de defi
Juyendo el uso de BNF, EBNF y
jones recursivas (como BNF) co-
xi