Sie sind auf Seite 1von 13

Taller de Compiladores

Presentado por:
Carlos Quiroz

Presentado a:
Luis Fran Cardozo

Ing. Sistemas VI
Nocturno

Corporación universitaria Latinoamericana C.U.L

2018
Traductores de Lenguaje y Compiladores

Traductores de lenguaje
Son programas que traducen a su vez los programas fuente escritos en lenguajes de alto
nivel a código máquina.
Los traductores se dividen en:
 Compiladores
 Interpretes
Intérpretes
Un intérprete es un traductor que toma un programa fuente, lo traduce y a continuación lo
ejecuta (dicho programa por medio de la computadora desarrolla una tarea específica).
Un lenguaje que soporte un traductor de tipo intérprete se denomina lenguaje interpretado.
BASIC es el modelo por excelencia interpretado.
Los programas fuente en BASIC se escriben con ayuda de un programa denominado editor
que suele venir incorporado al programa intérprete.

Compiladores
Un compilador es un programa que traduce los programas fuente escritos en lenguajes de
alto nivel a lenguaje máquina.
Los programas escritos en lenguajes de alto nivel (en el editor del lenguaje) se llaman
programas fuente y el programa traducido programa objeto o código objeto. El compilador
traduce (sentencia a sentencia) el programa fuente.
Lenguajes compiladores típicos son: PASCAL, COBOL, C..
Fases de la compilación
La compilación es el proceso de la traducción de programas fuente a programas objeto.
El programa objeto obtenido de la compilación no ha sido traducido normalmente a código
máquina sino a ensamblador. Para conseguir el programa máquina real se debe utilizar un
programa llamado montador o enlazador (linker). El proceso de montaje conduce a un
programa en lenguaje máquina directamente ejecutable:

Por ejemplo:
El proceso de ejecución de un Programa en C++ tiene los siguientes pasos:
1. Escritura del programa fuente con un editor (programa que permite a una
computadora actuar de modo similar a una máquina de escribir electrónica) y guardarlo en
un dispositivo de almacenamiento (un disco).
2. Introducir el programa fuente en memoria.
3. Compilar el programa con el compilador C++.
4. Verificar y corregir errores de compilación (listado de errores).
5. Obtención del programa objeto.
6. El montador obtiene el programa ejecutable.
7. Se ejecuta el programa y si no existen errores, se tendrá la salida del mismo.
Breve Historia de los Compiladores

