Está en la página 1de 19

Que es un intérprete y un compilador (su

clasificación y sus partes).


Compilador
El escritor del compilador, como cualquier programador, puede usar con provecho herramientas
de software tales como depuradores, administradores de versiones, analizadores, etcétera.
Además de estas herramientas de desarrollo de software, se han creado herramientas más
especializadas para ayudar a implantar varias fases de un compilador.

Clasificación:
a) Compilador cruzado. Genera un código ejecutable en un ordenador distinto de aquel en que se
realiza la compilación.

b) Compilador de montaje y ejecución. Se fragmenta el programa fuente en módulos que se


compilan por separado, y una vez compilados se unen mediante un enlazador para formar un
módulo ejecutable

c) Compilador en una pasada. Examina el código fuente una sola vez, generando el código objeto.

d) Compilador de pasadas múltiples Requiere varias lecturas del programa fuente para producir y
optimizar el código objeto.

e) Compilador de optimización. Lee el código fuente, lo analiza, optimiza y descubre errores


potenciales sin ejecutar el programa.

f) Compilador incremental. Compila el programa fuente, en caso de detectar errores al volver a


compilar el programa corregido, solo compila las modificaciones que se han hecho respecto al
primero.

g) Ensamblador. El lenguaje fuente es el lenguaje ensamblador.

h) Autocompilador. Es el compilador que está escrito en el mismo lenguaje a compilar,


básicamente nos sirve para hacer ampliaciones al lenguaje, mejorar el código generado, etc.

i) Metacompilador. “Compilador de compiladores”. Obtiene como entrada la definición de un


lenguaje y como salida el compilador para dicho lenguaje.

http://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro32/15_tipos_de_compiladores.html

En informática, un compilador es un tipo de traductor que transforma un programa entero de un


lenguaje de programación (llamado código fuente) a otro.1 Usualmente el lenguaje objetivo es
código máquina, aunque también puede ser traducido a un código intermedio (bytecode) o a
texto.
Clasificación:
Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber
compiladores que se adscriban a varias categorías:

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.

Partes:
El análisis léxico: constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha
y se agrupa en componentes léxicos (tókenes), que son secuencias de caracteres que tienen un
significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás
información innecesaria se elimina del programa fuente. También se comprueba que los símbolos
del lenguaje (palabras clave, operadores, etc.) se han escrito correctamente.

Análisis sintáctico: En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente
en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo
obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por
lo general, las frases gramaticales del programa fuente se representan mediante un árbol de
análisis sintáctico.

Análisis semántico: La fase de análisis semántico revisa el programa fuente para tratar de
encontrar errores semánticos y reúne la información sobre los tipos para la fase posterior de
generación de código. En ella se utiliza la estructura jerárquica determinada por la fase de análisis
sintáctico para identificar los operadores y operandos de expresiones y proposiciones.

Fase de síntesis: Consiste en generar el código objeto equivalente al programa fuente. Solo se
genera código objeto cuando el programa fuente está libre de errores de análisis, lo cual no quiere
decir que el programa se ejecute correctamente, ya que un programa puede tener errores de
concepto o expresiones mal calculadas

Generación de código intermedio: Después de los análisis sintáctico y semántico, algunos


compiladores generan una representación intermedia explícita del programa fuente. Se puede
considerar esta representación intermedia como un programa para una máquina abstracta.
Optimización de código: La fase de optimización de código consiste en mejorar el código
intermedio, de modo que resulte un código máquina más rápido de ejecutar. Esta fase de la etapa
de síntesis es posible sobre todo si el traductor es un compilador (difícilmente un intérprete puede
optimizar el código objeto)

https://es.wikipedia.org/wiki/Compilador

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. 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.

Clasificación:
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.

Una sola pasada: examina el código fuente una vez, generando el código o programa objeto.

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.

Optimación: lee un código fuente, lo analiza y descubre errores potenciales sin ejecutar el
programa.

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.

Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla.

Compilador cruzado: se genera código en lenguaje objeto para una máquina diferente de la que se
está utilizando para compilar.

