lunes, 30 de mayo de 2016

Clase 2.1 Introducción al proceso de compilación

¿Que es un Traductor?

Un traductor es un programa que toma como entrada un texto escrito en un lenguaje y da como salida otro texto en un lenguaje diferente.




Ejemplos del traductor.

Mensaje de error.

Tipos de Traductores.

  • Compilador: es un traductor que convierte un texto escrito en un lenguaje de alto nivel a un lenguaje de bajo nivel (código objeto o máquina).
  • Ensamblador: es un lenguaje de bajo nivel, donde cada sentencia del lenguaje fuente se traduce a una instrucción en código máquina.
  • Interprete: no genera código objeto, analiza y ejecuta directamente cada proposición del código fuente.
  • Preprocesador: procesan un texto fuente modificándolo en cierta forma previamente a la compilación.
¿Como saber si estamos ante un compilador?

Cuando el lenguaje fuente esta en un lenguaje de programación de alto nivel y el objeto generado sea de bajo nivel (ensamblador o código de maquina).


Resultado del compilador:



Ventajas de los compiladores.
  • Producen un código optimizado.
  • La ejecución del programa objeto es mucho mas rápida que si se interpreta el programa fuente
  • El compilador tiene una visión global del programa, por lo que la información de mensajes de error es más detallada.

Desventajas de los compiladores.
  • Se debe de ejecutar muchas veces el código fuente para ver los cambios en el resultado.
  • Mayor consumo de memoria.
Interprete: 

Es un programa que analiza y ejecuta simultáneamente el programa fuente, es decir no producen un código objeto, siendo su ejecución simultánea a la del programa fuente.

Comportamiento del Interprete:

Un interprete es como un compilador, solo que la salida es una ejecución. El programa de entrada se reconoce y ejecuta a la vez. No se produce un resultado físico (código máquina) sino lógico (una ejecución).

Resultado del interprete




Contexto del compilador.


Etapas de compilación.


Token: es una cadena de caracteres que tiene un significado coherente un lenguaje de programación.

En la etapa de análisis se divide el programa fuente en sus piezas constituyentes y crea una representación intermedia del mismo.

En la etapa de síntesis se construye el programa destino deseado a partir de una descripción en un lenguaje de representación intermedia.


Análisis Léxico.
El analizador léxico o scanner, transforma el texto fuente en una secuencia ordenada de elementos léxicamente válidos (tokens).






Funciones del Análisis Léxico.

El analizador léxico debe reconocer y presentar los caracteres Tokens en una representación más útil para el analizador sintáctico.

Además de:
  • Eliminar espacios.
  • Ignorar comentarios.
  • Tratar con la tabla de símbolos.
  • Reconocer identificadores y palabra reservada.
  • Manejar el fichero fuente.
  • Contabilizar posición de tokens.
  • Procesar macros, constantes, includes..
  • Generar tokens bajo demanda del analizador sintáctico.
  • Estructurar la colección de tokens.
  • Identificar la colección de tokens.
  • Describir el lenguaje como expresiones regulares.
  • Especificar un diagrama de transición.
  • Traducir el diagrama a una tabla de transición.
Analizador Sintáctico.

El analizador sintáctico o parser recibe los tokens y comprueba su ordenación correcta. Genera un árbol sintáctico.


Tipos de Analizadores Sintácticos.


Análisis Semántico
  • El analizador semántico comprueba que el árbol sintáctico es semánticamente válido.
  • Revisa el programa fuente para comprobar que las reglas semánticas se cumplen.
  • Genera un árbol semántico o etiquetado.

Generación de código intermedio.
  • Después de los análisis sintácticos y semánticos, algunos compiladores generan una representación intermedia explicita del programa fuente.
  • Se puede considerar esta representación intermedia como un programa para una maquina abstracta.
  • Esta representación intermedia debe tener dos propiedades importantes, debe ser fácil de producir y fácil de traducir al programa objeto.
