INTRODUCCIÓN A LA TRADUCCIÓN Y ESTRUCTURA DEL COMPILADOR
Compilación dirigida por sintaxis
Es un formalismo para especificar las traducciones para las construcciones en función
de atributos asociados con sus componentes sintácticos.
Es una gramática de contexto libre en la que cada símbolo gramatical (terminales y no terminales) tiene un conjunto de atributos asociados, dividido en dos subconjuntos llamados atributos sintetizados y atributos heredados de dicho símbolo gramatical.
Etapa de analisis
Permite el control del texto fuente evitando errores y
genera las estructuras necesarias para la generación de código.
La etapa de análisis se encuentra dividido en tres fases :
Análisis semántico
Utiliza el árbol sintáctico y la información en la tabla de símbolos para comprobar la consistencia semántica del programa fuente con la definición del lenguaje.
Fase de análisis semántico
Esta fase revisa el árbol sintáctico junto con los atributos y la tabla de
símbolos para tratar de encontrar errores semánticos.
Análisis sintáctico
Es la segunda fase ,trabaja con una gramática de contexto libre y genera el árbol sintáctico que reconoce su sentencia de entrada.
Paso #3
Asing
Asign
+
CTEENT2
IDparcialdos
IDparcialuno
IDsuma
Paso #2 IDsuma ASIGN IDparcialuno ASIGN IDparcialdos ASIGN CTEENT2
Análisis léxico
Se analiza la entrada carácter a carácter, el código se desglosa en tokens, su lectura es de izquierda a derecha.
Paso #1 suma=parcialuno + parcialdos /2; Se agruparían en los componentes léxicos siguientes : 1.El identificador suma 2.El símbolo de asignación '=' 3. El identificador parcialuno 4.El signo suma '+' 5.El identificador parcialdos 6_.El signo de división '/' 7. El numero '2 ' 8. El símbolo de fin de sentencia ';' .
Ejemplo : suma=parcialuno + parcialdos /2;
El objetivo de esta etapa es obtener una representación de la entrada que nos permita realizar
la síntesis o la interpretación con comodidad
Es una traducción que tiene como finalidad “acomodar” el código fuente antes de que éste
sea procesado por el compilador.
Etapa de síntesis
Una vez completada la etapa anterior, el compilador ya se encuentra en disposición de generar el código máquina o llamado programa fuente.
Para ello se parte de las estructuras generadas en dicha etapa anterior: árbol sintáctico y tabla de símbolos.
Fase de generación de código máquina
La fase final de un compilador es la generación de código objeto, que por lo general consiste en código máquina reubicable o código ensamblador. Cada una de las variables usadas por el programa se traduce a una dirección de memoria (esto también se ha podido hacer en la fase de generación de código intermedio)
Fase de optimización de código
Esta fase mejorar el código intermedio, de modo que en la siguiente fase resulte un código de máquina más rápido de ejecutar.
Fase de generación de código intermedio
Después de la etapa de análisis, dicha representación intermedia se puede considerar como un programa para una máquina abstracta.
Cualquier representación intermedia debe tener dos propiedades importantes; debe ser fácil de generar y fácil de traducir al código máquina destino. Así, Representación intermedia puede tener diversas formas.
CONCEPTO DE TRADUCTOR
Se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente hasta un texto o programa escrito en un lenguaje destino.
TIPOS DE TRADUCTORES
Ensambladores y Microensa,bladores
Un ensablador es un compilador sencillo, en el que el lenguaje fuente tiene una estructura sencialla que permite la traduccion de cada sentencia fuente a una unica instruccion en codigo maquina.Ej: Macroensamblador IBM
Interpretes de Comandos
Traduce sentencias simples a invocaciones a una bibioteca, un ejemplo de estos es la shell de Unix o
Preprocesadores
Permiten modificar el programa fuente antes de la verdadera compilación. Hacen uso de macroinstrucciones y directivas de compilación. Por ejemplo podemos nombrar algunos preprocesadores para HTML como lo son: HAML, SLIM o JADE.
Intérpretes
Es parecido a un compilador, solo que a diferencia de este, la salida es una ejecución. En otras palabras traduce de un lenguaje de alto nivel a un lenguaje de máquina.Ej: Google Colab, Replit, Python Tutor y Jupyter.
Compiladores
Es aquel que tiene como entrada una sentencia en lenguaje formal, y como salida tiene un fichero ejecutable. Ej: Netbeans
Traductores de idioma
Traducen de un idioma dado a otro. Por ejemplo del inglés al español. Un ejemplo es Google Traslate
Preprocesamiento
Es una traducción que tiene como finalidad “acomodar” el código fuente antes de que éste
La primera etapa del proceso de compilación se conoce como preprocesamiento
sea procesado por el compilador.
El preprocesador modifica el código fuente según las directivas que haya escrito el programador.
La tabla de símbolos
Posee información sobre los identificadores definidos por el usuario, ya sean constantes, variables, tipos u otros.
Registrar los identificadores de usuario (nombres de variables, de funciones, de tipos, etc.) utilizados en el programa fuente y reunir información sobre los distintos atributos de cada identificador.
Los atributos pueden proporcionar
Su ámbito (la parte del programa donde es visible)
Su tipo
La dirección de memoria en que se almacenará en tiempo de ejecución
Proporcionar información sobre la memoria asignada
Construcción sistemática de compiladores
Se agrupan en una etapa inicial (frontend) y una etapa final (back- end)
La etapa final
Dependen de la máquina destino y que, en general, no dependen del lenguaje fuente sino sólo del lenguaje intermedio
La etapa inicial
Dependen exclusivamente del lenguaje fuente y se integran los
análisis léxicos y sintácticos.
Estructura de un traductor
• Análisis semántico
Comprueba que el programa fuente respeta las directrices del lenguaje que se compila (todo lo relacionado con el significado)
chequeo de tipos, rangos de valores, existencia de variables, etc.
• Análisis sintáctico
Comprueba que la estructura de los componentes básicos sea correcta según las reglas gramaticales del lenguaje que se compila.
• Análisis lexicográfico.
Divide el programa fuente en los componentes básicos del lenguaje a compilar
(números, identificadores de usuario), (variables, constantes, tipos, nombres de procedimientos), (palabras reservadas, signos de puntuación, etc.)
Descompilador
Realiza una labor de traducción inversa (código máquina a lenguaje que lo generó), suele ser una labor casi imposible, por esto, sólo existen descompiladores de aquellos lenguajes en los que existe una relación biyectiva entre el código destino y el código fuente.
Se emplean cuando el compilador no genera código máquina puro, sino pseudocódigo para ser ejecutado a través de un pseudointérprete
Se utilizan especialmente cuando el código máquina ha sido generado con opciones de depuración, y contiene información adicional de ayuda al descubrimiento de errores.
Ejemplo
*puntos de ruptura
*seguimiento de trazas
*opciones de visualización de variables
METACOMPILADOR
Un meta-compilador es un compilador de compiladores. Se pueden dividir en dos , los que trabajan con:
Gramaticas regulares : Recogen los ficheros fuente y lo dividen en palabras.
Gramaticas de contexto libre : Se dedican a reconocer la sintaxis del lenguaje
AUTOCOMPILADOR
Es un compilador escrito en el mismo lenguaje que compila (o parecido).
COMPILACION INCREMENTAL
Cuando se desarrolla un programa fuente, éste se recompila varias veces hasta obtener una versión definitiva libre de errores. Puede funcionar a varios niveles
Nivel de fichero fuente
si la aplicación completa consta de 15 ficheros fuente, y solo se modifica 1( al que le faltaba el ‘;’), sólo se compila aquél al que se le ha añadido el ‘;’, se genera por completo su fichero objeto y luego se enlazan todos juntos para obtener el ejecutable.
Nivel de bloque
si el ‘;’ faltaba en un procedimiento o bloque sólo se
compila ese bloque y se actualiza el fichero objeto.
Nivel de sentencia
si el ‘;’ faltaba en la línea 100 sólo se compila la línea
100 y se actualiza el fichero objeto.
Nivel de caracter
se recompila el ‘;’ y se inserta en el fichero objeto la
sentencia que faltaba.
PASADAS DE COMPILACION
Es el número de veces que un compilador debe leer el programa fuente para generar el código.
COMPILACION , ENLACE Y CARGA
la fase de carga, Este carga el fichero .exe, coloca sus diferentes segmentos en memoria y asigna los registros base a sus posiciones correctas, de manera que las direcciones relativas funcionen correctamente.
la fase de enlace, el enlazador resuelve las referencias cruzadas, que pueden estar declarados en otros ficheros objeto, o en librerías
el compilador no produce directamente un fichero ejecutable, sino que el código generado se estructura en módulos que se almacenan en un fichero objeto.
COMPILADOR CRUZADO
Es un compilador que genera código para ser ejecutado en otra máquina. Se utilizan en la fase de desarrollo de nuevos ordenadores.
CONVERSORES FUENTE-FUENTE
Permiten traducir un lenguaje de alto nivel a otro lenguaje de alto nivel, con lo que se consigue una mayor portabilidad en los programas de alto nivel.