Compilador con montador: compilador que compila distintos módulos de forma independiente y
después es capaz de enlazarlos.

Autocompilador: 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.

Metacompilador: 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.
Partes:
Cuando el analizador léxico detecta un identificador en el programa fuente, el identificador se
introduce en la tabla de símbolos. Sin embargo, normalmente los atributos de un identificador no
se pueden determinar durante el análisis léxico. Por ejemplo, en una declaración en Pascal como
var posición, inicial, velocidad: real.

Las fases de análisis sintáctico y semántico por lo general manejan una gran proporción de los
errores detectables por el compilador. La fase léxica puede detectar errores donde los caracteres
restantes de la entrada no forman ningún componente léxico del lenguaje. Los errores donde la
cadena de componentes léxicos viola las reglas de estructura (sintaxis) del lenguaje son
determinados por la fase del análisis sintáctico.

Generación de código intermedio

Después de los análisis sintáctico y semántico, algunos compiladores generan una representación
intermedia explícita del programa fuente. Se puede considerar esta representación intermedia
como un programa para una máquina abstracta. Esta representación intermedia debe tener dos
propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto

temp1 := entarea1(60)

temp2 := id3 * temp1 (2)

temp3 := id2 + temp2

id1 := temp3

Optimación de Código

La fase de optimación de código trata de mejorar el código intermedio de modo que resulte un
código de máquina más rápido de ejecutar. Algunas optimaciones son triviales. Por ejemplo, un
algoritmo natural genera el código intermedio (2) utilizando una instrucción para cada operador
de la representación del árbol después del análisis semántico, aunque hay una forma mejor de
realizar los mismos cálculos usando las dos instrucciones

Temp1 := id3 * 60.0 (3)

Id1 := id2 + temp1

https://www.monografias.com/trabajos11/compil/compil.shtml#par
Interprete
En ciencias de la computación, intérprete o interpretador es un programa informático capaz de
analizar y ejecutar otros programas. Los intérpretes se diferencian 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 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.

Clasificación:
Bytecode: es una representación altamente comprimida y optimizada del código fuente del Lisp,
pero no es código de máquina (y por lo tanto no está atado a cualquier hardware particular). Este
bytecode es entonces interpretado por un intérprete de bytecode (que está escrito en C).

Eficiencia: La desventaja principal de los interpretadores es que cuando se interpreta un


programa, típicamente corre más lentamente que si hubiera sido compilado. La diferencia en
velocidades puede ser minúscula o grande; a menudo un orden de magnitud y a veces más.

Interpretadores de árbol de sintaxis abstracta: En el espectro entre la interpretación y la


compilación, otro acercamiento está transformando el código fuente en un árbol de sintaxis
abstracta optimizado (AST), y después procediendo a ejecutar el programa siguiendo esta
estructura arborescente.

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

Ejemplos:
Motor Zend: es un motor de procesamiento para la interpretación y cifrado del código PHP,

CPython: es la implementación oficial y más ampliamente utilizada del lenguaje de programación


Python. Está escrita en C.

Ruby MRI: El intérprete de Ruby de Matz o Ruby MRI (también llamado CRuby ) fue la
implementación de referencia del lenguaje de programación Ruby llamado así por el creador de
Ruby Yukihiro Matsumoto ("Matz")

YARV: YARV ( Sin embargo, otra máquina virtual Ruby ) es un intérprete de código de bytes
desarrollado por Koichi Sasada para el lenguaje de programación Ruby

https://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)
Un intérprete es un programa o software capaz de analizar y ejecutar programas escritos en
lenguajes de alto nivel. Los intérpretes funcionan de manera distinta a los compiladores, ya que
van traduciendo y ejecutando el código hecho por el programador o desarrollador línea a línea,
cargando el código fuente y traduciendo las instrucciones a un lenguaje intermedio, para que el
programa pueda ser ejecutado por el ordenador o la computadora en donde se está ejecutando el
intérprete.