Con la aparición de la computadora con programa almacenado, iniciado por John Von
Neumann a finales de la década de 1940, se hizo necesario escribir secuencias de códigos, o
programas, que darían como resultado que estas computadoras realizaran los cálculos
deseados. Al principio estos programas se escribían en lenguaje de maquina: códigos
numéricos que representaban las operaciones reales de la maquina que iban a efectuarse.
Por ejemplo:
C7 06 0000 0002
representa la instrucción para mover el numero 2 a la ubicación 0000 (en sistema
hexadecimal) en los procesadores Intel 8×86 que se utilizan en las PC de IBM.
Por supuesto, la escritura de tales códigos es muy tediosa y consume mucho tiempo, por lo
que esta forma de codificación pronto fue reemplazada por el lenguaje ensamblador, en el
cual las instrucciones y las ubicaciones de memoria son formas simbólicas dadas. Por
ejemplo: la instrucción en lenguaje ensamblador
MOV X , 2
es equivalente a la instrucción de máquina anterior (suponiendo que la ubicación de
memoria simbólica X es 0000).
Un ensamblador traduce los códigos simbólicos y las ubicaciones de memoria del lenguaje
ensamblador a los códigos numéricos correspondientes del lenguaje de máquina.
El lenguaje ensamblador se usa cuando se necesita una gran velocidad o brevedad en el
código. Pero tiene varios defectos: aún no es fácil de escribir y es difícil de leer y
comprender, y depende de la máquina en particular para la cual se haya escrito.
Entre 1954 y 1957 se desarrolló el lenguaje FORTRAN y su compilador, llevado a cabo por
un equipo en IBM dirigido por John Backus.
Noam Chomsky comenzó a estudiar la estructura del lenguaje natural. Sus hallazgos
finalmente hicieron que la construcción de compiladores se volviera mucho más fácil e
incluso pudiera ser automatizado hasta cierto punto.
Las Fases del Compilador
El proceso de compilación es una secuencia de varias fases. Cada fase dura entrada de su
etapa anterior, tiene su propia representación del programa de origen, y alimenta su
resultado a la siguiente fase del compilador. Nos permiten entender las fases de un
compilador.
Análisis Léxico: La primera fase de escáner funciona como un texto escáner. Esta fase
busca en el código fuente como una secuencia de caracteres y la convierte en un lexema
resultante-. Analizador Léxico representa estos lexema resultante- en forma de fichas:
<token-name, attribute-value>
Sintaxis Análisis: La siguiente fase se denomina la sintaxis análisis o análisis. Toma el
token de análisis léxico como entrada y genera un árbol analizar (o árbol de sintaxis). En
esta fase, token arreglos se contrastan con el código fuente gramática, es decir, el
analizador comprueba si la expresión de los tokens es sintácticamente correcto.
Análisis semántico: Análisis semántico comprueba si el análisis árbol construido sigue las
reglas del idioma. Por ejemplo, la asignación de valores es entre tipos de datos compatibles,
y añadiendo cadena en un número entero. Además, el analizador semántico realiza un
seguimiento de los identificadores, sus tipos y expresiones; si los identificadores se
declaran antes de su uso, o no, etc. El analizador semántico produce un árbol de sintaxis
anotado como una salida.
Generación de código intermedio: Tras análisis semántico el compilador genera un
código intermedio del código fuente para el equipo de destino. Es un programa para
algunos la máquina abstracta. , Está entre el lenguaje de alto nivel y el lenguaje de
máquina. Este código intermedio debe ser generado de tal manera que hace que sea más
fácil de traducir en la máquina de destino.
Optimización de código: La siguiente fase de optimización de código es el código
intermedio. La optimización puede ser asumida como algo que elimina código innecesario,
y organiza la secuencia de declaraciones con el fin de acelerar la ejecución del programa
sin desperdicio de recursos (CPU, memoria).
Generación de código: En esta fase, el generador de código optimizado la representación
del código intermedio y la asigna a la máquina de destino. El generador de código se
traduce el código intermedio en una secuencia de (generalmente) reubicables código
máquina. Secuencia de instrucciones de código máquina realiza la tarea como el código
intermedio.
Tabla de símbolos: Es una estructura de datos mantendrá en todas las fases de un
compilador. Todos los nombres de identificador junto con sus tipos se almacenan aquí. La
tabla de símbolos hace que sea más fácil para que el compilador pueda buscar con rapidez
el registro de código y recuperarla. La tabla de símbolos se utiliza también para el campo.
COMPILADOR E INTERPRETE
Compilador
Definición:
Un compilador es un programa informático que traduce un programa escrito en
un lenguaje de programación a otro lenguaje de programación, generando un programa
equivalente que la máquina será capaz de interpretar. Usualmente el segundo lenguaje
es lenguaje de máquina, pero también puede ser un código intermedio , o simplemente
texto. Este proceso de traducción se conoce como compilación.
Un compilador es un programa que permite traducir el código fuente de un programa
en lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje de
máquina). De esta manera un programador puede diseñar un programa en un lenguaje
mucho más cercano a como piensa un ser humano, para luego compilarlo a un programa
más manejable por una computadora.
Partes del Compilador:
Análisis: Se trata de la comprobación de la corrección del programa fuente, e incluye las
fases correspondientes al Análisis Léxico (que consiste en la descomposición del programa
fuente en componentes léxicos), Análisis Sintáctico (agrupación de los componentes
léxicos en frases gramaticales ) y Análisis Semántico (comprobación de la validez
semántica de las sentencias aceptadas en la fase de Análisis Sintáctico).
Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele
estar formado por una o varias combinaciones de fases de Generación de Código
(normalmente se trata de código intermedio o de código objeto) y de Optimización de
Código (en las que se busca obtener un código lo más eficiente posible).
Front-end: es la parte que analiza el código fuente, comprueba su validez, genera el árbol
de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser
independiente de la plataforma o sistema para el cual se vaya a compilar, y está compuesta
por las fases comprendidas entre el Análisis Léxico y la Generación de Código Intermedio.
Tipos de compiladores

 Compiladores cruzados: generan código para un sistema distinto del que están
funcionando.
 Compiladores optimizadores: realizan cambios en el código para mejorar su
eficiencia, pero manteniendo la funcionalidad del programa original.
 Compiladores de una sola pasada: generan el código máquina a partir de una
única lectura del código fuente.
 Compiladores de varias pasadas: necesitan leer el código fuente varias veces
antes de poder producir el código máquina.
 Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes
