COLECCIÓN: MANUALES DOCENTES UNIVERSITARIOS CONCEPTOS DE LENGUAJES DE PROGRAMACIÓN, N° 13 © de! texto: Francisco Javier Carreras Riudavets Antonio Carlos González Cabrera Zenón Hernández Figueroa Juan Carlos Rodríguez del Pino © de la edición: VICERRECTORADO UNIVERSIDAD DE PLANIrICi\CIÓN y CALIDAD DE DE LAS PALMAS DE GRAN CANARIA, 1.1\ 2006 Maquetación y diseño: Servicio de Publicaciones de la ULPGC ISBN: 84-96502-51-1 Depósito Legal: GC 8-2006 Impresión: Servicio de Reprografía, Encuadernación y Autoedición de la ULPGC Queda rigurosamente prohibida, sin la autorización escrita de los titulares de! «Copyright», bajo las sanciones establecidas por las leyes, la reproducción parcial o total de esta obra por cualquier medio o procedimiento, comprendidos la reprografía y e! tratamiento informático / Indice PRESENTACIÓN 15 INTRODUCCIÓN 17 CAPÍTULO 1. CONCEPTOS GENERALES .21 INTRODUCCIÓN 23 OBJETIVOS 24 1. Definición 24 2. Clasificación según el área de aplicación .26 3. Clasificación según el modelo computacional 27 4. Características y aspectos de diseño 29 4.1. Características de los lenguajes de programación 29 4.2.1. Factores que influyen en el diseño de un lenguaje 32 4.2.2. El dominio de la aplicación 32 4.2.3. Arquitectura 33 del hardware 4.2.4. Las metodologías de programación 5. Alfabeto, léxico y constructores sintácticos 33 34 5.1. Alfabeto 34 5.2. Léxico 35 5.3. Constructores sin tácticos 37 5.3.1. Representación BNF 38 5.3.2. Representación EBNF 38 5.3.3. Diagramas sintácticos 5.3.4. Árboles sin tácticos 6. Semántica de los lenguajes de programación CONCEPTOS DE LENGUAJES DE PROGRAMACIÓN 39 39 .40 5 F j. Carreras Ivudavets, A. C. González Cabrera, Z. H ernández Figueroay j. C. Rodriguez del Pino 6.1. Semántica operacional 6.2. Semántica axiomática .41 .41 6.3. Semántica denotacional .42 6.4. Semántica de especificación .43 7. Métodos de implementación .43 7.1. Interpretación .44 7.2. Compilación .45 7.2.1. Introducción al proceso de compilación .45 8. Breve historia de los lenguajes de programación .47 8.1. El primer lenguaje de alto nivel: Fortran. (1957) .49 8.2. Hacia la sofisticación: 50 Algol 8.3. Simplicidad y tiempo compartido: 8.4. La familia Wirth Basic (1964) 51 52 8.5. Un lenguaje para los negocios: Cobol (1960) 52 8.6. Lenguaje de usos múltiples: PL/I 53 (1965) 8.7. Lenguajes dinámicos primitivos 54 8.8. Un esfuerzo histórico: Ada (1983) 54 8.9. Un lenguaje portable de sistemas: C (1972) 55 8.10. La orientación 55 a objetos enla práctica: C++ (1986) 8.11. Un lenguaje para World Wide Web: Java (1995) 56 8.12. Eiffel (1992) 56 8.13. Un lenguaje funcional: Lisp (1960) 56 8.14. Programación ACTIVID1\DES 57 58 BIBLIOGRAFÍA 59 CAPÍTULO 2. basada en lógica: Prolog (1972) ELEMENTOS BÁSICOS DE LOS LENGUAJESIMPERATIVOS 1 61 INTRODUCCIÓN 63 OBJETIVOS 64 1. Variables 64 1.1. Ligamiento (binding) 1.2. Tipos de datos 66 67 6 CONCEPTOS DE LENGUAJES DE PROGRAMACIÓN Índice 1.2.1. Ligadura estática de tipos 67 1.2.2. Ligadura dinámica de tipos 68 1.2.3. Inferencia de tipos 69 1.2.4. Chequeo de tipos 69 1.3. Ámbito 71 1.4. Tiempo de vida 73 1.4.1. Variables estáticas 74 1.4.2. Variables dinámicas de pila 74 1.4.3. Variables de heap explícitas 75 1.4.4. Variables de heap implícitas 75 1.4.5. Tiempo de vida vs. ámbito 75 1.5. Inicialización 1.6. Constantes 2. EXPRESIONES y de variables 77 con nombre 77 ASIGNACIONES 79 2.1. Clases de expresiones 80 2.1.1. Expresiones aritméticas 80 2.1.2. Expresiones relaciones 80 2.1.3. Expresiones booleanas 80 2.2. Precedencia yasociatividad 2.3. Orden de evaluación de los operandos 2.3.1. Evaluación uniforme 81 82 83 2.3.2. Efectos colaterales 83 2.3.3. Errores en expresiones 84 2.3.4. Expresiones 84 booleanas en cortocircuito 2.4. Sobrecarga de operadores 85 2.5. Conversión 86 de tipos 2.6. Asignación 86 2.6.1. Asignación simple 87 2.6.2. Asignación con múltiples destinos 87 2.6.3. Asignación condicional 87 2.6.4. Operadores de asignación compuestos 87 2.6.5. Operadores de asignación unarios 88 CONCEPTOS DE LENGUAJES DE PROGRAMACIÓN 7 F.]. Carreras fuudavets, A. C. González Cabrera, Z. Hernández Figueroa]j. C. Rodtiguez del Pino 2.6.6. La asignación como una expresión 88 3. Tipos de datos 3.1. Equivalencia 88 de tipos 89 3.1.1. Subtipos y tipos derivados 90 3.1.2. Clasificación de tipos de datos 91 3.2. Tipos primitivos 91 3.2.1. Tipos numéricos 3.2.1.1. Enteros 92 92 3.2.1.2. Coma flotante 93 3.2.1.3. Decimales 93 3.2.1. Tipos lógicos 93 3.2.2. Tipos carácter 94 3.3. Tipos ordinales definidos por el usuario 96 3.4. Tipos estructurados 97 3.4.1. Arrays 98 3.4.1.1. Tipo y rango de los subíndices 99 3.4.1.2. Operaciones 100 3.4.2. Registros 3.4.3. Uniones 100 102 3.4.4. Punteros 104 3.4.4.1. Problemas con el uso de punteros 105 3.4.4.2. Soluciones a los problemas de punteros colgantes 3.4.4.3. Soluciones a los problemas de los objetos perdidos ACTIVIDADES 107 .. 108 110 111 BIBLIOGRAFÍA CAPÍTULO 3. ELEMENTOS BÁSICOS DE LOS LENGUAJES IMPERATIVOS 11 .. 113 INTRODUCCIÓN 115 OBJETIVOS 116 1. Sentencias de control del flujo de ejecución 116 1.1. Sentencias compuestas 1.2. Sentencias de selección 117 117 8 CONCEPTOS DE LENGUAJES DE PROGRAMACIÓN Índice 1.3. Selección unaria/binaria ' 118 1.3.1. Selección múltiple 119 1.3.2. Sentencias de repetición 122 1.3.3. Bucles controlados 122 por contadores 1.3.4. Bucles con control lógico 124 1.3.5. Bucles con localización de control definida por el usuario 1.4. Sentencias de salto incondicional 125 125 1.4.1. Sentencia GOTO 125 1.4.2. Sentencias de control de bucle 126 1.5. Guardas 127 2. Subpropramas 128 2.1. Conceptos básicos 129 2.1.1. Parámetros 129 2.1.2. Temas de diseño 130 2.1.3. Métodos de paso de parámetros 131 2.1.4. Paso de parámetros por valor 132 2.1.5. Paso de parámetros por resultado 132 2.1.6. Paso de parámetros por valor-resultado 133 2.1.7. Paso de parámetros por referencia 133 2.1.8. Paso de parámetros por nombre 134 2.1.9. Ejemplo de paso de parámetros 135 2.1.10. Métodos de paso de parámetros en los principales lenguajes .. 136 2.1.11. Comprobación del tipo de los parámetros 137 2.1.12. Paso de matrices como parámetros 137 2.1.13. Nombres 140 de subprogramas 2.1.14. Comprobación 2.1.15. Entorno como parámetros de parámetros referencial 140 .141 2.1.16. Sobrecarga de subprogramas 142 2.1.17. Sobrecarga .143 de operadores 2.1.18. Subprogramas 2.1.19. Compilación genéricos separada vs. independiente 2.1.20. Acceso a entornos CONCEPTOS DE LENGUAJES por el usuario no locales DE PROGRAMACIÓN 144 .145 146 9 F]. Carreras Riudavets, A. C. González Cabrera, Z. Hernández Figueroay]. C. Rodriguez del Pino 2.1.21. Corrutinas .147 3. Manejo de excepciones 147 3.1. Conceptos básicos 3.2. Consideraciones de diseño 148 149 3.3. Manejo de excepciones en Ada 149 3.4. Enlace de la excepción al manejador 3.5. Continuación 150 150 3.6. Excepciones predefinidas enAda 151 3.7. Manejo de excepciones en C++ 152 3.8. Manejo de excepciones en Java ACTIVIDADES 154 156 BIBLIOGRAFÍA 159 CAPÍTULO 4. TIPOS ABSTRACTOS DE DATOS Y PROGRAMACIÓN 161 163 ORIENTADAAOB]ETOS INTRODUCCIÓN 1. Abstracción 164 164 2. Encapsulación 165 3. Diseño de lenguajes con soporte para tipos abstractos 3.1. Ejemplo de un tipo abstracto de dato: PILA 3.2. Decisiones de diseño 167 169 170 OBJETIVOS 3.3. Ejemplos de lenguajes con soporte de tipos abstractos de datos .. 170 4. 3.4. Tipos abstractos de datos en Ada 171 3.5. Tipos abstractos de datos en C+ + 174 3.6. Tipos abstractos de datos en Java 178 3.7. Tipos abstractos de datos parametrizados .. : 3.8. Tipos abstractos de datos parametrizados en Ada 180 180 3.9. Tipos abstractos de datos parametrizados en C++ 181 3.10. Tipos abstractos de datos parametrizados en Java 183 Introducción a la programación orientada a objetos 4.1. Herencia 183 184 10 CONCEPTOS DE LENGUAJES DE PROGRAMACIÓN Índice 4.2. Polimorfismo y ligadura dinámica 4.3. Diseño de lenguajes orientados 186 a objetos 187 4.4. ¿Todos objetos? 187 4.5. ¿Son las subclases subtipos? 187 4.6. Herencia de interfaz y de implementación 188 4.7. Comprobación 189 de tipos y polimorfismo 4.8. Herencia simple o múltiple 189 4.9. Creación y destrucción 190 de objetos 4.10. Enlace estático y dinámico 5. Ejemplos de lenguajes con orientación 190 a objetos 191 5.1. Programación orientada a objetos en C++ .191 5.2. Características 5.3. Herencia generales 191 192 5.4. Ligadura dinámica 5.5. Evaluación 195 196 5.6. Programación 197 5.7. Conceptos 5.8. Herencia orientada a objetos en Java generales y ligadura dinámica 5.9. Polimorfismo 5.10. Evaluación 5.11. Programación 5.12. Conceptos 5.13. Herencia orientada a objetos en Ada 95 generales .201 201 202 202 203 ACTIVIDADES 203 206 BIBLIOGRAFÍA 208 5.14. Polimorfismo CAPÍTULO 5. y ligadura dinámica 197 200 CONCURRENCIA 209 INTRODUCCIÓN 211 OBJETIVOS 212 1. Conceptos 2. Semáforos fundamentales 212 216 11 CONCEPTOS DE LENGUAJES DE PROGRAMACiÓN F j. Carreras Riudavets, A. C. González Cabrera, Z. Hernández Figueroay j. C. Rodríguez del Pino 3. Monitores 219 4. Paso de mensajes 223 4.1. Modelo de paso de mensajes en Ada83 223 4.2. Creación y activación de tareas 4.3. Terminación de tareas 225 226 4.4. Rendezvous .226 4.5. Sincroruzación cooperativa 228 4.6. Sincronización competitiva 4.7. Semáforo binario .228 .230 5. Concurrencia en Ada95 231 5.1. Objetos protegidos 231 6. Concurrencia en Java 6.1. Sincronización 6.2. Notifj; y 233 en Java 236 wait 237 6.3. Ejemplo tareas: productor-consumidor ACTIVIDADES 238 .241 BIBLIOGRAFÍA .244 CAPÍTULO 6. FUNCIONAL INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN .245 Y LÓGICA INTRODUCCIÓN .247 OBJETIVOS 249 1. Funciones matemáticas 249 1.1. Funciones simples 250 1.2. Funciones de orden superior .251 2. Fundamentos de la programación funcional 251 3. Lisp 252 3.1. Tipos de datos y estructuras 3.2. Primer intérprete 4. Scheme 4.1. Funciones 4.2. Eval 253 de Lisp 254 255 primitivas 256 257 12 CONCEPTOS DE LENGUAJES DE PROGRAMACIÓN Índice 4.3. Quote 258 4.4. Funciones para manipular listas 258 4.5. Expresiones 4.6. Funciones condicionales: de comparación eq?, null? y list? 260 aritméticas 261 4.7. Salida 261 4.8. Funciones para construir funciones 262 4.9. Definir funciones .262 4.10. Control del flujo 264 4.11. Ejemplos en lenguaje Scheme 265 4.12. Funciones de orden superior 266 4.13. Función "aplica-a-todo" .266 4.14. Funciones 267 que crean código 5. Otros lenguajes funcionales 5.1. Common 268 Lisp 268 5.2. ML 268 5.3. Tipos de datos primitivos 269 5.4. Tipos de datos estructurados 270 5.5. Definición de tipos .271 5.6. Funciones primitivas 272 5.7. Val 272 5.8. Funciones para manipular listas 272 5.9. Funciones para construir 273 funciones 5.10. Control de flujo 274 5.11. Ejemplos en ML 274 5.12. Haskell 275 5.13. Aplicaciones 6. Introducción de los lenguajes funcionales al cálculo de predicados 6.1. Proposiciones 6.2. Proposiciones compuestas 280 281 de teoremas 8. Prolog CONCEPTOS 279 279 6.3. Cláusulas 7. Demostración 278 282 284 DE LENGUAJES DE PROGRAMACIÓN 13 F. J. Carreras Riudavets, A. C. González Cabrera, Z. H ernández fzgueroa y J. C. Rodríguez del Pino 8.1. Elementos básicos de Prolog 8.1.1. Términos .285 .285 8.1.2. Declaración de hechos 286 8.1.3. Declaración 8.1.4. Declaración de reglas de meta 286 .287 8.1.5. El proceso de inferencia en Prolog 288 8.1.6. Aritmética 290 simple 8.1. 7. Comparación 8.1.8. Depurado aritmética 291 en Prolog 292 8.1. 9. Tipos de datos estructurados .292 8.2. Deficiencias de Prolog 8.2.1. Control del orden de resolución 294 294 8.2.2. El operador "cut" 8.2.3. Un mundo cerrado 295 297 8.2.4. El problema de la negación 8.2.5. Limitaciones intrínsecas 297 .298 i\CTIVIDADES 300 BIBLIOGRAFÍA 308 GLOSARIO 309 CONCEPTOS DE LENGUAJES DE PROGRAMACIÓN