Tema 1: Introducción Procesamiento de Lenguajes Dept. de Lenguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de Lenguajes Tema 1: Introducción 1 / 12 Definición de compilador Un compilador es un programa que traduce de un lenguaje fuente (normalmente un lenguaje de programación de alto nivel) a un lenguaje objeto (normalmente código máquina) IMPORTANTE: un compilador es un traductor Un IDE (Integrated Development Environment) no es un compilador, un IDE suele tener un buen editor, y llama al compilador y enlazador, y suele integrar un depurador. Procesamiento de Lenguajes Tema 1: Introducción 2 / 12 Tipos de procesadores de lenguaje L ENGUAJE FUENTE L ENGUAJE OBJETO traductor/conversor alto alto compilador alto bajo ensamblador medio/bajo bajo preprocesador alto alto intérprete alto medio (*) (*) la mayoría de los intérpretes actuales precompilan el programa fuente y generan un código intermedio Procesamiento de Lenguajes Tema 1: Introducción 3 / 12 ¿Qué vamos a estudiar? Las técnicas y algoritmos que vamos a estudiar se aplican al diseño de compiladores, pero se pueden aplicar en otras tareas que requieran el procesamiento y/o traducción de lenguajes informáticos: I I I I I Traductores automáticos de lenguajes humanos (ejemplo: interNOSTRUM, Apertium, . . .) Visores de PDF (evince, acroread, . . .) Navegadores web (Firefox, Chrome, . . .) Ficheros de configuración (.ini . . .) ... Procesamiento de Lenguajes Tema 1: Introducción 4 / 12 Historia de los compiladores Los primeros compiladores eran humanos: http://eltamiz.com/elcedazo/2009/02/17/historia-de-un-viejo-informatico-elmetodo-de-trabajo-en-proceso-de-datos-en-la-decada-de-los-setenta/ Los primeros compiladores no humanos eran compiladores cruzados (cross-compilers): en una máquina se generaba código para ser ejecutado en otra máquina. Cuando se diseñaba una nueva arquitectura, lo primero que se hacía era diseñar un cross-compiler en una arquitectura conocida, para poder compilar el compilador nativo en la nueva arquitectura. Procesamiento de Lenguajes Tema 1: Introducción 5 / 12 Diseño de compiladores C 8086 C++ RISC Pascal 68000 FORTRAN ... Cobol ... Ada ... ... ... N lenguajes fuente M lenguajes objeto NxM compiladores Procesamiento de Lenguajes Tema 1: Introducción 6 / 12 Código intermedio FRONT END BACK END C 8086 C++ RISC Pascal FORTRAN Código Intermedio 68000 ... Cobol ... Ada ... ... ... N lenguajes fuente M lenguajes objeto N front end + M back end Procesamiento de Lenguajes Tema 1: Introducción 7 / 12 Código intermedio (mundo real) FRONT END BACK END C 8086 C++ Código Intermedio 1 RISC Pascal Código Intermedio 2 68000 FORTRAN Cobol Ada Código Intermedio 3 ... ... Procesamiento de Lenguajes ... ... ... ... Tema 1: Introducción 8 / 12 Fases de un compilador Internamente, un compilador se organiza en varias fases o partes que interaccionan entre sí: 1 2 3 4 5 6 7 8 9 Análisis léxico Análisis sintáctico Análisis semántico Gestión de errores Tabla de símbolos Generación de código intermedio Optimización de código intermedio Generación de código objeto Optimización de código objeto Procesamiento de Lenguajes Tema 1: Introducción 9 / 12 Estructura estándar de un compilador Gestión errores Tab.Símbolos A. Semántico Programa fuente A. Léxico A. Sintáctico Generación Cód. Intermedio FRONT END Programa Cód.Intermedio Optimización Código Intermedio Generación Código Objeto BACK END Optimización Código Objeto Programa Cód. Objeto Procesamiento de Lenguajes Tema 1: Introducción 10 / 12 ¿Cómo se especifica un traductor/compilador? Especificación léxica: expresiones regulares, AFD, diagramas de transiciones Especificación sintáctica: gramáticas independientes del contexto Especificación semántica: sistema de tipos, restricciones semánticas Especificación de la traducción: gramáticas de atributos, DDS, ETDS ... Procesamiento de Lenguajes Tema 1: Introducción 11 / 12 Ejemplo de traducción 2+35*4 2-3/(4+5*6) 2-3+4 2-3+4-5 suma(2,prod(35,4)) resta(2,div(3,suma(4,prod(5,6)))) suma(resta(2,3),4) resta(suma(resta(2,3),4),5) Hay dos formas de resolver este problema: 1 A mano (difícil) 2 Utilizando técnicas para el diseño de compiladores: análisis léxico, análisis sintáctico, traducción dirigida por la sintaxis (chupao) Procesamiento de Lenguajes Tema 1: Introducción 12 / 12