INTRODUCCIÓN A LA TRADUCCIÓN Y ESTRUCTURA DEL COMPILADOR

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.

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.

COMPILACION , ENLACE Y CARGA

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.

la fase de enlace, el enlazador resuelve las referencias cruzadas, que pueden estar declarados en otros ficheros objeto, o en librerías

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.

PASADAS DE COMPILACION

Es el número de veces que un compilador debe leer el programa fuente para generar el código.

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 caracter

se recompila el ‘;’ y se inserta en el fichero objeto la
sentencia que faltaba.

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 bloque

si el ‘;’ faltaba en un procedimiento o bloque sólo se
compila ese bloque y se actualiza el fichero objeto.

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.

AUTOCOMPILADOR

Es un compilador escrito en el mismo lenguaje que compila (o parecido).

METACOMPILADOR

Un meta-compilador es un compilador de compiladores. Se pueden dividir en dos , los que trabajan con:

Gramaticas de contexto libre : Se dedican a reconocer la sintaxis del lenguaje

Gramaticas regulares : Recogen los ficheros fuente y lo dividen en palabras.

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 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

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

Estructura de un traductor

• 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.)

• 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 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.

Construcción sistemática de compiladores

Se agrupan en una etapa inicial (frontend) y una etapa final (back- end)

La etapa inicial

Dependen exclusivamente del lenguaje fuente y se integran los
análisis léxicos y sintácticos.

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 tabla de símbolos

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

Proporcionar información sobre la memoria asignada

La dirección de memoria en que se almacenará en tiempo de ejecución

Su tipo

Su ámbito (la parte del programa donde es visible)

Posee información sobre los identificadores definidos por el usuario, ya sean constantes, variables, tipos u otros.

sea procesado por el compilador.

El preprocesador modifica el código fuente según las directivas que haya escrito el programador.

Preprocesamiento

La primera etapa del proceso de compilación se conoce como preprocesamiento

Es una traducción que tiene como finalidad “acomodar” el código fuente antes de que éste

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

Traductores de idioma

Traducen de un idioma dado a otro. Por ejemplo del inglés al español. Un ejemplo es Google Traslate

Compiladores

Es aquel que tiene como entrada una sentencia en lenguaje formal, y como salida tiene un fichero ejecutable. Ej: Netbeans

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.

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.

Interpretes de Comandos

Traduce sentencias simples a invocaciones a una bibioteca, un ejemplo de estos es la shell de Unix o

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

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 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.

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 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)

Preprocesamiento

La primera etapa del proceso de compilación se conoce como preprocesamiento

Es una traducción que tiene como finalidad “acomodar” el código fuente antes de que éste
sea procesado por el compilador.

El preprocesador modifica el código fuente según las directivas que haya escrito el programador.

Etapa de analisis

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

La etapa de análisis se encuentra dividido en tres fases :

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.

Ejemplo : suma=parcialuno + parcialdos /2;

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 ';' .

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 #2 IDsuma ASIGN IDparcialuno ASIGN IDparcialdos ASIGN CTEENT2

Paso #3

Asing

IDsuma

Asign

IDparcialuno

+

IDparcialdos

CTEENT2

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.

Permite el control del texto fuente evitando errores y
genera las estructuras necesarias para la generación de código.

Compilación dirigida por sintaxis

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.

Es un formalismo para especificar las traducciones para las construcciones en función
de atributos asociados con sus componentes sintácticos.