unidad1

Que es un intérprete y un compilador (su clasificación y sus partes). Compilador El escritor del compilador, como cualqu

Views 223 Downloads 7 File size 637KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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