Com Pi Lad Ores

Embed Size (px)

Citation preview

COMPILADORES

IntroduccinHistoria de los compiladores 1946, se desarrolla el primer ordenador digital (lenguaje de mquina)

M.C. Hilda Castillo Zacatelco BUAP

1950, John Backus dirige una investigacin en IBM en un lenguaje algebraico 1954, se comienza a desarrollar FORTRAN 1957, FORTRAN se utiliza en la IBM modelo 704 Surge el concepto traductor El primer compilador de FORTRAN tard 18 aos-persona en realizarse FORTRAN era dependiente de la mquina Paralelamente al desarrollo de FORTRAN en Amrica, en Europa surge una corriente que pretende que los lenguajes fuesen independientes de la mquina, esta corriente estaba influida por los trabajos sobre GLC de Chomsky Surge un grupo Europeo encabezado por F.L. Bauer, en la que particip ACM y John Backus. De este grupo surge un informe que define un Lenguaje Algebraico Internacional, publicado en Zurich en 1958 1969, aparece Algol 60 Junto con los lenguajes tambin la tcnica de los compiladores avanza

COMPILADORES

IntroduccinHistoria de los compiladores

M.C. Hilda Castillo Zacatelco BUAP

1958, Strong y otros proponen una solucin al problema de que un compilador fuera portable, y esta era dividir al compilador en dos fases front end (analiza el programa fuente) y back end (genera cdigo objeto para la mquina objeto). El puente de unin era un lenguaje intermedio denominado UNCOL (no funcion) 1959, Rabin y Scott proponen el empleo de AFD y AFN para el reconocimiento lexicogrfico de los lenguajes Aparece BNF (Backus-1960, Naur-1963, Knuth-1964) como una gua para el desarrollo del anlisis sintctico 1959, Sheridan describe un mtodo de parsing de FORTRAN para introducir parntesis en una expresin En los 60s se desarrollan diversos mtodos de parsers ascendentes y descendentes

COMPILADORES

IntroduccinHistoria de los compiladores

M.C. Hilda Castillo Zacatelco BUAP

Floyd ms adelante introduce la tcnica de precedencia de operadores y uso de funciones de precedencia 1961, se usa por primera vez un parsing descendente recursivo En los 60s se estudia el paso de parmetros por nombre, valor y referencia y se incluyen los procedimientos recursivos para Algol 60 Se desarrolla la localizacin dinmica de datos 1968, se estudia y definen las GLC, los parsers predictivos y la eliminacin de recursividad izquierda 1975, aparece LEX generador automtico de analizadores lxicos a partir de expresiones regulares bajo UNIX A mitad de los 70s Johnson crea YACC para UNIX (generador de analizadores sintcticos) Ahora un compilador de divide en varias varias El ltimo lenguaje de programacin de amplia aceptacin es JAVA (es interpretado)

COMPILADORES

Introduccin

M.C. Hilda Castillo Zacatelco BUAP

Conceptos BsicosTraductor. Cualquier programa que toma como entrada un texto escrito en un lenguaje llamado fuente y da como salida un programa equivalente en otro lenguaje, el lenguaje objeto. Si el lenguaje fuente de un lenguaje de programacin de alto nivel y el objeto un lenguaje de bajo nivel (ensamblador o cdigo de mquina), al traductor se le denomina compilador. Ensamblador. Es un programa traductor cuyo lenguaje fuente es el lenguaje ensamblador. Intrprete. Es un programa que no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel y la traduce al cdigo equivalente y al mismo tiempo lo ejecuta. En un principio debido a la escasez de memoria se utilizaban ms los intrpretes, ahora se usan ms los compiladores (a excepcin de JAVA)

COMPILADORES

IntroduccinConceptos bsicosVentajas de compilar vs a interpretar Se compila una vez, se ejecuta n veces

M.C. Hilda Castillo Zacatelco BUAP

En ciclos, la compilacin genera cdigo equivalente, interpretndolo se traduce tantas veces una lnea como veces se repite el ciclo El compilador tiene un visin global del programa

Ventajas del intrprete vs el compilador Un intrprete necesita menos memoria que un compilador Permiten una mayor interactividad con el cdigo en tiempo de desarrollo

COMPILADORES

Introduccin

M.C. Hilda Castillo Zacatelco BUAP

Programas que el compilador necesita para obtener un programa ejecutablePreprocesador Ligador Cargador Depurador Ensamblador

Tipos de compiladoresDe una pasada De mltiples pasadas De carga y ejecucin De depuracin

COMPILADORES

IntroduccinDe optimizacin Ensamblador Compilador cruzado Compilador con montador Autocompilador Metacompilador Descompilador

M.C. Hilda Castillo Zacatelco BUAP

Modelo de anlisis y sntesis de la compilacinPartes en la que est dividida la compilacin: anlisis y sntesisLa sntesis es la que requiere las tcnicas ms especializadas.

COMPILADORES

Introduccin

M.C. Hilda Castillo Zacatelco BUAP

Herramientas de software que realizan algn tipo de anlisis a los programas fuente que manipulan: Editores de estructuras Impresoras estticas Verificadores estticos Intrpretes La tecnologa de compiladores se aplica en otros lugares, en especial la parte de anlisis de los siguientes ejemplos es parecida a la de un compilador convenvcional: Formadores de Texto . P/E TEX Compiladores de circuitos de silicio Intrpretes de consultas

COMPILADORES

IntroduccinEstructura de un compilador

M.C. Hilda Castillo Zacatelco BUAP

Para la realizacin del proceso de traduccin es necesario dividir el compilador en varias fases.Programa fuente Anlisis lxico Anlisis sintctico Manejo de la Tabla de smbolos Anlisis semntico Generacin de cdigo intermedio Optimizacin de cdigo Generacin de cdigo Programa objeto Manejo de errores

