Beruflich Dokumente
Kultur Dokumente
Presentado por:
Carlos Quiroz
Presentado a:
Luis Fran Cardozo
Ing. Sistemas VI
Nocturno
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).