You are on page 1of 23

UNIVERSIDAD NACIONAL DE JAÉN

VICEPRESIDENCIA ACADEMICA

CARRERA PROFESIONAL INGENIERÍA CIVIL III

ASIGNATURA
PROGRAMACÍON

TÍTULO
TRADUCTORES

AUTORES
ASENJO LOZANO, EULER JAVIER
CABRERA GUEVARA, JOSE NEISER
OLIVA ALEJANDRIA, MAYKOL JAIRO
MEGO MATEO, JHON ANDERSON

ASESOR
MOGOLLON GALECIO, POLO ARTURO

Jaén, octubre 2016


1
AGRADECIMIETO
Agradezco especialmente a mis padres por estar apoyándome a lo largo de todo
este camino que estoy trazado a culminar, al mismo tiempo a todas las personas
que me están apoyado. Estoy seguro que mis metas planteadas darán fruto en
el futuro y por ende me debo esforzar cada día para ser mejor.

2
INDICE

Agradecimiento Pag 2
introducción Pag 5
I.- capítulo 1 Traductores Pag 6

1.1 Definición Pag 6


1.2 Funciones de un traductor Pag 6
1.2 Traductores del idioma Pag 6
II.- Capítulo 2 Compiladores: Pag 7
2.1 introducción: Pag 7
2.2.- ¿qué es un compilador? Pag 9
2.3.- compilador: Pag 9
2.4.- clasificación de compiladores: Pag 11
2.5.- funciones de un compilador Pag 12
2.6.- fases de un compilador Pag 13
2.7.-formas de examinar un compilador Pag 13
2.8.- como se sintetiza el código objeto de un compilador Pag 14
2.9.-árboles sintácticos para la representación de cómo Pag 14
se sintetiza el código objeto de un compilador
III.- Capítulo 3 Interpretes Pag 14
3.1.- Definición: Pag 14
3.2.- Estructura: Pag 15
3.3.- Interpretación: Pag 15
3.3.1.- Interpretación iterativa: Pag 15
3.3.2.- interpretación recursiva: Pag 16
3.4.- ventajas de la utilización de intérpretes: Pag 16
3.4.1.- Ventajas del intérprete frente al compilador Pag 17
3.5.- tipos de intérpretes Pag 17
3.5.1.- intérpretes puros. Pag 17

3
3.5.2.-intérpretes avanzados Pag 18
3.5.3.-intérpretes incrementales. Pag 18
3.6.-evaluadores parciales. Pag 18

IV.- conclusiones Pag 19


V.- Anexos Pag 20
V.- Anexos Pag 19
VI.- Referencias bibliográficas Pag 21

4
INTRODUCCIÓN

En este presente trabajo estamos desarrollando en 3 capítulos; el primer


capítulo “TRADUCTORES”, hablaremos un poco de su definición cuál es su
función. El capítulo dos “INTERPRETES “que es un programa que analiza y
ejecuta simultáneamente un programa escrito en un lenguaje fuente, a su vez
hablaremos de su función, estructura, tipos de intérpretes, ventajas entre otros
temas. El tercer y último capítulo “COMPILADORES” que es un programa que
convierte o traduce el código fuente de un programa hecho en lenguaje de alto
nivel, a un lenguaje de bajo nivel lenguaje de máquina, hablaremos también de
su función, sus fases, sus funciones, entre otros aspectos.
Para el desarrollo de este informe hemos recolectado información de libros,
páginas de internet, entre otros; con el fin de realizar un resumen de todo el
tema, y así lograr que las personas puedan entender de forma más rápida y
fácil.

5
CAPÍTULO I

TRADUCTORES

1.1 DEFINICIÓN:

Según (Galves, 2011) un traductor se define como un programa que


traduce o convierte desde un texto o programa escrito en un lenguaje fuente
hasta un texto o programa. Los traductores engloban tanto a los Compiladores
e Intérpretes. Es importante destacar la velocidad con la que hoy en día se
puede construir un compilador. En la década de 1950, se consideró a los
traductores como programas notablemente difíciles de escribir. El primer
compilador de FORTRAN (Formula Translator).

1.2 FUNCIONES DE UN TRADUCTOR:

Es un Programa que recibe como entrada código en otro lenguaje.