del código según se necesitan.
El Interprete
Definición:
En ciencias de la computación, intérprete o interpretador es un programa
informático capaz de analizar y ejecutar otros programas, escritos en un lenguaje de alto
nivel. Los intérpretes se diferencian de los compiladores en que mientras estos traducen un
programa desde su descripción en un lenguaje de programación al código de máquina del
sistema, los intérpretes sólo realizan la traducción a medida que sea necesaria, típicamente,
instrucción por instrucción, y normalmente no guardan el resultado de dicha traducción.
Usando un intérprete, un solo archivo fuente puede producir resultados iguales incluso en
sistemas sumamente diferentes (ej. una PC y un PlayStation 3). Usando un compilador, un
solo archivo fuente puede producir resultados iguales solo si es compilado a distintos
ejecutables específicos a cada sistema.
Los programas interpretados suelen ser más lentos que los compilados debido a la
necesidad de traducir el programa mientras se ejecuta, pero a cambio son más flexibles
como entornos de programación y de puración (lo que se traduce, por ejemplo, en una
mayor facilidad para reemplazar partes enteras del programa o añadir módulos
completamente nuevos), y permiten ofrecer al programa interpretado un entorno no
dependiente de la máquina donde se ejecuta el intérprete, sino del propio intérprete (lo que
se conoce comúnmente como máquina virtual).

Compilación justo a tiempo


Para desdibujar más la distinción entre los interpretadores, los interpretadores de bytecode
y la compilación, está la compilación justo a tiempo (o JIT), una técnica en la cual la
representación intermedia es compilada a código de máquina nativo en tiempo de
ejecución. Esto confiere la eficiencia de ejecutar el código nativo, al costo de tiempo de
inicio y de un uso creciente de la memoria cuando el bytecode o el AST es compilado por
primera vez. La optimización adaptativa es una técnica complementaria en la cual el
interpretador hace un análisis de desempeño del programa que está corriendo (profiling) y
compila sus partes más frecuentemente ejecutadas a código nativo. Ambas técnicas tienen
algunas décadas, apareciendo en lenguajes tales como Smalltalk en los años 1980.
En años recientes, la compilación justo a tiempo ha ganado la atención de la mayoría de los
implementadores de lenguajes de programación, con Java, Python, y el Microsoft .NET
Framework todos ahora incluyendo JITs.
Comparacion Interpretes y Compiladores

Un compiladoracepta programas escritos en un lenguaje de alto nivel y los traduce a otro


lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas
veces como se quiera.
En un compilador hay que distinguir tres lenguajes diferentes:
• el de los programas de partida (LA)
• el de los programas equivalentes traducidos (LB), normalmente el lenguaje de máquina
• el lenguaje en que está escrito el propio compilador (LC), que puede ser igual o diferente
a uno de los otros dos.
Los programas interpretados suelen ser más lentos que los compilados, pero los intérpretes
son más flexibles como entornos de programación y depuración. Comparando su actuación
con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de
un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete
corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar
constancia por escrito.

Ventajas de compilar frente a interpretar:


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. Ventajas del intérprete frente al compilador:
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.

Ventajas del intérprete frente al compilador:


• El programa se puede ejecutar de inmediato, sin esperar a ser compilado.
• Puede ser interrumpido con facilidad.
• puede ser rápidamente modificado y ejecutado nuevamente.
• Resultan muy apropiados durante la fase de desarrollo de un programa, ya que la
compilación no permite la ejecución paso a paso del programa y con ello impide la edición
seguimiento y depuración del programa.
Desventajas del intérprete frente al compilador:
• La ejecución es más lenta, pues cada intrucción debe ser traducida a código máquina
tantas veces como sea ejecutada.
• No son adecuados en la fase de explotación del programa ya que el proceso de
interpretación se ha de repetir cada vez que se ejecuta el programa, mientras que con la
compilación, una vez obtenido el programa en leguaje máquina éste puede ser ejecutado sin
necesidad de compilarlo de nuevo.

Un interprete es un traductor de lenguaje, igual


que un compilador, pero difiere de éste en que ejecuta el programa fuente inmediatamente,
en vez de generar un código objeto que se ejecuta después de que se completa la
traducción. En principio, cualquier lenguaje de programación se puede interpretar o
compilar, pero se puede preferir un interprete a un compilador dependiendo del lenguaje
que se esté usando y de la situación en la cual se presenta la traducción.

Das könnte Ihnen auch gefallen