Está en la página 1de 5

PROGRAMACIN II

WORK PAPER #3
COMPILADOR

Un compilador es un programa informtico que traduce un programa escrito en un lenguaje de


programacin a otro lenguaje de programacin, generando un programa equivalente que la
mquina ser capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de mquina,
pero tambin puede ser un cdigo intermedio (bytecode), o simplemente texto. Este proceso de
traduccin se conoce como compilacin.
Un compilador es un programa que permite traducir el cdigo fuente de un programa en lenguaje
de alto nivel, a otro lenguaje de nivel inferior (tpicamente lenguaje de mquina). De esta manera
un programador puede disear un programa en un lenguaje mucho ms cercano a cmo piensa
un ser humano, para luego compilarlo a un programa ms manejable por una computadora.

Diagrama a bloques de la operacin de un buen compilador.

Como parte importante de este proceso de traduccin, el compilador informa a su usuario de la


presencia de errores en el programa fuente.

PARTES DE UN COMPILADOR
La construccin de un compilador involucra la divisin del proceso en una serie de fases que
variar con su complejidad. Generalmente estas fases se agrupan en dos tareas: el anlisis del
programa fuente y la sntesis del programa objeto.
Anlisis: Se trata de la comprobacin de la correccin del programa fuente, e incluye las fases
correspondientes al Anlisis lxico (que consiste en la descomposicin del programa fuente
en componentes lxicos), Anlisis sintctico (agrupacin de los componentes lxicos en
frases gramaticales) y Anlisis semntico (comprobacin de la validez semntica de las
sentencias aceptadas en la fase de Anlisis sintctico).
Sntesis: Su objetivo es la generacin de la salida expresada en el lenguaje objeto y suele
estar formado por una o varias combinaciones de fases de Generacin de Cdigo
(normalmente se trata de cdigo intermedio o de cdigo objeto) y de Optimizacin de Cdigo
(en las que se busca obtener un cdigo lo ms eficiente posible).

HISTORIA
En 1946 se desarroll la primera computadora digital. En un principio, estas mquinas ejecutaban
instrucciones consistentes en cdigos numricos que sealaban a los circuitos de la mquina los
estados correspondientes a cada operacin, lo que se denomin lenguaje mquina.
Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus
programas mediante claves ms fciles de recordar que esos cdigos; al final, todas esas claves
juntas se traducan manualmente a lenguaje mquina. Estas claves constituyen los llamados
lenguajes ensambladores.
Pese a todo, el lenguaje ensamblador segua siendo el de una mquina, pero ms fcil de
manejar. Los trabajos de investigacin se orientaron hacia la creacin de un lenguaje que
expresara las distintas acciones a realizar de una manera lo ms sencilla posible para una
persona. El primer compilador fue escrito por Grace Hopper, en 1952 para el lenguaje de
programacin A-0. En 1950 John Backus dirigi una investigacin en IBM sobre un lenguaje
algebraico. En 1954 se empez a desarrollar un lenguaje que permita escribir frmulas
matemticas de manera traducible por un ordenador; le llamaron FORTRAN (FORmulae
TRANslator). Fue el primer lenguaje de alto nivel y se introdujo en 1957 para el uso de la
computadora IBM modelo 704.
Surgi as por primera vez el concepto de un traductor como un programa que traduca un
lenguaje a otro lenguaje. En el caso particular de que el lenguaje a traducir es un lenguaje de alto
nivel y el lenguaje traducido de bajo nivel, se emplea el trmino compilador.
La tarea de realizar un compilador no fue fcil. El primer compilador de FORTRAN tard 18 aos-
persona en realizarse y era muy sencillo. Este desarrollo de FORTRAN estaba muy influenciado
por la mquina objeto en la que iba a ser implementado. Como un ejemplo de ello tenemos el
hecho de que los espacios en blanco fuesen ignorados, debido a que el perifrico que se utilizaba
como entrada de programas (una lectora de tarjetas perforadas) no contaba correctamente los
espacios en blanco.
El primer compilador autocontenido, es decir, capaz de compilar su propio cdigo fuente fue el
creado para Lisp por Hart y Levin en el MIT en 1962. Desde 1970 se ha convertido en una prctica
comn escribir el compilador en el mismo lenguaje que este compila, aunque Pascal y C han sido
alternativas muy usadas.
Crear un compilador autocontenido genera un problema llamado bootstrapping, es decir el primer
compilador creado para un lenguaje tiene que o bien ser compilado por un compilador escrito en
otro lenguaje o bien compilado al ejecutar el compilador en un intrprete.
PROCESO DE COMPILACIN
Es el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de
programacin a lenguaje mquina. Adems de un traductor, se pueden necesitar otros programas
para crear un programa objeto ejecutable. Un programa fuente se puede dividir en mdulos
almacenados en archivos distintos. La tarea de reunir el programa fuente a menudo se confa a
un programa distinto, llamado preprocesador. El preprocesador tambin puede expandir
abreviaturas, llamadas a macros, a proposiciones del lenguaje fuente.
Normalmente la creacin de un programa ejecutable (un tpico.exe para Microsoft Windows o
DOS) conlleva dos pasos. El primer paso se llama compilacin (propiamente dicho) y traduce el
cdigo fuente escrito en un lenguaje de programacin almacenado en un archivo a cdigo en bajo
nivel (normalmente en cdigo objeto, no directamente a lenguaje mquina). El segundo paso se
llama enlazado en el cual se enlaza el cdigo de bajo nivel generado de todos los ficheros y
subprogramas que se han mandado compilar y se aade el cdigo de las funciones que hay en
las bibliotecas del compilador para que el ejecutable pueda comunicarse directamente con el
sistema operativo, traduciendo as finalmente el cdigo objeto a cdigo mquina, y generando un
mdulo ejecutable.
Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de
compilacin en archivos objetos (un tpico.obj para Microsoft Windows, DOS o para Unix); para
enlazarlos en fases posteriores, o crear directamente el ejecutable; con lo que la fase de
compilacin se almacena slo temporalmente. Un programa podra tener partes escritas en varios
lenguajes (por ejemplo C, C++ y Asm), que se podran compilar de forma independiente y luego
enlazar juntas para formar un nico mdulo ejecutable.