Generalmente el lenguaje de entrada es de más alto nivel que el de salida. Un
traductor es un programa que toma el texto escrito en un lenguaje y lo convierte
en el texto equivalente en un segundo lenguaje. (el lenguaje destino u objeto).
(Esparsa, 2016)
Para (Cortez, 2007) 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 de
salida. Ejemplos de traductores son los ensambladores y los compiladores. Un
ensamblador es un programa que traduce de un lenguaje ensamblador a
lenguaje de máquina; entonces diremos que el traductor es un compilador.
Esta es una realidad trasladable al mundo de los ordenadores. Excepto
en el caso de que el diálogo se mantenga utilizando el lenguaje máquina, es
necesario un proceso de traducción para que el programa confeccionado por el
usuario resulte inteligente para el ordenador. Para ello la tarea de traducción no
correrá a cargo de traductores humanos; sino que de ello se ocuparán los
propios ordenadores una vez instruidos al efecto. (Octavio, 2013)

1.2 TRADUCTORES DEL IDIOMA

Tal como sucede en la traducción de comunicaciones humanas,


también en este caso cabe una doble posibilidad de recurrir a un intérprete o
traductor simultaneo que permita un dialogo o comunicación interactiva,
utilizando los servicios de un traductor que reescriba el contenido de la
6
comunicación en el lenguaje del destinatario (la máquina en este caso).
(Octavio, 2013)

Necesidad eh inteligencia artificial y problema de las frases hechas. El


problema de la inteligencia artificial es que tiene mucho de artificial y poco de
inteligencia, por lo que en la actualidad resulta casi imposible traducir frases
con un sentido profundo. Como anécdota, durante la guerra fría, en un intento
por realizar traducciones automáticas de ruso al inglés y viceversa, se puso a
prueba un prototipo introduciendo el texto en inglés: “el espíritu es fuerte, pero
la Carne es débil” cuya traducción al ruso se pasó se pasó de nuevo al inglés
para ver si coincidía con el original. Cual fue la sorpresa de los desarrolladores
cuando lo que se obtuvo fue: “El vino está bueno pero la carne esta podrida”.
También otros ejemplos son: “por decir aquello, se llevó una galleta”. (Galves,
2011)
La ejecución de programas redactados en un lenguaje de ensamble o
de alto nivel exige una previa traducción a lenguaje máquina. La ejecución de
programas redactados en un lenguaje de ensamble o de alto nivel exige una
previa traducción a lenguaje máquina. (Octavio, 2013)
En general, los resultados más satisfactorios en la traducción del
lenguaje natural se han producido sobre subconjuntos restringidos del lenguaje.
Y aún más, sobre subconjuntos en los que hay muy poco margen de
ambigüedad en la interpretación de los textos. (Galves, 2011)

CAPITULO II

COMPILADORES:

2.1.- INTRODUCCIÓN:

Según (Galves, 2011) En 1946 se desarrolló el primer ordenador


digital. En un principio, estas máquinas ejecutaban instrucciones consistentes
en códigos numéricos que señalan a los circuitos de la máquina los estados
correspondientes a cada operación. Esta expresión mediante códigos
numéricos se llamó Lenguaje Máquina, interpretado por un secuenciador
cableado o por un microprograma. Pero los códigos numéricos de las máquinas
son engorrosos. Pronto los primeros usuarios de estos ordenadores
descubrieron la ventaja de escribir sus programas mediante claves más fáciles
de recordar que esos códigos numéricos; al final, todas esas claves juntas se
traducían manualmente a Lenguaje Máquina. Estas claves constituyen los
llamados lenguajes ensambladores, que se generalizaron en cuanto se dio el
paso decisivo de hacer que las propias máquinas realizaran

7
el proceso mecánico de la traducción. A este trabajo se le llama ensamblar
el programa.
Dada su correspondencia estrecha con las operaciones elementales de
las máquinas, las instrucciones de los lenguajes ensambladores obligan a
programar cualquier función de una manera minuciosa e iterativa. De hecho,
normalmente, cuanto menor es el nivel de expresión de un lenguaje de
programación, mayor rendimiento se obtiene en el uso de los recursos físicos
(hardware). A pesar de todo, el lenguaje ensamblador seguía siendo el de una
máquina, pero más fácil de manejar. Los trabajos de investigación se
orientaron entonces hacia la creación de un lenguaje que expresara las
distintas acciones a realizar de una manera lo más sencilla posible para el
hombre. (Esparsa, 2016)
Así, en 1950, John Backus dirigió una investigación en I.B.M. en un
lenguaje algebraico. En 1954 se empezó a desarrollar un lenguaje que permitía
escribir fórmulas matemáticas de manera traducible por un ordenador. Le
llamaron FORTRAN. Fue el primer lenguaje considerado de alto nivel. Se
introdujo en 1957 para el uso de computadora IBM modelo 704. Permitía una
programación más cómoda y breve que lo existente hasta ese momento, lo que
suponía un considerable ahorro de trabajo. Surgió así por primera vez
el concepto de un traductor, como un programa que traducía 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 término compilador.
(Esparsa, 2016)

