Traducción de un programa a código máquina

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 6,79 KB

 
1.1 ETAPAS EN LA TRADUCCIÓN DE UN PROGRAMA

La traducción es el aspecto más importante en la implementación de un lenguaje:
· puede ser simple como en APL, LISP
· en general es complejo y requiere un buen esfuerzo de implementación.
· se divide en dos partes: Análisis del programa Fuente
Síntesis del programa Objeto


1.4.1 ANÁLISIS DEL PROGRAMA FUENTE

Debe ser laboriosamente construido carácter por carácter durante la traducción

Análisis Léxico (de vocabulario, Scanner)
Fase básica en la cual el programa de entrada es subdividido en sus componentes elementales: identificadores, delimitadores, símbolos, operadores, comentarios, etc.
Se producen "ítems léxicos" o tokens

-----figura 2-----

Token: unidad mínima de expresión del lenguaje

El analizador léxico debe identificar el tipo de cada ítem léxico. Al que le añade un tipo de etiqueta de la forma (t, l) donde t: tabla, l: línea en la tabla donde residen los ítems.
El concepto es simple, pero requiere gran cantidad de tiempo comparada con otras etapas.
Análisis Sintáctico (Parsing o Parser)
Analiza que la estructura sintáctica está correcta en las cadenas de tokens

-----figura 3------

Unidad sintáctica: expresión, sentencia, llamada a subprograma, declaración

En esta etapa se hace uso de las gramáticas que entregan la forma correcta de escribir un lenguaje.
Análisis Semántico
Es quizás la parte central de la traducción.
Aquí las estructuras sintácticas son reconocidas por el analizador sintáctico, son procesadas y la estructura del código ejecutable comienza a tomar forma.
Generalmente, el analizador sintáctico alterna con el analizador semántico. Primero, el analizador sintáctico identifica una secuencia de tokens formando una unidad sintáctica, entonces el analizador semántico es llamado a procesar esta unidad
Comúnmente el analizador sintáctico y el analizador semántico se comunican vía stack.
El analizador semántico se divide en un conjunto de particulares analizadores, cada uno de los cuales maneja un tipo de construcción. Ejemplo declaraciones de arreglos, expresiones aritméticas, sentencias goto, etc.
El analizador semántico apropiado es invocado por el analizador sintáctico, cuando éste ha reconocido una unidad sintáctica.
Los analizadores semánticos interactúan entre ellos a través de información almacenada en varias estructuras de datos, particularmente en una tabla de símbolos. Ejemplo un analizador semántico que procesa el tipo de una variable sólo puede ingresar los tipos declarados en la Tabla de Símbolos. Otro analizador, más tarde, que procesa expresiones aritméticas puede usar los tipos declarados para generar el tipo específico de las operaciones aritméticas para el código objeto.

Otras funciones del Analizador semántico
Mantención de Tablas de Símbolos
Las Tablas son la estructura de datos más importante de un traductor. La Tabla de Símbolos típica contiene una entrada para cada identificador diferente encontrado en el programa. El analizador léxico hace la entrada inicial al efectuar un Scanner sobre el programa. En general, la Tabla de Símbolos contiene información adicional relativa a los atributos del identificador (variable simple, nombre del arreglo, nombre del subprograma, parámetro formal, etc.), tipo de variable (entera, real, etc.,)
Inserción de Información Implícita
Un programa fuente contiene gran información implícita, la que se debe explicitar en el programa objeto. Generalmente, la información implícita es aquella convenida que actúa por defecto.
Detección de Error
El analizador sintáctico y el analizador semántico deben estar preparados para manejar programas escritos correctamente y escritos incorrectamente.
Incorporación de secuencia de llamadas generadas por el compilador para ponerse en contacto con el conjunto de datos externos después de la traducción. Incorporara rutinas de E/S. Estrategia de la secuencia de llamada que permite al S. O. Posponer hasta último momento el trabajo, es decir, tiempo de ejecución.



1.4.2 SINTESIS DEL PROGRAMA OBJETO

Esta etapa dice relación con la construcción del programa ejecutable desde las salidas del analizador semántico.

En esta etapa se genera necesariamente el código que puede incluir una optimización del programa generado.
Si los subprogramas son traducidos separadamente, o si se usa la librería de subprogramas (biblioteca de programas o de rutinas), se necesita una etapa de "linking" y "loading" para producir el programa completo listo para la ejecución.

Optimización
La salida del Analizador Semántico es normalmente un programa en alguna representación interna (código intermedio). Desde esta representación los generadores de código entregan (generan) el código objeto propiamente tal. Sin embargo, antes es recomendable una optimización en orden a detectar paralelismo, operaciones que no es necesario completar, eliminación de instrucciones redundantes para almacenar y/o cargar, etc.

Generación de Código
Esta etapa es relativamente simple. El programa traducido en su representación interna ha sido optimizado y se debe formar el código de máquina que constituye la salida de la traducción.
El código de salida puede ser directamente ejecutado o seguir alguna otra etapa (assembler, "linking" y "loading")

"Linking" y "Loading"
Esta es una etapa final opcional. Aquí las piezas de código resultante de la traducción separada de subprogramas son unidas en un programa ejecutable. La salida consiste típicamente de un programa ejecutable en su forma casi final, excepto donde el programa se refiere a datos externos o a subprogramas. Esta parte incompleta se especifica vía "tablas de carga" producidas por el traductor. Al cargar los distintos segmentos de código traducido en memoria, usa las tablas para rellenar con las direcciones de datos y subprogramas. El resultado es un programa ejecutable listo para su ejecución.