Compiladores
Click here to load reader
Transcript of Compiladores
DIANA ROCIO OLAYA MESA
Un traductor es cualquier programa que
toma como entrada un texto escrito en un
lenguaje, llamado fuente y da como salida
otro texto en un lenguaje, denominado
objeto.
Un ensamblador es un compilador cuyo
lenguaje fuente es el lenguaje ensamblador.
Un intérprete no genera un programa
equivalente, sino que toma una sentencia del
programa fuente en un lenguaje de alto nivel
y la traduce al código equivalente y al
mismo tiempo lo ejecuta.
Históricamente, con la escasez de memoria de losprimeros ordenadores, se puso de moda el uso deintérpretes frente a los compiladores, pues elprograma fuente sin traducir y el intérprete juntosdaban una ocupación de memoria menor que laresultante de los compiladores. Por ello los primerosordenadores personales iban siempre acompañadosde un intérprete de BASIC (Spectrum, CommodoreVIC-20, PC XT de IBM, etc.). Lamejor información sobre los errores por parte delcompilador así como una mayor velocidad deejecución del código resultante hizo que poco a pocose impusieran los compiladores. Hoy en día, y con elproblema de la memoria prácticamente resuelto, sepuede hablar de un gran predominio de loscompiladores frente a los intérpretes, aunqueintérpretes como los incluidos en los navegadoresdeInternet para interpretar el código JVM de Java son lagran excepción.
Se compila una vez, se ejecuta n veces.
En bucles, la compilación genera código
equivalente al bucle, pero interpretándolo se
traduce tantas veces una línea como veces se
repite el bucle.
El compilador tiene una visión global del
programa, por lo que la información de
mensajes de error es mas detallada.
Un intérprete necesita menos memoria que
un compilador. En principio eran más
abundantes dado que los ordenadores tenían
poca memoria.
Permiten una mayor interactividad con el
código en tiempo de desarrollo.
Un compilador no es un programa que
funciona de manera aislada, sino que
necesita de otros programas para conseguir
su objetivo: obtener un programa ejecutable
a partir de un programa fuente en un
lenguaje de alto nivel. Algunos de esos
programas son el preprocesador, el linker, el
depurador y el ensamblador
El preprocesador se ocupa (dependiendo del
lenguaje) de incluir ficheros,
expandir macros, eliminar comentarios, y
otras tareas similares. El linker se encarga de
construir el fichero ejecutable añadiendo al
fichero objeto generado por el compilador
las cabeceras necesarias y las funciones de
librería utilizadas por el programa fuente.
El depurador permite, si el compilador ha
generado adecuadamente el programa
objeto, seguir paso a paso la ejecución de un
programa. Finalmente, muchos
compiladores, en vez de generar código
objeto, generan un programa en lenguaje
ensamblador que debe después convertirse
en un ejecutable mediante un programa
ensamblador.
una sola pasada: examina el código fuente una vez, generando elcódigo o programa objeto.
pasadas múltiples: requieren pasos intermedios para producir uncódigo en otro lenguaje, y una pasada final para producir yoptimizar el código producido durante los pasos anteriores.
Optimación: lee un código fuente, lo analiza y descubre errorespotenciales sin ejecutar el programa.
Compiladores incrementales: generan un código objetoinstrucción por instrucción (en vez de hacerlo para todo elprograma) cuando el usuario teclea cada orden individual. El otrotipo de compiladores requiere que todos los enunciados oinstrucciones se compilen conjuntamente.
Ensamblador: el lenguaje fuente es lenguaje ensamblador yposee una estructura sencilla.
Compilador cruzado: se genera código en lenguaje objeto parauna máquina diferente de la que se está utilizando para compilar.Es perfectamente normal construir un compilador de Pascal quegenere código para MS-DOS y que el compilador funcioneen Linux y se haya escrito en C++.
Compilador con montador: compilador que compila distintosmódulos de forma independiente y después es capaz deenlazarlos.
Autocompilador: compilador que está escrito en el mismolenguaje que va a compilar. Evidentemente, no se puedeejecutar la primera vez. Sirve para hacer ampliaciones allenguaje, mejorar el código generado, etc.
Metacompilador: es sinónimo de compilador de compiladores y serefiere a un programa que recibe como entrada lasespecificaciones del lenguaje para el que se desea obtener uncompilador y genera como salida el compilador para eselenguaje. El desarrollo de los metacompiladores se encuentra conla dificultad de unir la generación de código con la parte deanálisis. Lo que sí se han desarrollado son generadores deanalizadores léxicos y sintácticos. Por ejemplo, los conocidos:LEX: generador de analizadores léxicosYACC: generador de analizadores sintácticosdesarrollados para UNIX. Los inconvenientes que tienen son quelos analizadores que generan no son muy eficientes.
Descompilador: es un programa que acepta como entrada códigomáquina y lo traduce a un lenguaje de alto nivel, realizando elproceso inverso a la compilación.
Las tres primeras fases, que forman la mayorparte de la porción de análisis de uncompilador se analizan en la sección IX.Otras dos actividades, laadministración de latabla se símbolos y el manejo de errores, semuestran en interacción con las seis fases deanálisis léxico, análisis sintáctico, análisissemántico, generación de código intermedio,optimación de código y generación decódigo. De modo informal, también sellamarán "fases" aladministrador de la tablade símbolos y al manejador de errores.
Una función esencial de un compilador es
registrar los identificadores utilizados en el
programa fuente y reunir información sobre los
distintos atributos de cada identificador. Estos
atributos pueden proporcionar información sobre
la memoria asignada a un identificador, su tipo,
su ámbito (la parte del programa donde tiene
validez) y, en el caso de nombres de
procedimientos, cosas como el número y tipos de
sus argumentos, el método de pasar cada
argumento (por ejemplo, por referencia) y el
tipo que devuelve, si los hay.
Cada fase debe tratar de alguna forma ese error, para podercontinuar la compilación, permitiendo la detección de máserrores en el programa fuente. Un compilador que se detienecuando encuentra el primer error, no resulta tan útil como
debiera.Las fases de análisis sintáctico y semántico por lo generalmanejan una gran proporción de los errores detectables por elcompilador. La fase léxica puede detectar errores donde loscaracteres restantes de la entrada no forman ningún componenteléxico del lenguaje. Los errores donde la cadena de componentesléxicos violan las reglas de estructura (sintaxis) del lenguaje sondeterminados por la fase del análisis sintáctico.Durante el análisis semántico el compilador intenta detectarconstrucciones que tengan la estructura sintáctica correcta, peroque no tengan significado para la operación implicada, porejemplo, si se intenta sumar dos identificadores. Uno de loscuales es el nombre de una matriz, y el otro, el nombre de unprocedimiento.
Conforme avanza la traducción, la
representación interna del programa fuente
que tiene el compilador se modifica. Para
ilustrar esas representaciones, considérese la
traducción de la proposición
Posición := inicial + velocidad * 60 (1)
Posición := inicial + velocidad * 60
Id1 := id2 + id3 * 60