PRECIO: $ 749.70

$ 74.97 USD

FICHA TECNICA:

PAGINAS: 1033

AUTOR: AHO, ALFRED V.

TOMOS: 1

CODIGO: PS2332

EDICION:

FECHA ED.: 2008

RESEÑA:

Desde la primera edición de este libro, en 1986, el mundo ha cambiado en forma considerable. Los lenguajes de programación han evolucionado para presentar nuevos problemas de compilación. Las arquitecturas computacionales ofrecen una variedad de recursos, de los cuales el diseñador de compiladores debe sacar ventaja. Tal vez lo más interesante sea que la venerable tecnología de la optimización de código ha encontrado un uso fuera de los compiladores. Ahora se utiliza en herramientas que buscan errores en el software, y lo que es más importante, buscan brechas de seguridad en el código existente. Y gran parte de la tecnología de punta (gramática, expresiones regulares, analizadores y traductores orientados a la sintaxis) tiene todavía un amplio uso.

Por ende, la filosofía que manejamos en la edición anterior de este libro no ha cambiado. Reconocemos que sólo unos cuantos lectores llegarán a crear (o inclusive a mantener) un compilador para un lenguaje de programación importante. Sin embargo, los modelos, la teoría y los algoritmos asociados con un compilador pueden aplicarse a una gran variedad de problemas en el diseño y desarrollo de software. Por lo tanto, destacamos los problemas que se encuentran con más frecuencia durante el diseño de un procesador de lenguaje, sin importar el lenguaje origen ni la máquina de destino.

INDICE:

Prefacio.
Introducción.
  1.1. Procesadores de lenguaje.
  1.2. La estructura de un compilador.
  1.3. La evolución de los lenguajes de programación.
  1.4. La ciencia de construir un compilador.
  1.5. Aplicaciones de la tecnología de compiladores.
  1.6. Fundamentos de los lenguajes de programación.
  1.7. Resumen del capítulo 1.
  1.8. Referencias para el capítulo 1.
2. Un traductor simple orientado a la sintaxis.
  2.1. Introducción.
  2.2. Definición de sintaxis.
  2.3. Traducción orientada a la sintaxis.
  2.4. Análisis sintáctico.
  2.5. Un traductor para las expresiones simples.
  2.6. Análisis léxico.
  2.7. Tablas de símbolos.
  2.8. Generación de código intermedio.
  2.9. Resumen del capítulo 2.
3. Análisis léxico.
  3.1. La función del analizador léxico.
  3.2. Uso de búfer en la entrada.
  3.3. Especificación de los tokens.
  3.4. Reconocimiento de tokens.
  3.5. El generador de analizadores léxicos Lex.
  3.6. Autómatas finitos.
  3.7. De las expresiones regulares a los autómatas.
  3.8. Diseño de un generador de analizadores léxicos.
  3.9. Optimización de los buscadores por concordancia de patrones basados en AFD.
  3.10. Resumen del capítulo 3.
  3.11. Referencias para el capítulo 3.
4. Análisis sintáctico.
  4.1. Introducción.
  4.2. Gramáticas libres de contexto.
  4.3. Escritura de una gramática.
  4.4. Análisis sintáctico descendente.
  4.5. Análisis sintácticos ascendente.
  4.6. Introducción al análisis sintáctico LR: SLR (LR simple).
  4.7. Analizadores sintácticos LR más poderoso.
  4.8. Uso de gramáticas ambiguas.
  4.9. Generadores de analizadores sintácticos.
  4.10. Resumen del capítulo 4.
  4.11. Referencias para el capítulo 4.
5. Traducción orientada por la sintaxis.
  5.1. Definiciones dirigidas por la sintaxis.
  5.2. Órdenes de evaluación para las definiciones dirigidas por la sintaxis.
  5.3. Aplicaciones de la traducción orientada por la sintaxis.
  5.4. Esquemas de traducción orientados por la sintaxis.
  5.5. Implementación de definiciones dirigidas por la sintaxis con atributos.
  5.6. Resumen del capítulo 5.
  5.7. Referencias para el capítulo 5.