ETAPAS DEL PROCESO


El proceso de traduccin se compone internamente de varias etapas o fases, que realizan
distintas operaciones lgicas. Es til pensar en estas fases como en piezas separadas dentro del
traductor, y pueden en realidad escribirse como operaciones codificadas separadamente aunque
en la prctica a menudo se integren juntas.
Fase de anlisis
Anlisis lxico.- El anlisis lxico constituye la primera fase, aqu se lee el programa fuente de
izquierda a derecha y se agrupa en componentes lxicos (tokens), que son secuencias de
caracteres que tienen un significado. Adems, todos los espacios en blanco, lneas en blanco,
comentarios y dems informacin innecesaria se elimina del programa fuente. Tambin se
comprueba que los smbolos del lenguaje (palabras clave, operadores, etc.) se han escrito
correctamente.
Como la tarea que realiza el analizador lxico es un caso especial de coincidencia de patrones,
se necesitan los mtodos de especificacin y reconocimiento de patrones, se usan principalmente
los autmatas finitos que acepten expresiones regulares. Sin embargo, un analizador lxico
tambin es la parte del traductor que maneja la entrada del cdigo fuente, y puesto que esta
entrada a menudo involucra un importante gasto de tiempo, el analizador lxico debe funcionar
de manera tan eficiente como sea posible.
Anlisis sintctico.- En esta fase los caracteres o componentes lxicos se agrupan
jerrquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se
comprueba si lo obtenido de la fase anterior es sintcticamente correcto (obedece a la gramtica
del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan
mediante un rbol de anlisis sintctico.
La estructura jerrquica de un programa normalmente se expresa utilizando reglas recursivas.
Por ejemplo, se pueden dar las siguientes reglas como parte de la definicin de expresiones:
1. Cualquier identificador es una expresin.
2. Cualquier nmero es una expresin.
3. Si expresin1 y expresin2 son expresiones, entonces tambin lo son:
expresin1 + expresin2
expresin1 * expresin2
( expresin1 )
Las reglas 1 y 2 son reglas bsicas (no recursivas), en tanto que la regla 3 define expresiones en
funcin de operadores aplicados a otras expresiones.
La divisin entre anlisis lxico y anlisis sintctico es algo arbitraria. Un factor para determinar
la divisin es si una construccin del lenguaje fuente es inherentemente recursiva o no. Las
construcciones lxicas no requieren recursin, mientras que las construcciones sintcticas suelen
requerirla. No se requiere recursin para reconocer los identificadores, que suelen ser cadenas
de letras y dgitos que comienzan con una letra. Normalmente, se reconocen los identificadores
por el simple examen del flujo de entrada, esperando hasta encontrar un carcter que no sea ni
letra ni dgito, y agrupando despus todas las letras y dgitos encontrados hasta ese punto en un
componente lxico llamado identificador. Por otra parte, esta clase de anlisis no es
suficientemente poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos
emparejar de manera apropiada los parntesis de las expresiones, o las palabras begin y end en
proposiciones sin imponer alguna clase de estructura jerrquica o de anidamiento a la entrada.
Anlisis semntico.- La fase de anlisis semntico revisa el programa fuente para tratar de
encontrar errores semnticos y rene la informacin sobre los tipos para la fase posterior de
generacin de cdigo. En ella se utiliza la estructura jerrquica determinada por la fase de anlisis
sintctico para identificar los operadores y operandos de expresiones y proposiciones.
Un componente importante del anlisis semntico es la verificacin de tipos. Aqu, el compilador
verifica si cada operador tiene operandos permitidos por la especificacin del lenguaje fuente.
Por ejemplo, las definiciones de muchos lenguajes de programacin requieren que el compilador
indique un error cada vez que se use un nmero real como ndice de una matriz. Sin embargo, la
especificacin del lenguaje puede imponer restricciones a los operandos, por ejemplo, cuando un
operador aritmtico binario se aplica a un nmero entero y a un nmero real. Revisa que los
arreglos tengan definido el tamao correcto.
Fase de sntesis
Consiste en generar el cdigo objeto equivalente al programa fuente. Slo se genera cdigo
objeto cuando el programa fuente est libre de errores de anlisis, lo cual no quiere decir que el
programa se ejecute correctamente, ya que un programa puede tener errores de concepto o
expresiones mal calculadas. Por lo general el cdigo objeto es cdigo de mquina relocalizable
o cdigo ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables
usadas por el programa. Despus, cada una de las instrucciones intermedias se traduce a una
secuencia de instrucciones de mquina que ejecuta la misma tarea. Un aspecto decisivo es la
asignacin de variables a registros.
Generacin de cdigo intermedio.- Despus de los anlisis sintctico y semntico, algunos
compiladores generan una representacin intermedia explcita del programa fuente. Se puede
considerar esta representacin intermedia como un programa para una mquina abstracta. Esta
representacin intermedia debe tener dos propiedades importantes; debe ser fcil de producir y
fcil de traducir al programa objeto.
La representacin intermedia puede tener diversas formas. Existe una forma intermedia llamada
cdigo de tres direcciones que es como el lenguaje ensamblador de una mquina en la que
cada posicin de memoria puede actuar como un registro. El cdigo de tres direcciones consiste
en una secuencia de instrucciones, cada una de las cuales tiene como mximo tres operandos.
Esta representacin intermedia tiene varias propiedades:
Primera.- Cada instruccin de tres direcciones tiene a lo sumo un operador, adems de
la asignacin, por tanto, cuando se generan estas instrucciones, el traductor tiene que
decidir el orden en que deben efectuarse las operaciones.
Segunda.- El traductor debe generar un nombre temporal para guardar los valores
calculados por cada instruccin.
Tercera.- Algunas instrucciones de tres direcciones tienen menos de tres operandos,
por ejemplo, la asignacin.
Optimizacin de cdigo.- La fase de optimizacin de cdigo consiste en mejorar el cdigo
intermedio, de modo que resulte un cdigo mquina ms rpido de ejecutar. Esta fase de la etapa
de sntesis es posible sobre todo si el traductor es un compilador (difcilmente un intrprete puede
optimizar el cdigo objeto). Hay mucha variacin en la cantidad de optimizacin de cdigo que
ejecutan los distintos compiladores. En los que hacen mucha optimizacin, llamados
compiladores optimizadores, una parte significativa del tiempo del compilador se ocupa en esta
fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de
ejecucin del programa objeto sin retardar demasiado la compilacin.

CUESTIONARIO
1. Qu es un compilador?
2. Qu realiza el compilador en la fase de anlisis?
3. Qu realiza el compilador en la fase de sntesis?
4. Resuma la historia de los compiladores.
5. A qu se refiere el trmino preprocesador? Cmo es el proceso de compilacin?
6. Qu es el anlisis lxico?
7. Qu es el anlisis sintctico?
8. Qu es el anlisis semntico?
9. Qu es la generacin de cdigo intermedio?
10. Qu es la optimizacin de cdigo?

También podría gustarte