La tarea de realizar un compilador no fue fácil. El primer compilador de


FORTRAN tardó 18 años-persona en realizarse y era muy sencillo.
Este desarrollo del FORTRAN estaba muy influenciado por la máquina 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 periférico que
se utilizaba como entrada de programas (una lectora de tarjetas perforadas) no
contaba correctamente los espacios en blanco. Paralelamente al desarrollo de
FORTRAN en América, en Europa surgió una corriente más universitaria, que
pretendía que la definición de un lenguaje fuese independiente de la máquina y
en donde los algoritmos se pudieran expresar de forma más simple. (Octavio,
2013)
Junto a este desarrollo en los lenguajes, también se iba avanzando en
la técnica de compilación. En 1958, Strong y otros proponían una solución al
problema de que un compilador fuera utilizable por varias máquinas objeto.
Para ello, se dividía por primera vez el compilador en dos fases, designadas
como el "front end" y el "back end". La primera fase (front end) es la encargada
de analizar el programa fuente y la segunda fase (back end) es la encargada
de generar código para la máquina objeto. El puente de unión entre las dos
fases era un lenguaje intermedio que se designó con el nombre de UNCOL
(Universal Computer Oriented Language). Para que un compilador fuera
utilizable por varias máquinas bastaba únicamente modificar su back end.
Aunque se hicieron varios intentos para definir el UNCOL, el proyecto se ha
quedado simplemente en un ejercicio teórico. De todas formas, la división de

8
un compilador en front end y back end fue un adelanto importante. (Galves,
2011)

La técnica de la optimización apareció desde el desarrollo del primer


compilador de FORTRAN. Backus comenta cómo durante el desarrollo del
FORTRAN se tenía el miedo de que el programa resultante de la compilación
fuera más lento que si se hubiera escrito a mano. Para evitar esto, se
introdujeron algunas optimizaciones en el cálculo de los índices dentro de un
bucle. Pronto se sistematizan y se recoge la división de optimizaciones
independientes de la máquina y dependientes de la máquina. Entre las
primeras están la propagación de valores , el arreglo de expresiones, la
eliminación de redundancias, etc.”. Entre las segundas se podría encontrar la
localización de registros, el uso de instrucciones propias de la máquina y el
reordenamiento de código. (Galves, 2011)
A partir de 1970 comienza el estudio sistemático de las técnicas del
análisis de flujo de datos. Su repercusión ha sido enorme en las técnicas de
optimización global de un programa. En la actualidad, el proceso de la
compilación ya está muy asentado. Un compilador es una herramienta bien
conocida, dividida en diversas fases. Algunas de estas fases se pueden
generar automáticamente (analizador léxico y sintáctico) y otras requieren una
mayor atención por parte del escritor de compiladores (las partes de traducción
y generación de código). (Labra Gayo, Noviembre 2003)
El último lenguaje de programación de amplia aceptación que se ha
diseñado, el lenguaje Java, establece que el compilador no genera código para
una máquina determinada sino para una virtual, la Java Virtual Machine (JVM),
que posteriormente será ejecutado por un intérprete, normalmente incluido en
un navegador de Internet. El gran objetivo de esta exigencia es conseguir la
máxima portabilidad de los programas escritos y compilados en Java, pues es
únicamente la segunda fase del proceso la que depende de la máquina
concreta en la que se ejecuta el intérprete. (Alfonseca & Alfonso., 2005)

2.2.- ¿Qué es un compilador?

Un compilador es un programa que convierte o traduce el código fuente


de un programa hecho en lenguaje de alto nivel, a un lenguaje de bajo
nivel (lenguaje de máquina). (Wikipedia, 2017)

2.3.- COMPILADOR:

En el caso de que el lenguaje fuente sea un lenguaje de