Optimización de código.
  • La fase de optimización 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.
  • Hay mucha variación en la cantidad de optimización de código que ejecutan los distintos compiladores, una parte significativa del tiempo del compilador se ocupa en esta fase. 
  • La fase Final de un compilador es la generación de código objeto, que por lo general consiste en código máquina relocalizable código ensamblador.
  • Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa.
  • Después cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de máquina que ejecutan la misma tarea.







domingo, 29 de mayo de 2016

Clase Nº 2 Clasificación de los interpretes.

¿Que es un interprete?

  • En lugar de producir un programa objeto como resultado de una traducción, un interprete realiza las operaciones que implica el programa fuente.
  • Un interprete no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel, la traduce al código equivalente y al mismo tiempo la ejecuta.
  • Un interprete es un programa que analiza y ejecuta simultáneamente el programa fuente, es decir no producen un código objeto, siendo su ejecución simultanea a la del programa fuente.
Comportamiento de un interprete.
  • Un interprete es como un compilador, solo que la salida es una ejecución. El programa de entrada se reconoce y ejecuta a la vez. No se produce un resultado físico (código maquina) sino lógico (una ejecución).
  • Además de que la traducción optimiza el programa acercándolo a la máquina, los lenguajes interpretados tienen la característica de que permiten construir programas que se pueden modificar así mismos.
Resultado del interprete.


Ventajas de los interpretes.
  • Su principal ventaja es que permiten una fácil depuración. Permiten una mayor  interactividad con el código en tiempo de desarrollo.
  • En algunos lenguajes (Smalltalk, Prolog, LISP) está permitido y es frecuente añadir código según se ejecuta otro código, y esta característica solamente es posible implementarla en un interprete.
  • Puede ser interrumpido con facilidad.
  • Puede ser rápidamente modificado y ejecutado nuevamente.
  • Un interprete necesita menos memoria que un compilador.
  • Facilita la búsqueda de errores.
  • En algunos lenguajes esta permitido añadir código según se ejecuta otro código.
  • Menor consumo de memoria.
Desventajas de los interpretes.
  • Lentitud de ejecución, ya que al ejecutar a la vez que se traduce no puede aplicarse un alto grado de optimización. Cada instrucción  debe ser traducida a código maquina tantas veces como sea ejecutada.
  • Durante la ejecución, el interprete debe residir en memoria ya que no genera código objeto.
  • Tamaño del programa objeto, que exige añadir el intérprete al programa propiamente dicho.
Clasificación de los interpretes.
  • Interpretes Puros.
  • Interpretes Avanzados.
  • Interpretes Incrementales.
¿Que son los interpretes Puros?
  • Los interpretes puros son los que analizan una sentencia y la ejecutan, y así sucesivamente todo el programa fuente. Fueron los interpretes desarrollados en la primera generación de ordenadores, pues permitían la ejecución de largos programas con ordenadores de memoria muy reducida, ya que sólo debían contener en memoria el interprete y la sentencia a analizar y ejecutar.
  • El principal problema de este tipo de interpretes es que si a mitad del programa fuente se producen errores, se debe de reiniciar el proceso.
En la figura se representa el esquema general de un interprete puro, donde se puede observar que el lenguaje fuente se traduce a una representación interna (texto o binaria) que puede ser almacenada en memoria o en disco. Esta presentación interna tiene todas las instrucciones numeradas o colocadas consecutivamente en estructuras de tamaño fijo (por ejemplo un array o posiciones consecutivas de memoria, o un fichero binario de estructuras de tamaño fijo). Mientras se realiza este paso se puede construir la tabla de etiquetas, que es una tabla que contiene una estructura donde están todas las etiquetas y su posición en el programa fuente (las etiquetas se utilizan tanto en las instrucciones de salto como en las llamadas a procedimiento y funciones). Una vez que este proceso ha finalizado, comienza la ejecución por la primera instrucción del código, que se envía al evaluador de instrucciones, este la ejecuta (recibiendo datos si es necesario o enviando un mensaje de error). El evaluador de instrucciones también determina la instrucción siguiente a ejecutar, en algunos casos previa consulta a la tabla de etiquetas. En el caso de que no se haya saltos (GOTO) o llamadas a procedimientos o funciones se ejecuta la siguiente instrucción a la instrucción en curso. El evaluador de instrucciones puede utilizar dos métodos de evaluación. El método clásico es la evaluación voraz o ansiosa, donde se evalúan las expresiones completamente. Otro método clásico es la evaluación perezosa, evaluándose sólo la parte necesaria de la expresión (el resto no se evalúa).