En pocas palabras, podemos decir que un intérprete genera un código binario que es interpretado
por el ordenador cada vez que se ejecuta el programa escrito en lenguaje de alto nivel.

Entre las principales características de los lenguajes interpretados, tenemos que son sumamente
sencillos de aprender, ya que son de alto nivel y se asemejan más al lenguaje humano.

Es por esta razón, que ganan popularidad y los intérpretes se vuelven cada vez más la opción ideal
para crear programas por parte de los desarrolladores profesionales y los aficionados.

Entre los lenguajes modernos que utilizan intérpretes, destacan Python, Perl, Java, entre otros.

https://culturacion.com/que-es-un-interprete/

Un intérprete es un programa que analiza y ejecuta simultáneamente un programa escrito en un


lenguaje fuente. En la Figura 1 se presenta el esquema general de un intérprete visto como una
caja negra. Cualquier intérprete tiene dos entradas: un programa P escrito en un lenguaje fuente
LF (en lo sucesivo, se denotará P/LF) junto con los datos de entrada; a partir de dichas entradas,
mediante un proceso de interpretación va produciendo unos resultados.

Estructura:

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.

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.
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.

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.

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.

Clasificación:

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 avanzados o normales incorporan un paso previo de análisis de todo el programa
fuente

Intérpretes incrementales La idea es compilar aquellas partes estáticas del programa en lenguaje
fuente, marcando como dinámicas las que no puedan compilarse

La utilización de evaluadores parciales o especializadores surge al considerar que muchos


programas contienen dos tipos de datos de entrada.

Autores: Jose Emilio Labra Gayo Juan manuel Cueva Lovelle Raúl Izquierdo Castanedo Aquilino
Adolfo Juan Fuente Mª Cándida Luengo Díez Francisco Ortín Soler Universidad de Oviedo - España

Editorial: SERVITEC

ISBN: 84-688-4210-9

1ª Edición : Oviedo, Noviembre 2003

file:///C:/Users/PabloAntoiio/Downloads/35_InterpretesDLP%20(1).pdf

Proceso de compilador
1. Cuando un código es leído por un compilador este entra al análisis léxico donde se
verifica dónde empieza y termina cada instrucción, esto se hace tomando como referencia
los espacios en blanco.
2. Una vez hecho esto el analizador sintáctico llama de manera repetida al analizador
léxico para que este le envié cada línea de código para ser verificada si está bien escrita en
el lenguaje. Para realizar esta verificación se realiza por medio de una estructura llamada
Árbol gramatical.
Ejemplo:

3. Después entra en la etapa del analizador semántico, esta se encarga de la construcción


de las instrucciones del lenguaje, revisando que sean iguales a las definidas.
4. Luego entramos al proceso de síntesis, donde se generas el código intermedio, este
para ser utilizado en la memoria de forma temporal.
5. Ahora este código generado pasa por el optimizador para ser ejecutado de forma más
rápida.
6. En esta última etapa se genera un código que sea entendible por la máquina para ser
ejecutado por la computadora.
*Ejemplo de un lenguaje de interprete y compilador

*Como funciona los analizadores en un compilador

LEX
Lex ayuda a escribir programas cuyo flujo de control está dirigido por instancias de
expresiones regulares en la secuencia de entrada. Es muy adecuado para
transformaciones de tipo editor-script y para segmentar entradas en preparación para una
rutina de análisis.
La fuente Lex es una tabla de expresiones regulares y fragmentos de programa
correspondientes. La tabla se traduce a un programa que lee una secuencia de entrada, la
copia en una secuencia de salida y divide la entrada en cadenas que coinciden con las
expresiones dadas. A medida que se reconoce cada cadena de este tipo, se ejecuta el
fragmento de programa correspondiente. El reconocimiento de las expresiones se realiza
mediante un autómata finito determinista generado por Lex. Los fragmentos de programa
escritos por el usuario se ejecutan en el orden en que se producen las expresiones
regulares correspondientes en la secuencia de entrada.
YACC(ME Lesk y E. Schmidt)
La entrada del programa de computadora generalmente tiene alguna estructura; de
hecho, se puede pensar que cada programa de computadora que ingresa define un ``
lenguaje de entrada '' que acepta. Un lenguaje de entrada puede ser tan complejo como
un lenguaje de programación o tan simple como una secuencia de números.
Desafortunadamente, las instalaciones de entrada habituales son limitadas, difíciles de
usar y, a menudo, son laxas para verificar la validez de sus entradas.