programación de alto nivel y el objeto sea un lenguaje de bajo nivel
(ensamblador o código de máquina), a dicho traductor se le denomina
compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el
lenguaje ensamblador. Un intérprete no genera un programa equivalente, sino
9
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. (Labra Gayo,
Noviembre 2003)
Históricamente, con la escasez de memoria de los primeros
ordenadores, se puso de moda el uso de intérpretes frente a los compiladores,
pues el programa fuente sin traducir y el intérprete juntos daban una ocupación
de memoria menor que la resultante de los compiladores. Por ello los primeros
ordenadores personales iban siempre acompañados de un intérprete de BASIC
(Spectrum, Commodore VIC-20, PC XT de IBM, etc.). (Rojas., 2011)
La mejor información sobre los errores por parte del compilador así
como una mayor velocidad de ejecución del código resultante hizo que poco a
poco se impusieran los compiladores. Hoy en día, y con el problema de la
memoria prácticamente resuelto, se puede hablar de un gran predominio de los
compiladores frente a los intérpretes, aunque intérpretes como los incluidos en
los navegadores de Internet para interpretar el código JVM de Java son la gran
excepción. (Labra Gayo, Noviembre 2003)
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. (Rojas., 2011)

✓ El preprocesador se ocupa (dependiendo del lenguaje) de incluir ficheros,


expandir macros, eliminar comentarios, y otras tareas similares. (Rojas.,
2011)

✓ 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. (Rojas., 2011)

✓ El depurador permite, si el compilador ha generado adecuadamente el


programa objeto, seguir paso a paso la ejecución de un programa.
(Rojas., 2011)

✓ 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.
(Rojas., 2011)

Ventajas de compilar frente a interpretar:

✓ “Se compila una vez, se ejecuta n veces “. (Alfonseca & Alfonso., 2005)

✓ “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 “. (Alfonseca & Alfonso., 2005)

10
✓ “El compilador tiene una visión global del programa, por lo que la
información de mensajes de error es más detallada “. (Alfonseca & Alfonso.,
2005)

2.4.- CLASIFICACIÓN DE COMPILADORES:

Según (Esparsa, 2016) El programa compilador traduce las instrucciones en un


lenguaje de alto nivel a instrucciones que la computadora puede interpretar y
ejecutar. Para cada lenguaje de programación se requiere un compilador
separado. El compilador traduce todo el programa antes de ejecutarlo. Los
compiladores son, pues, programas de traducción insertados en la memoria por
el sistema operativo para convertir programas de cómputo en pulsaciones
electrónicas ejecutables (lenguaje de máquina). Los compiladores pueden ser
de:

• Una sola pasada: “Examina el código fuente una vez, generando el código
o programa objeto”. (Esparsa, 2016)

• Pasadas múltiples: “Requieren pasos intermedios para producir un código


en otro lenguaje, y una pasada final para producir y optimizar el código
producido durante los pasos anteriores”. (Alfonseca & Alfonso., 2005)

• Optimación: “Lee un código fuente, lo analiza y descubre errores


potenciales sin ejecutar el programa”. (Esparsa, 2016)

• Compiladores incrementales: Generan un código objeto instrucción por


instrucción (en vez de hacerlo para todo el programa) cuando el usuario
teclea cada orden individual. El otro tipo de compiladores requiere que todos
los enunciados o instrucciones se compilen conjuntamente. (Esparsa, 2016)

• Ensamblador: “El lenguaje fuente es lenguaje ensamblador y posee


una estructura sencilla”. (Alfonseca & Alfonso., 2005)

• Compilador cruzado: Se genera código en lenguaje objeto para una


máquina diferente de la que se está utilizando para compilar. Es
perfectamente normal construir un compilador de Pascal que genere código
para MS-DOS y que el compilador funcione en Linux y se haya escrito en
C++. (Alfonseca & Alfonso., 2005)

• Compilador con montador: “Compilador que compila distintos módulos de


forma independiente y después es capaz de enlazarlos. (Esparsa, 2016)

• Auto compilador: “Compilador que está escrito en el mismo lenguaje que


va a compilar. Evidentemente, no se puede ejecutar la primera vez. Sirve
para hacer ampliaciones al lenguaje, mejorar el código generado, etc.”.

11
(Esparsa, 2016)

• Meta compilador: es sinónimo de compilador de compiladores y se refiere a


un programa que recibe como entrada las especificaciones del lenguaje para
el que se desea obtener un compilador y genera como salida el compilador
para ese lenguaje. El desarrollo de los metas compiladores se encuentra
con la dificultad de unir la generación de código con la parte de análisis. Lo
que sí se han desarrollado son generadores de analizadores léxicos y
sintácticos. (Esparsa, 2016)

• Descompilador: “Es un programa que acepta como entrada código