COMPILADORES

IntroduccinAntes Una computadora no tena memoria suficiente Se tuvo que dividir al compilador en fases Cada fase lea un archivo y produca otro Actualmente Se tiene memoria suficiente

M.C. Hilda Castillo Zacatelco BUAP

El tamao del archivo ejecutable es relativamente pequeo Se han reducido el nmero de pasadas y el nmero de archivos que se tienen que leer y escribir Las fases de un compilador se agrupan en dos partes o etapas:Anlisis lxico (lineal) Optimizacin de cdigo Generacin de cdigo intermedio Generacin de cdigo Anlisis sintctico (jerrquico) Anlisis semntico Back end (sntesis) Front end (anlisis)

COMPILADORES

IntroduccinFront end Dependiente del lenguaje fuente

M.C. Hilda Castillo Zacatelco BUAP

Independiente de la mquina objeto para la que se va a generar cdigo Back end Independiente del lenguaje objeto Dependiente del lenguaje objeto Anlisis lxico Tambin llamado exploracin o scanner. Lee caracteres uno a uno desde la entrada y va formando grupos de caracteres con alguna relacin entre s llamados tokens, los que sern la entrada para la siguiente etapa del compilador. Tipos de tokens: Tiras especficas Tiras no especficas

COMPILADORES

IntroduccinComponentes de un token Tipo Valor Las tiras especficas solo tienen tipo. Anlisis sintctico (parser)

M.C. Hilda Castillo Zacatelco BUAP

Recibe como entrada los tokens que le pasa el analizados lxico y comprueba si estos van llegando en el orden correcto. Su salida terica sera un rbol sintctico. Sus funciones son: Aceptar lo que es vlido sintcticamente y rechazar lo que no lo es Hacer explcito el orden jerrquico que tienen los operadores en el lenguaje de que se trate Guiar el proceso de traduccin (traduccin dirigida por sintaxis)

COMPILADORES

Introduccin

M.C. Hilda Castillo Zacatelco BUAP

Un factor de divisin entre el anlisis lxico y sintctico es la recursin. Anlisis semntico Es ms difcil de formalizar que el sintctico. Este trata de encontrar errores semnticos y reunir informacin sobre los tipos para la fase de generacin de cdigo, realizar verificacin de tipos. En definitiva comprobar que el significado de lo que va leyendo es vlido. La salida terica ser un rbol semntico. Ejemplo:int i,j,k; char s[10]; s=i+j*k; Anlisis Lxico: Devuelve secuencia de tokens. tipo id coma id coma id coma puntoycoma tipo id cora entero corc puntoycoma id asignacin id suma id multiplicacin id puntoycoma

Anlisis sintctico: El orden de los tokens es vlido Anlisis semntico: Tipo de variables asignadas incorrecta

COMPILADORES

IntroduccinGeneracin de cdigo intermedio

M.C. Hilda Castillo Zacatelco BUAP

Transforma un rbol sintctico (semntico) en un representacin en un lenguaje intermedio, que suele ser cdigo sencillo que despus se convertir en cdigo de mquina. Propiedades de la representacin intermedia: Debe ser fcil de producir Debe ser fcil de traducir al programa objeto Un formato de cdigo intermedio es el cdigo de tres direcciones. Forma: A:= B op C, donde A,B,C son operandos y op es un operador binario Se permiten condicionales simples simples y saltos.P/E while (a >0) and (b0) goto L2 L4: t1:=b*a goto L3 t2:=t1-10 L2: t1:=a*4 a:=t2 t2:=t1-5 goto L1 if (b < t2) goto L4 L3: . goto L3

COMPILADORES

IntroduccinOptimizacin de cdigo

M.C. Hilda Castillo Zacatelco BUAP

Trata de conseguir que el programa objeto sea ms rpido en la ejecucin y que necesite menos memoria a la hora de ejecutarse.(No todos los compiladores llevan a cabo esta etapa) Posibles optimizaciones locales: Cuando hay dos saltos seguidos se puede quedar uno soloP/E El ejemplo anterior quedara as: L1: if (a= t2) goto L3 t1:=b*a t2:=t1-10 a:=t2 goto L1 L3: . b:=t1+e

Eliminar expresiones comunes en favor de una sola expresina:=b+c+d Quedara t1:=b+c b:=b+c+e a:=t1+d

COMPILADORES

IntroduccinOptimizacin de bucles y lazos (sacar expresiones invariantes)P/E Repeat x:=3; y:=y-x*2; until y MIENTRAS expresion REPITE orden FMIENTRAS -> REPITE orden HASTA QUE expresion FREPITE

M.C. Hilda Castillo Zacatelco BUAP

En el caso de MIENTRAS-REPITE:1 Evaluar expresin si 2 Falsa? no Orden

Iteracion -> MIENTRAS (1) expresion (2) REPITE orden FMIENTRAS (3) (1) inicio_mientras=Genera_etiqueta(); fin_mientras=Genera_etiqueta(); Escribe(inicio_mientras,:); (2) Escribe(CMP, Expresion.I,0); Escribe(JZ,fin_mientras); (3) Escribe(JMP,inicio_mientras); Escribe(fin_mientras,:);

Inicio_mientras Cdigo de expresin CMP Expresin,0 JZ fin_mientras Cdigo de orden JMP inicio_mientras Fin_mientras

3

COMPILADORESM.C. Hilda Castillo Zacatelco BUAP

Cdigo intermedioEn el caso de REPITE-HASTA:

Iteracion -> REPITE (1) orden HASTA QUE expresion (2) FREPITE

(1) inicio_repite=Genera_etiqueta(); Escribe(inicio_repite,:); (2) Escribe(CMP, Expresion.I,0); Escribe(JZ,inicio_repite);