Yacc proporciona una herramienta general para describir la entrada a un programa de


computadora. El usuario de Yacc especifica las estructuras de su entrada, junto con el
código a invocar a medida que se reconoce cada estructura. Yacc convierte dicha
especificación en una subrutina que maneja el proceso de entrada; con frecuencia, es
conveniente y apropiado tener la mayor parte del flujo de control en la aplicación del
usuario manejada por esta subrutina.

Flex(Vern Paxson)
flex es una herramienta para generar escáneres: programas que reconocen patrones
léxicos en el texto. flex lee los archivos de entrada dados, o su entrada estándar si no se
dan nombres de archivos, para generar una descripción de un escáner.
La descripción está en forma de pares de expresiones regulares y código C, llamadas
reglas. flex genera como salida un archivo fuente C, `lex.yy.c ', que define una rutina` yylex
()'. Este archivo se compila y se vincula con la biblioteca '-lfl' para producir un ejecutable.
Cuando se ejecuta el ejecutable, analiza su entrada en busca de ocurrencias de las
expresiones regulares. Cada vez que encuentra uno, ejecuta el código C correspondiente.

BISON (Charles Donnelly y Richard Stallman)


Bison es un generador de analizador de propósito general que convierte una descripción
gramatical para una gramática libre de contexto LALR (1) en un programa en C para
analizar esa gramática. Una vez que domine Bison, puede usarlo para desarrollar una
amplia gama de analizadores de idiomas, desde los utilizados en calculadoras de escritorio
simples hasta lenguajes de programación complejos.

Bison es compatible con Yacc: todas las gramáticas de Yacc correctamente escritas
deberían funcionar con Bison sin cambios. Cualquier persona familiarizada con Yacc
debería poder usar Bison con pocos problemas.
Lex y Yacc
John R. Levine, Tony Mason, Doug Brown
Libro en rústica - 366 páginas 2da / edición actualizada (octubre de 1992)
O'Reilly & Associates
ISBN: 1565920007

Compiladores: principios, técnicas y herramientas


Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman
Addison-Wesley Pub Co
ISBN: 0201100886

Implementación del compilador moderno en C


Andrew W. Appel,
tapa dura de Maia Ginsburg - 560 páginas Rev expand edition (enero de 1998)
Cambridge University Press
ISBN: 052158390X

http://dinosaur.compilertools.net/
ejemplos
La siguiente entrada de flex especifica un escáner que siempre que encuentre la cadena
"username" la reemplazará por el nombre de entrada al sistema del usuario:

%%
username printf( "%s", getlogin() );
Por defecto, cualquier texto que no reconozca el analizador léxico de flex se copia a la
salida, así que el efecto neto de este escáner es copiar su fichero de entrada a la salida con
cada aparición de "username" expandida. En esta entrada, hay solamente una regla.
"username" es el patrón y el "printf" es la acción. El "%%" marca el comienzo de las reglas.
http://www.ugr.es/~agsh/ejemplos_yacc.txt

Que es un analizador lexicográfico


Se encarga de buscar los componentes léxicos o palabras que componen el programa
fuente, según unas reglas o patrones. La entrada del analizador léxico podemos definirla
como una secuencia de caracteres.