máquina y lo traduce a un lenguaje de alto nivel, realizando el proceso
inverso a la compilación”. (Alfonseca & Alfonso., 2005)

2. 5.- Funciones de un compilador

La función principal que cumple un compilador es traducir a un lenguaje


mucho más sencillo y entendible por la máquina, informa al usuario si existen
errores en el código fuente con el fin de ejecutar la aplicación sin problema, si
existe algún error simplemente se detiene. (Fernandez, 2013)
A grandes rasgos un compilador es un programa que lee un programa
escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa
equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este
proceso de traducción, el compilador informa a su usuario de la presencia de
errores en el programa fuente. (sonricks)

A primera vista, la diversidad de compiladores puede parecer


abrumadora. Hay miles de lenguajes fuente, desde los lenguajes de
programación tradicionales, como FORTRAN o Pascal, hasta los lenguajes
especializados que han surgido virtualmente en todas las áreas de aplicación
de la informática. Los lenguajes objeto son igualmente variados; un lenguaje
objeto puede ser otro lenguaje de programación o el lenguaje de máquina de
cualquier computador entre un microprocesador y un supercomputador.
(Alfonseca & Alfonso., 2005)
Es difícil dar una fecha exacta de la aparición del primer compilador,
porque en un principio gran parte del trabajo de experimentación y aplicación
se realizó de manera independiente por varios grupos. Gran parte de los
primeros trabajos de compilación estaba relacionada con la traducción de
fórmulas aritméticas a código de máquina. (Rojas., 2011)
EL primer compilador de FORTRAN, por ejemplo, necesitó para su
implantación de 18 años de trabajo en grupo (Backus y otros [1975]). Desde
entonces, se han descubierto técnicas sistemáticas para manejar muchas de
las importantes tareas que surgen en la compilación. También se han
desarrollado buenos lenguajes de implantación, entornos de programación y
herramientas de software. Con estos avances, puede hacerse un compilador
real incluso como proyecto de estudio en un curso de un semestre
sobre diseño sobre de compiladores. (Alfonseca & Alfonso., 2005)

12
2.6.- FASES DE UN COMPILADOR

• Analizador léxico: “Es un análisis a nivel de caracteres, su misión es


reconocer los componentes léxicos o token, enviando al analizador
sintáctico los tokens y sus atributos”. (Cortez, 2007)

• analizador sintáctico: “Es un análisis jerárquico. Implica agrupar los


componentes léxicos del programa fuente en frases gramaticales que el
compilador utiliza para sintetizar la salida. Estas frases gramaticales se
representan mediante un árbol. (Cortez, 2007)

• Analizador semántico: “Revisa el programa fuente para tratar de


encontrar errores semánticos. Un componente importante del análisis
semántico es la verificación de tipos”. (Cortez, 2007)

• Generación de código intermedio: “Después del análisis sintáctico y


semántico, algunos compiladores generan una representación intermedia
explicita del programa fuente. Esta puede tener diversas formas: código de
3 direcciones, que es una secuencia de instrucciones, cada una de las
cuales tiene máximo 3 operandos. (Esparsa, 2016)

• “Optimizador de código: “Trata de mejorar el código intermedio, de modo


que resulte un código de maquina más rápido de ejecutar. (Esparsa, 2016)

• “Generación de código: Esta es la fase final de un compilador, que por lo


general consiste en código de maquina relocalizarle o código ensamblador.
(Esparsa, 2016)

2.7.-Formas de examinar un compilador

• El análisis: divide al programa fuente en sus elementos componentes y


crea una representación intermedia.

Durante el análisis se determina las operaciones que implica el programa


fuente y se registra en una estructura jerárquica llamada árbol. A menudo,
se usa una clase especial de árbol llamado árbol sintáctico, donde cada
nodo representa una operación y los hijos de un nodo son los argumentos
de la operación. (asprillavarela, 2015)

• La síntesis: “es la que requiere la técnica más especializada”.


(asprillavarela, 2015)

13
2.8.- Como se sintetiza el código objeto de un compilador

Código objeto: tiende el ordenador directamente: binario o código


máquina. Provienen de la traducción de cierto código fuente, es un fragmento
del programa final y es específico de la plataforma de ejecución. (Wikipedia,
Código objeto, 2018)
En programación, se llama código objeto al código que resulta de
la compilación del código fuente. Puede ser en lenguaje máquina o bytecode, y
puede distribuirse en varios archivos que corresponden a cada código fuente
compilado. Luego un enlazador (linker) se encarga de juntar todos los archivos
de código objeto para obtener el programa ejecutable. (asprillavarela, 2015)
Consiste en lenguaje máquina o bytecode y se distribuye en varios
archivos que corresponden a cada código fuente compilado. Para obtener
un programa ejecutable se han de enlazar todos los archivos de código objeto
con un programa llamado enlazador (linker). (asprillavarela, 2015)