Interpretes Avanzados.

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


Un ejemplo de interprete avanzado es el que utiliza el lenguaje Java. Así un programa en lenguaje java (con la extensión .java) se compila y produce uno o varios ficheros con la extensión .class, estos ficheros están en un formato binario denominado bytecode independiente de plataforma, que se interpreta posteriormente. Esto permite que el bytecode se ejecute en cualquier sistema operativo que disponga de un intérprete de bytecode. Dado que la mayor parte de los navegadores de Internet levan inmenso un interprete de bytecode, esto ha permitido al lenguaje Java ser uno de los más utilizados en aplicaciones que usen Internet.

Interpretes Incrementales.

Algunos lenguajes no se pueden compilar, debido a que entre sus características pueden manejar objetos o funciones que no son conocidos en tiempo de compilación, ya que son creados en ejecución. Para este tipo de lenguajes existen los interpretes incrementales, que permiten compilar los módulos completamente definidos, y recompilar en tiempo de ejecución los nuevos módulos. Los interpretes incrementales tienen gran interés en los lenguajes que permiten no definir los problemas completamente en tiempo de compilación. En estos casos se utilizan evaluadores parciales que toman como entrada el programa fuente junto con algunos datos (pero no todos), realizándose los cálculos que se pueden hacer con dicho subconjunto de datos, y produciendo una salida que contienen un residuo del programa fuente que se ha introducido.






Unidad 01 Introducción a los Traductores.

Existen dos tipos principales de traductores de lenguajes de programación de alto nivel:
  • Compiladores. 
  • Interpretes
¿Que son Lenguajes de programación?
Son los que ocupan una posición intermedia entre los lenguajes naturales humanos y los precisos lenguajes de máquina.
Gracias a la progresiva complejidad de los lenguajes traductores que permitenconvertir las instrucciones de un lenguaje de programación al lenguaje de máquina, la programación puede usar lenguajes de computación que se parecen cada vez más a los lenguajes naturales.
A los lenguajes máquina se les conoce como lenguajes de primera generación.
Los ensambladores son los lenguajes de segunda generación.
Los simbólicos de alto nivel de tipo procedural se les denomina de tercera generación y a los relacionales se considera que son de cuarta generación.
A la tercera generación pertenecen lenguajes conocidos como el FORTRAN, COBOL, RPG, BASIC, PL1, SIMULA, ALGOL, PASCAL, ADA, C, LISP, PROGOL.
SQL es un lenguaje convertido en estándar mundial como lenguaje de cuarta generación, una serie de lenguajes orientados a objetos. Entre estos destaca elVisual Basic de Microsoft. Además hay que prestar una seria atención al lenguaje de programación Java, desarrollado por SUN.
¿Que es un Compilador?
Es el proceso de traducción que convierte un programa fuente escrito en un lenguaje de alto nivel a un programa objeto en código máquina y listo por tanto para ejecutarse en el ordenador, con poca o ninguna preparación adicional.

Un compilador analiza el programa y lo traduce al idioma “maquina”. La acción fundamental de los compiladores es equivalente a la de un traductor humano , que toma nota de lo que esta escuchando y reproduce por escrito en otra lengua.

Esquema del compilador.


Fases del compilador.



¿Que es un Interprete?
Es el que analiza el programa fuente y lo ejecuta directamente, Ejemplo del traductor humano, éste sería un traductor humano que conforme a lo que está escuchando va ejecutando, sin generar ningún escrito, es decir que sobre la marcha va traduciendo.

Datos curiosos de los Compiladores.
  • En los 50 los compiladores eran considerados programas muy difíciles.
  • FORTRAN se desarrolló en grupo durante 18 años.
  • Se han desarrollado técnicas sistemáticas, entornos de programación y herramientas software que facilitan la tarea de desarrollo.
Linea de tiempo.