El analizador léxico tiene que dividir la secuencia de caracteres en palabras con significado
propio y después convertirlo a una secuencia de terminales desde el punto de vista del
analizador sintáctico, que es la entrada del analizador sintáctico.
El analizador léxico reconoce las palabras en función de una gramática regular de manera
que sus NO TERMINALES se convierten en los elementos de entrada de fases posteriores.
En LEX, por ejemplo, esta gramática se expresa mediante expresiones regulares.
El analizador léxico es la primera fase de un compilador. Su principal función consiste en
leer los caracteres de entrada y elaborar como salida una secuencia de componentes
léxicos que utiliza el analizador sintáctico para hacer el análisis. Esta interacción, suele
aplicarse convirtiendo al analizador léxico en una subrutina o corrutina del analizador
sintáctico. Recibida la orden “Dame el siguiente componente léxico”del analizador
sintáctico, el analizador léxico lee los caracteres de entrada hasta que pueda identificar el
siguiente componente léxico.

Otras funciones que realiza:


• Eliminar los comentarios del programa.
• Eliminar espacios en blanco, tabuladores, retorno de carro, etc, y en general, todo
aquello que carezca de significado según la sintaxis del lenguaje.
• Reconocer los identificadores de usuario, números, palabras reservadas del lenguaje, ...,
y tratarlos correctamente con respecto a la tabla de símbolos (solo en los casos que debe
de tratar con la tabla de símbolos).
• Llevar la cuenta del número de línea por la que va leyendo, por si se produce algún
error, dar información sobre donde se ha producido.
• Avisar de errores léxicos. Por ejemplo, si @ no pertenece al lenguaje, avisar de un error.
• Puede hacer funciones de preprocesador.
file:///C:/Users/Residencia/Downloads/tictema2.pdf

compiladores en línea
Ideone
es un compilador en línea una colección de compiladores en línea, que permite escribir,
compilar y ejecutar código fuente escrito en más de 60 lenguajes de programación. Basta
con entrar a la página web, escribir o copiar tu código dar click en Run y listo, el código se
ejecuta.

Hay una cantidad bastante grande de lenguajes con los que funciona, entre ellos C, C++,
Java y, claro que sí, C#.
¿Qué se puede hacer con él?
Lo que se puede hacer con una aplicación de consola recién creada: salidas y entradas de
texto.
Crear breves fragmentos de código y compartirlos con otras personas, ellos pueden ver el
código, copiarlo y compilarlo.
Llevar un registro de los códigos que hemos creado, así como etiquetarlos para crear
colecciones y tener un poco más de control sobre ellos.
https://thatcsharpguy.com/posts/ideone/

https://ideone.com/

CoderPad
es como EtherPad o Google Docs, pero está diseñado para permitir que los candidatos
realmente escriban programas que se ejecutan. Es simple, rápido y notablemente
poderoso.
facilita la compilación y ejecución de código en más de 20 de los lenguajes de
programación más populares . Se tarda cinco segundos desde el comienzo de una
entrevista hasta ejecutar un "Hello, World" en Java. Hacemos un esfuerzo adicional para
hacer que las entrevistas sean sorprendentemente agradables:
En C, C ++ y Objective-C, vea los seguimientos automáticos de la pila con sus programas
segfault.
En Ruby, Python y JavaScript, las excepciones se capturan inmediatamente en REPL.
Además, tienes un REPL.
Reproduzca cualquier entrevista pulsación de tecla por pulsación de tecla. No se preocupe
por perder el código de una entrevista nuevamente.
https://coderpad.io/

https://coderpad.io/4FF4MHYN

Online C compiler

El paiza.IO permite editar y copilar en línea. Es compatible con más de 20 lenguajes: C, C++, Java,
Ruby, Python, PHP, Perl... y más. Puede utilizarlo para aprender a programar, escribir archivos por
lotes, como web scraper, etc .

https://www.onlinegdb.com/online_c_compiler https://paiza.io/es/languages/online-c-compiler
iDoodle

La aplicación web original de iDoodle se escribió en JavaScript y usó un elemento de lienzo HTML
para permitir a los usuarios crear y guardar dibujos en el iPhone antes de que se abriera la tienda
de aplicaciones. Esta puede haber sido la primera aplicación de dibujo en el iPhone.

https://www.idoodleapp.com/index.html http://www.idoodleapp.com/index.php
EXAMENES
1) https://www.daypo.com/test-compiladores-2.html

2); https://www.daypo.com/teoria-compiladores.html

También podría gustarte