2.9.- Árboles sintácticos para la representación de cómo se


sintetiza el código objeto de un compilador

Es la fase del analizador que se encarga de chequear el texto de


entrada en base a una gramática dada. Y en caso de que el programa de
entrada sea válido, suministra el árbol sintáctico que lo reconoce. (Aguilera,
2016)
Árbol sintáctico de una sentencia de un lenguaje, es una
representación que se utiliza para describir el proceso de derivación de dicha
sentencia. Como nodos internos del árbol, se sitúan los elementos no
terminales de las reglas de producción que vayamos aplicando, y tantos hijos
como símbolos existan en la parte derecha de dichas reglas. (Aguilera, 2016)

14
CAPÍTULO III

INTERPRETES

3.1.- DEFINICION:

Según (Labra Gayo, Noviembre 2003) “Un intérprete es un programa que


analiza y ejecuta simultáneamente un programa escrito en un lenguaje fuente.
Los intérpretes a diferencia de los compiladores o de los ensambladores
en que mientras estos traducen un programa desde su descripción en un
lenguaje de programación al código de la máquina del sistema. Los intérpretes
solo 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.

3.2.- ESTRUCTURA:

A la hora de construir un intérprete es conveniente utilizar una


Representación Interna (RI) de lenguaje fuente a analizar. De esta forma, la
organización interna de la mayoría de los intérpretes se descompone en los
módulos. (Alfonseca & Alfonso., 2005)

Traductor a Representación Interna: Toma como entrada el código del


programa P en Lenguaje Fuente, lo analiza y lo transforma a la representación
interna correspondiente a dicho programa P. (Alfonseca & Alfonso., 2005)
Representación Interna (P/RI): La representación interna debe ser
consistente con el programa original. Entre los tipos de representación interna,
los árboles sintácticos son los más utilizados y, si las características del
lenguaje lo permiten, pueden utilizarse estructuras de pila para una mayor
eficiencia. (Alfonseca & Alfonso., 2005)
Tabla de símbolos: Durante el proceso de traducción, es conveniente ir
creando una tabla con información relativa a los símbolos que aparecen. La
información a almacenar en dicha tabla de símbolos depende de la complejidad
del lenguaje fuente. Se pueden almacenar etiquetas para instrucciones de
salto, información sobre identificadores (nombre, tipo, línea en la que aparecen,
etc.) o cualquier otro tipo de información que se necesite en la etapa de
evaluación. (Labra Gayo, Noviembre 2003)
Evaluador de Representación Interna: A partir de la Representación
Interna anterior y de los datos de entrada, se llevan a cabo las acciones
indicadas para obtener los resultados. Durante el proceso de evaluación es
necesario contemplar la aparición de errores. (Labra Gayo, Noviembre 2003)
15
Tratamiento de errores: Durante el proceso de evaluación pueden
aparecer diversos errores como desbordamiento de la pila, divisiones por cero,
etc. que el intérprete debe contemplar. (Alfonseca & Alfonso., 2005)

3.3.- INTERPRETACION

3.3.1.- Interpretación iterativa:

La interpretación iterativa es apropiada para lenguajes sencillos, donde


se analiza y ejecuta cada expresión de forma directa, como podrían ser los
códigos de máquinas abstractas o lenguajes de sentencias simples. La
interpretación consiste en un ciclo básico de búsqueda, análisis y ejecución de
instrucciones. (Rojas., 2011)

3.3.2.- Interpretación recursiva:

Una primera fase de especificación semántica mediante la construcción


de un intérprete prototipo que actúa como una especificación ejecutable.
segunda fase de implementación del compilador de dicho lenguaje. Para la
construcción de prototipos suele utilizarse un modelo de interpretación
recursiva donde las sentencias pueden estar compuestas de otras sentencias y
la ejecución de una sentencia puede lanzar la ejecución de otras sentencias de
forma recursiva.
Los intérpretes recursivos no son apropiados para aplicaciones
prácticas debido a su ineficiencia y se utilizan únicamente como prototipo
ejecutable del lenguaje. El problema de especificar un lenguaje mediante un
intérprete prototipo es decidir en qué lenguaje se implementa dicho intérprete.
Dicho lenguaje debe ser suficientemente expresivo y no ambiguo para definir
claramente cómo funcionan las diferentes construcciones. En muchos casos se
opta por utilizar lenguajes ya implementados pero que carecen de una
especificación semántica clara. (Rojas., 2011)

