Inicio Anterior Siguiente

Compiladores
Estructura y Funcionamiento
Compilador



Compiladores


Lenguajes de Programación
Un lenguaje de programación está formado por un conjunto de símbolos básicos (alfabeto) y un conjunto de reglas que especifican como manipularlos. También debe darle significado a las cadenas formadas al manipular los símbolos básicos.
Los lenguajes de programación pueden clasificarse de acuerdo a su semejanza con el lenguajes maquina o a su semejanza con el lenguaje humano (generalmente inglés).
Los lenguajes que tiene mayor semejanza con el lenguaje humano se les llama lenguajes de alto nivel, mientras que los lenguajes más parecidos al lenguaje de maquina son conocidos como de bajo nivel.
Entre los lenguajes de bajo nivel se encuentra el lenguajes ensamblador.

Algunos ejemplos de lenguajes de alto nivel son:

  • Algol
  • Basic
  • C
  • Cobol
  • Fortran
  • Modula 2
  • Pascal
  • Prolog


Traductores
Un traductor es un programa que recibe como entrada código escrito en un cierto lenguaje y produce como salida código en otro lenguaje. Generalmente el lenguaje de entrada es de más alto nivel que el de salida. Ejemplos de traductores son los ensambladores y los compiladores.
Un ensamblador es un programa que traduce de un lenguaje ensamblador a lenguaje máquina, mientras que un compilador es un programa que traduce de un lenguaje de alto nivel a un lenguaje de bajo nivel o a lenguaje máquina.
Un traductor es un programa que toma el texto escrito en un lenguaje (el lenguaje fuente) y lo convierte en el texto equivalente en un segundo lenguaje (el lenguaje destino u objeto).
Si el fuente es un lenguaje abstracto o de alto nivel y si el objetivo es un lenguaje de ensamble de bajo nivel o de máquina, el traductor es un compilador.

Diseño de lenguajes

El lenguaje de programación puede definirse al describir

1. Lo que parecen sus programas (la sintaxis del lenguaje)

2. lo que significan sus programas (la semántica del lenguaje).

La sintaxis del lenguaje se presenta ampliamente con una notación denominada gramática libre de contexto o BNF. (Backus-Naur Form).
La semántica del lenguaje es más difícil de expresar que la sintaxis y generalmente se decide por especificarla usando descripciones informales y ejemplos.
Ambas situaciones deben ser consideradas por quien diseña un nuevo lenguaje para satisfacer las necesidades de los usuarios potenciales. Por ejemplo, alguien puede hacer el siguiente requerimiento:

Estructura de un Compilador.



Cualquier compilador debe realizar dos tareas principales: análisis del programa a compilar y síntesis de un programa en lenguaje maquina que, cuando se ejecute, realizara correctamente las actividades descritas en el programa fuente. Para el estudio de un compilador, es necesario dividir su trabajo en fases. Cada fase representa una transformación al código fuente para obtener el código objeto. La siguiente figura representa los componentes en que se divide un compilador. Las tres primeras fases realizan la tarea de análisis, y las demás la síntesis. En cada una de las fases se utiliza un administrador de la tabla de símbolos y un manejador de errores.

Análisis Léxico.
En la fase de análisis léxico se leen los caracteres del programa fuente y se agrupan en cadenas que representan los componentes léxicos. Cada componente léxico es una secuencia lógicamente coherente de caracteres relativa a un identificador, una palabra reservada, un operador o un carácter de puntuación. A la secuencia de caracteres que representa un componente léxico se le llama lexema (o con su nombre en inglés token). En el caso de los identificadores creados por el programador no solo se genera un componente léxico, sino que se genera otro lexema en la tabla de símbolos.

Análisis Sintáctico.
En esta fase, los componentes léxicos se agrupan en frases gramaticales que el compilador utiliza para sintetizar la salida.

Análisis Semántico.
La fase de análisis semántico se intenta detectar instrucciones que tengan la estructura sintáctica correcta, pero que no tengan significado para la operación implicada.

Generación de código Intermedio.
Algunos compiladores generan una representación intermedia explícita del programa fuente, una vez que se han realizado las fases de análisis. Se puede considerar esta operación intermedia como un subprograma para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes: debe ser fácil de producir y fácil de traducir al programa objeto.

Optimización de Código.
En esta fase se trata de mejorar el código intermedio, de modo que resulte un código de máquina más rápido de ejecutar.

Generación de Código.
Esta constituye la fase final de un compilador. En ella se genera el código objeto que por lo general consiste en código en lenguaje máquina (código relocalizable) o código en lenguaje ensamblador.

Administrador de la tabla de símbolos.
Una tabla de símbolos es una estructura de datos que contiene un registro por cada identificador. El registro incluye los campos para los atributos del identificador. El administrador de la tabla de símbolos se encarga de manejar los accesos a la tabla de símbolos, en cada una de las etapas de compilación de un programa.

Manejador de errores.
En cada fase del proceso de compilación es posibles encontrar errores. Es conveniente que el tratamiento de los errores se haga de manera centralizada a través de un manejador de errores. De esta forma podrán controlarse más eficientemente los errores encontrados en cada una de las fases de la compilación de un programa.

Este es el proceso estandar que un compilador comercial sigue para cualquier programa.... .











Actualizado: 5 de junio 2004....

[Arriba]



©2004 Alfonso Araujo Cárdenas - Derechos reservados