6. Generación de código intermedio.
  6.1. Variantes de los árboles sintácticos.
  6.2. Código de tres direcciones.
  6.3. Tipos y declaraciones.
  6.4. Traducción de expresiones.
  6.5. Comprobación de tipos.
  6.6. Flujo de control.
  6.7. Parcheo de retroceso (bakpatch).
  6.8. Instrucciones switch.
  6.9. Código intermedio para procedimientos.
  6.10. Resumen del capítulo 6.
  6.11. Referencias para el capítulo 6.
7. Entornos en tiempo de ejecución.
  7.1. Organización del almacenamiento.
  7.2. Asignación de espacio en la pila.
  7.3. Acceso a los datos no locales en la pila.
  7.4. Administración del montículo.
  7.5. Introducción a la recolección de basura.
  7.6. Introducción a la recolección basada en el rastreo.
  7.7. Recolección de basura de pausa corta.
  7.8. Temas avanzados sobre la recolección de basura.
  7.9. Resumen del capítulo 7.
  7.10. Referencias para el capítulo 7.
8. Generación de código.
  8.1. Cuestiones sobre el diseño de un generador de código.
  8.2. El lenguaje destino.
  8.3. Direcciones en el código destino.
  8.4. Bloques básicos y grafos de flujo.
  8.5. Optimización de los bloques básicos.
  8.6. Un generador de código simple.
  8.7. Optimización de mirilla (peephole).
  8.8. Repartición y asignación de registros.
  8.9. Selección de instrucciones mediante la rescritura de árboles.
  8.10. Generación de código óptimo para las expresiones.
  8.11. Generación de código de programación dinámica.
  8.12. Resumen del capítulo 8.
  8.13. Referencias para el capítulo 8.
9. Optimizaciones independientes de la máquina.
  9.1. Las fuentes principales de optimización.
  9.2. Introducción al análisis del flujo de datos.
  9.3. Fundamentos del análisis del flujo de datos.
  9.4. Propagación de constantes.
  9.5. Eliminación de redundancia parcial.
  9.6. Ciclos en los grafos de flujo.
  9.7. Análisis basado en regiones.
  9.8. Análisis simbólico.
  9.9. Resumen del capítulo 9.
  9.10. Referencias para el capítulo 9.
10. Paralelismo a nivel d e instrucción.
  10.1. Arquitecturas de procesadores.
  10.2. Restricciones de la programación del código.
  10.3. Programación de bloques básicos.
  10.4. Programación de código global.
  10.5. Canalización por software.
  10.6. Resumen del capítulo 10.
  10.7. Referencias para el capítulo 10.
11. Optimización para el paralelismo y la localidad.
  11.1. Conceptos básicos.
  11.2. Multiplicación de matrices: un ejemplo detallado.
  11.3. Espacios de iteraciones.
  11.4. Índices de arreglos afines.
  11.5. Reutilización de datos.
  11.6. Análisis de dependencias de datos de arreglos.
  11.7. Búsqueda del paralelismo sin sincronización.
  11.8. Sincronización entre ciclos paralelos.
  11.9. Canalizaciones.
  11.10. Optimizaciones de localidad.
  11.11. Otros usos de las transformaciones afines.
  11.12. Resumen del capítulo 11.
  11.13. Referencias para el capítulo 11.
12. Análisis interpocedural.
  12.1. Conceptos básicos.
  12.2. ¿Por qué análisis interpocedural?
  12.3. Una representación lógica del flujo de datos.
  12.4. Un algoritmo simple de análisis de apuntadores.
  12.5. Análisis interprocedural insensible al contexto.
  12.6. Análisis de apuntadores sensible al contexto.
  12.7. Implementación en Datalog mediante BDDs.
  12.8. Resumen del capítulo 12.
  12.9. Referencias para el capítulo 12.
A. Un front-end completo.
  A.1. El lenguaje de código fuente.
  A.2. Main.
  A.3. Analizador léxico.
  A.4. Tablas de símbolos y tipos.
  A.5. Código intermedio para las expresiones.
  A.6. Código de salto para las expresiones booleanas.
  A.7. Código intermedio para las instrucciones.
  A.8. Analizador sintáctico.
  A.9. Creación del front-end.
B. Búsqueda de soluciones linealmente independientes.
Índice.