3.4.- VENTAJAS DE LA UTILIZACION DE INTÉRPRETES:

En general, la utilización de compiladores permite construir programas


más eficientes que los correspondientes interpretados. Esto es debido a que
durante la ejecución de código compilado no es necesario realizar complejos
análisis (ya se hicieron en tiempo de compilación), además, un buen
compilador es capaz de detectar errores y optimizar el código generado.
(Rojas., 2011)

16
Los intérpretes, por definición, realizan la fase de análisis y
ejecución a la vez, lo cual imposibilita tales optimizaciones. Por esta razón, los
sistemas interpretados suelen ser menos eficientes que los compilados. No
obstante, los nuevos avances informáticos aumentan la velocidad de
procesamiento y capacidad de memoria de los ordenadores. Actualmente, la
eficiencia es un problema menos grave y muchas veces se prefieren sistemas
que permitan un desarrollo rápido de aplicaciones que cumplan fielmente la
tarea encomendada. (Rojas., 2011)
A continuación, se enumeran una serie de ventajas de los sistemas
interpretados: Los intérpretes, en general, son más sencillos de implementar.
Lo cual facilita el estudio de la corrección del intérprete y proporciona nuevas
líneas de investigación como la generación automática de intérpretes a partir
de las especificaciones semánticas del lenguaje (Rojas., 2011).
Proporcionan una mayor flexibilidad que permite modificar y ampliar
características del lenguaje fuente. Muchos lenguajes como Lisp, APL, Prolog,
etc. surgieron en primer lugar como sistemas interpretados y posteriormente
surgieron compiladores. (Rojas., 2011)
No es necesario contener en memoria todo el código fuente. Esto
permite su utilización en sistemas de poca memoria o en entornos de red, en
los que se puede obtener el código fuente a medida que se necesita. (Rojas.,
2011)
Facilitan la meta-programación. Un programa puede manipular su
propio código fuente a medida que se ejecuta. Esto facilita la implementación
de sistemas de aprendizaje automatizado y reflectividad. (Rojas., 2011)
Aumentan la portabilidad del lenguaje: Para que el lenguaje
interpretado funcione en otra máquina sólo es necesario que su intérprete
funcione en dicha máquina. Puesto que no existen etapas intermedias de
compilación, los sistemas interpretados facilitan el desarrollo rápido de
prototipos, potencian la utilización de sistemas interactivos y facilitan las tareas
de depuración. (Rojas., 2011)

3.4.1.- 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”.
(Alfonseca & Alfonso., 2005)

• “Permiten una mayor interactividad con el código en tiempo de desarrollo”.


(Alfonseca & Alfonso., 2005)

17
3.5.- TIPOS DE INTÉRPRETES

A continuación, se va a realizar una clasificación de los diferentes


métodos de interpretación según la estructura interna del intérprete. Es
conveniente observar que algunos métodos podrían considerarse híbridos, ya
que mezclan los procesos de compilación e interpretación. (Labra Gayo,
Noviembre 2003)

3.5.1.- Intérpretes puros:

Los intérpretes puros son los que analizan y ejecutan sentencia a


sentencia todo el programa fuente. Siguen el modelo de interpretación iterativa
y, por tanto, se utilizan principalmente para lenguajes sencillos. Los intérpretes
puros se han venido utilizando desde la primera generación de ordenadores al
permitir la ejecución de largos programas en ordenadores de memoria
reducida, ya que sólo debían contener en memoria el intérprete y la sentencia a
analizar y ejecutar en cada momento. El principal problema de este tipo de
intérpretes es que, si a mitad del programa fuente se producen errores, se debe
de volver a comenzar el proceso. (Labra Gayo, Noviembre 2003)

3.5.2.-Intérpretes avanzados:

Los intérpretes avanzados o normales incorporan un paso previo de


análisis de todo el programa fuente. Generando posteriormente un lenguaje
intermedio que es ejecutado por ellos mismos. De esta forma en caso de
errores sintácticos no pasan de la fase de análisis. Se utilizan para lenguajes
más avanzados que los intérpretes puros, ya que permiten realizar un análisis
más detallado del programa fuente (comprobación de tipos, optimización de
instrucciones, etc.) (Labra Gayo, Noviembre 2003)

3.5.3.-intérpretes incrementales:

Existen ciertos lenguajes que, por sus características, no se pueden


compilar directamente. La razón es que pueden manejar objetos o funciones
que no son conocidos en tiempo de compilación, ya que se crean
dinámicamente en tiempo en ejecución. Entre estos lenguajes, pueden
considerarse Smalltalk, Lisp o Prolog. Con el propósito de obtener una mayor
eficiencia que en la interpretación simple, se diseñan compiladores
incrementales. La idea es compilar aquellas partes estáticas del programa en
lenguaje fuente, marcando como dinámicas las que no puedan compilarse.
Posteriormente, en tiempo de ejecución, el sistema podrá compilar algunas
partes dinámicas o recompilar partes dinámicas que hayan sido modificadas.

18
Estos sistemas no producen un código objeto independiente, sino que
acompañan el sistema que permite compilar módulos en tiempo de ejecución
(run time system) al código objeto generado. Normalmente, los compiladores
incrementales se utilizan en sistemas interactivos donde conviven módulos
compilados con módulos modificables. (Labra Gayo, Noviembre 2003)

3.6.-EVALUADORES PARCIALES

La utilización de evaluadores parciales o especializadores surge al


considerar que muchos programas contienen dos tipos de datos de entrada.
Existen una serie de datos de entrada que son diferentes en cada ejecución
mientras que otros datos no varían de una ejecución a otra. El primer conjunto,
se conoce como datos de entrada dinámicos (se denotará como Din), mientras
que el segundo conjunto, serían los datos de entrada estáticos (Est). Dado un
programa P, el proceso de valuación
parcial consiste en construir otro programa especializado Pest para los
datos estáticos de P. El programa Pest suele estar escrito en el mismo lenguaje
fuente que P y se debe garantizar que cuando se le presenten los datos
dinámicos produzca los mismos resultados que si se hubiesen presentado
todos los datos al programa P original. (Labra Gayo, Noviembre 2003)

CONCLUSIONES

• Un traductor es aquel que traduce o convierte desde un texto o


programa escrito en un lenguaje fuente hasta un texto o programa.

• Los intérpretes realizan la fase de análisis y ejecución a la vez, lo cual


imposibilita tales optimizaciones. Por esta razón, los sistemas
interpretados suelen ser menos eficientes que los compilados.

• 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 maquina será
capaz de interpretar.

19
V ANEXOS

20
21
VI.- REFERENCIAS BIBLIOGRAFICAS:

Aguilera, M. y. (2016). Análisis Sintáctico.

Alfonseca, M., & Alfonso., O. (2005). Compiladores e Interpretes:teoria practico. MEXICO:


TRILLAS.

asprillavarela. (13 de Junio de 2015). Compiladores. Obtenido de


http://compiladoresuni.blogspot.com/2015/06/forma-de-examinar-de-un-
compilador.html

Celaya. (2012). Traductores y Compiladores. México: Lince.

Cortez. (14 de Febrero de 2007). sciatel Bolivia. Obtenido de Telewiki:


https://sciatel.wikispaces.com/TRADUCTORES+DEL+LENGUAJE+DE+PROGRAMACION

Esparsa, L. (2 de Febrero de 2016). PREZI. Obtenido de


https://prezi.com/ckwlh6qqujod/traductores-de-lenguaje-de-programacion/

Fernandez. (22 de Octubre de 2013). Mis tareas. Obtenido de


http://gaferz.blogspot.com/2013/10/importancia-de-un-compilador.html

Galves, R. S. (2011). Traductores y Compiladores . Texas: Open Course Ware.

Labra Gayo, C. L. (Noviembre 2003). Interpretes y diseño de lenguajes de programacion.


España: SERVITEC.

Octavio. (1 de Abril de 2013). Cursos y Formación. Obtenido de Cursos y Formación:


http://cursosyformacion.eu/traductores-de-lenguajes-de-programacion/

Rojas., G. (2011). Traductores, Compiladores, Interpretes. ESPAÑA: Creado por la Universidad


de Malaga.

sonricks. (s.f.). sonricks.com. Obtenido de


http://sonricks.com/Apuntes/Funciones%20de%20un%20compilador.doc

Wikipedia. (2017). Compilador.

Wikipedia. (2018). Código objeto. Obtenido de


https://es.wikipedia.org/wiki/C%C3%B3digo_objeto

22
23