miércoles, 1 de junio de 2016

Evidencia mas relevante

INICIO COMPILADORES

Historia
C++ es un lenguaje de programación creado por Bjarne Stroustrup en los laboratorios de At&T en 1983.
El C++ es un derivado del mítico lenguaje C, el cual fue creado en la década de los 70 por la mano del Dennis Ritchie para la programación del sistema operativo, el cual surgió como un lenguaje orientado a la programación de sistemas y de herramientas recomendado sobre todo para programadores expertos, y que no llevaba implementadas muchas funciones
Un programa en C++ está definido por funciones (grupo de instrucciones que pueden o no hacer algún cálculo), donde la función principal debe ser llamada main.

La composición general de un programa en C++ es:
directivas de preprocesamiento. declaración globales. función main. funciones definidas por el usuario. comentarios para entender el funcionamiento del programa.
Componentes

Directivas
En particular, en C la directiva para incluir bibliotecas es como las siguientes: Ejemplos: #include <iostream.h>
Esta directiva permitirá utilizar la función de lectura cin y la función de escritura cout propias de C++. #include <stdio.h> Esta directiva permitirá utilizar las funciones de lectura y escritura propias de C.

Estas directivas también funcionan con C++, aunque existen algunos compiladores que no las soportan en cuyo caso es necesario hacer uso de los namespaces.

Un namespace es una declaración de región. El propósito de estos es localizar el nombre de identificadores para evitar colisiones.
Para tener compatibilidad, cuando un programa en C++ incluye una librería de C, haremos uso del namespace.

Ejemplo: En C tenemos #include <iostream.h>
Con el respectivo en C++ #include <iostream> using namespace std;

Declaraciones Globales
Las declaraciones globales son definiciones de variables o constantes que serán utilizadas por cualquiera de todas las funciones definidas en el programa.
La sintaxis para la declaración de una variable es: Tipo var1, var2,..., var3;
o bien Tipo var1= valor, var2,..., var3;

Función main
La función main( ), es obligatoria en cada programa C, C++.
Indica el comienzo del programa y requiere los paréntesis ( ) a continuación de main( ).
Funciones definidas por el usuario
La definición de una función se realiza escribiendo primero el tipo del valor de retorno de la función, después el nombre de la función, posteriormente entre paréntesis las variables que utilizará dicha función (parámetros) y finalmente las instrucciones de la función. Ejemplos:
double promedio( int a, int b, int c) { return (a + b + c ) / 3.0; }
Declara a la función promedio, la cual recibe tres valores enteros y calcula y regresa el promedio de ellos.

Comentarios
Los comentarios pueden escribirse utilizando alguna de las siguientes formas:
1. comentando en la misma línea, utiliza //, ejemplo
int edad; // la edad se utilizará como un valor entero.
2. comentando entre varias líneas, utiliza /* */, ejemplo:
/* La siguiente función promedio recibe tres valores enteros
y calcula y regresa el promedio de los tres a través
de un valor real */

Tipos de Datos
Los tipos de datos que maneja C++ son :
Enteros Dentro de los enteros están los tipos: short, int, long, los cuales varían en rango de acuerdo al compilador que se utilice, siendo long rango mayor y short el de menor.
Flotantes Dentro de los flotantes C++ tiene los tipos: float, double y long double donde al igual que los enteros varía el rango de cada uno de acuerdo al compilador que se utilice. De igual forma el float es el de menor rango siendo long double el de rango mayor
Caracteres
Se utiliza el tipo char. Para representar un carácter en C++ se utilizan apóstrofes.

Ejemplos: ‘a’, ‘b’ , ‘5’
Para representar una cadena de caracteres se utilizan las comillas.

Ejemplo: “soy una cadena”
Estatuto de Escritura
El archivo de cabecera iostream.h de la biblioteca de C++ proporciona un flujo de salida estándar cout y un operador de extracción <<, que normalmente se manda a la pantalla del usuario.
Sintaxis del estatuto cout
cout << Lista;
donde Lista puede ser variables, valores constantes o expresiones separadas por <<
Estatuto de Escritura
Ejemplos:
cout << "Dame el numero "; // estamos desplegando el mensaje
// en pantalla.
cout << "El resultado es " << resul; // estamos desplegando el
// mensaje y el valor de la
// variable resul.
Estatuto de Escritura
Los operadores de extracción e inserción, >> y <<, apuntan en la dirección del flujo de datos. Recordemos que para poder utilizar el estatuto cin y cout se requiere la directiva #include <iostream>. Existen caracteres especiales que pueden ser usados con el cout dentro de comillas. Entre ellos están: \ n realiza un cambio de línea equivalente a usar endl. \ t tabulador. \ a sonido de la campana. \ “ comilla doble. \ ‘ comilla simple.
Variables
C++
La declaración de una variable es un estatuto que proporciona información de la variable al compilador de C++.
La sintaxis para la declaración de una variable es: tipo variable tipo.- es el nombre de un tipo de dato conocido por C++. variable.- es un identificador (nombre) válido en C++.

Declaración
Reglas para nombre de variables
Deben empezar con letra o underscore
Pueden contener letras, números y underscore
Las letra mayúsculas y minúsculas son diferentes para C++
Declaración o definición

Ejemplos:
int x;    // declara el nombre de la variable x de tipo entero.
char var;    // declara var de tipo carácter.
int i = 0;    //  define i inicializa la variable i entera a cero.
Funciones
C++

Un programa en C++ se forma por una colección de funciones.
Todos los programas se construyen a partir de una o más funciones que se integran para crear una aplicación.
Todas las funciones contienen uno o más estatutos C++ y se crean generalmente para realizar una única tarea.
Funciones definidas por el usuario
Funciones definidas por el usuario
Por ejemplo:
double promedio( int a, int b, int c)
{ return (a + b + c ) / 3.0;
}

COMPILADORES E INTERPRETES
Normativa en el aula
  • GUARDAR SILENCIO.
  • MANTENER EL CELULAR EN VIBRADOR.
  • NO USAR GORRA DENTRO DEL SALÓN DE CLASES
  • NO SALIR Y ENTRAR INNECESARIAMENTE DEL AULA.
  • PEDIR LA PALABRA PARA INTERVENIR EN LA CLASE.
  • RESPETAR LAS OPINIONES DE LOS DEMÁS.
  • PUNTUALIDAD.
  • OTRAS NORMAS QUE SERÁN INCLUIDAS EN EL TRANSCURSO DEL CICLO.
  • DOCENTE TITULAR:
  • ING. MARVIN OSMARO PARADA
  • GRUPO:
  • INGENIERIA EN SISTEMAS Y
  • REDES INFORMATICAS
  • CICLO - 2016
  • HORARIO: MARTES Y JUEVES. 
  • HORA: 10.40 – 12.40 AULA: Lab. Computo y 3
ØLa cátedra de Compiladores e Intérpretes presenta una introducción al software cuya función única es compilar programas fuentes en un determinado lenguaje, y producir programas ejecutables, la asignatura cubre los fundamentos conceptuales, el principio de funcionamiento, la estructura básicaasí también presenta un estudio de aspectos, léxicos, sintácticos y semánticos propios de un compilador.


ØAl final se realiza un proyecto que será el producto de la asistencia técnica proporcionada al alumno y  su ingenio en el diseño de compiladores e intérpretes.

OBJETIVO DEL AREA DE COMPETENCIA
¨Aplicar técnicas y procedimientos para traducir código fuente en código intermedio y final

COMPETENCIAS ESPERADAS DE LA  ASIGNATURA
¨Propone modelos en versión académica de los módulos internos de un compilador, incluyendo la conversión de código fuente a código intermedio.
¨Conoce la teoría relacionada con los traductores, compiladores e intérpretes.
¨Conoce  la estructura básica de un compilador

ACERCA DEL PROGRAMA DE ESTUDIO…….
Unidad 01:   Introducción a Los Traductores

1.1  Conceptos Generales
1.2  Clasificación de los Traductores
1.3  Metalenguajes
1.4  Estructura de un Compilador

Unidad 02:   Análisis Léxico
2.1  Definición – Implementación
2.2  Conceptos de Token, patrones, lexema y atributo
2.3  Especificaciones de un Token. Expresiones regulares
2.4  El Autómata Finito
2.5  La Tabla de Transición
2.6  Tratamiento de Errores
2.7  Tabla de Símbolos

Unidad 03:   Análisis Sintáctico
3.1   Gramáticas Libres de Contexto
3.2   Derivación. Ambigüedad
3.3   Analizador Sintáctico. Tipos
3.4   Analizador Sintáctico descendente determinista LL(1)
3.5   Comprobación si una gramática es LL(1). Iniciales y seguidores autómatas de pilas
3.6   Tabla de Análisis
3.7   Tratamiento de errores.

Unidad 04   Análisis Semántico
4.1   Introducción
4.2   Especificación formal
4.3   Fases en el Análisis Semántico
4.4   Determinación de los tipos de Comprobaciones Semánticas a Realizar
4.5   Implementación de acciones Semánticas

Unidad 05   Lenguajes Intermedios y Generación de Código
5.1   Lenguajes Intermedios, Definición y Tipos
5.2   Optimización Independiente de la Máquina
5.3   Generador de Código Intermedio y Final
5.4  Optimización Dependiente de la Máquina

Unidad 06  Proyecto
6.1   Proceso para Diseñar un Lenguaje de Programación
6.2   Implementación del Analizador Léxico
6.3   Implementación del Analizador Sintáctico
6.4   Implementación del Analizador Semántico
6.5   Obtención de código Intermedio

SISTEMA DE EVALUACIÓN
Del 21-27 marzo vacaciones de semana santa

COMPILADORES E INTERPRETES


Los lenguajes de programación
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 permiten convertir 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.

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 relacionalesse considera que son de cuarta generación.

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 el Visual Basic de Microsoft. Además hay que prestar una seria atención al lenguaje de programación Java, desarrollado por SUN

DEFINICIÓN
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
Compilador: 

Un compilador analiza el programa y lo traduce al idioma "maquina". La acción fundamental de loscompiladores es equivalente a la de un traductor humano , que toma nota de lo que esta escuchando y reproduce por escrito en otra lengua.
  • 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
  • ¨Línea de tiempo
  • ¨Compiladores
  • ¨Gran variedad de lenguajes de alto nivel
  • ¨Gran variedad de lenguajes objeto, tanto lenguaje de alto nivel como código máquina
  • ¨No puede darse una fecha exacta del primer desarrollo
  • ¨Varios grupos independientemente desarrollaron
  • ¨técnicas de análisis
  • ¨Los primeros traducían fórmulas aritméticas a código máquina
  • ¨COMPILADORES E INTERPRETES
  • ¨Ing. Marvin Osmaro Parada
  • ¨Conceptos Relacionados
  • ¨Motivación (I)
Para ser buen programador
Los intérpretes puros son los que analizan una sentencia y la ejecutan, y así sucesivamente todo el programa fuente. Fueron los intérpretes 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 intérprete y la sentencia a analizar y ejecutar.
El principal problema de este tipo de intérpretes es que si a mitad del programa fuente se producen errores, se debe de reiniciar el proceso.
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 es la evaluación perezosa, evaluándose sólo la parte necesaria de la expresión (el resto no se evalúa).
Interpretes AvanzadosLos 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.Funcionamiento del Intérprete AvanzadoExplicación del Interprete AvanzadoUn ejemplo de intérprete 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.
Explicación del Interprete AvanzadoEsto 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 llevan inmerso un intérprete de bytecode, esto ha permitido al lenguaje Java ser uno de los más utilizados en aplicaciones que usen Internet.
Interpretes IncrementalesAlgunos 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 intérpretes incrementales, que permiten compilar los módulos completamente definidos, y recompilar en tiempo de ejecución los nuevos módulos.
Los intérpretes 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 contiene un residuo del programa fuente que se ha introducido.



CLASE # 03
INTRODUCION, CONCEPTOS, CARACTERISTICAS Y COMPONENTES DE LOS COMPILADORES


OBJETIVOS

Realizar un recordatorio sobre la clasificación de lenguajes de programación.  Conocer los conceptos generales de compiladores, intérpretes, traductores.  Comprender las fases de un compilador.  Distinguir los diferentes tipos de traductores.  Realizar ejemplos sencillos de compilación en lenguaje C++.

CLASIFICACION DE LOS LENGUAJES DE PROGRAMACION


La programación de computadoras se realiza en los llamados lenguajes de programación, éstos posibilitan la comunicación entre el programador y la computadora, a través de un conjunto de instrucciones u órdenes especificadas por el lenguaje.Un lenguaje de programación puede definirse como:“ Notación  formal para describir algoritmos o funciones que serán ejecutados por una computadora ”, o bien , un lenguaje para comunicar instrucciones al computador.


Diferentes puntos de vista para clasificar los lenguajes de programación:

1. Su grado de independencia con la máquina.
2. La forma de sus instrucciones y la forma de procesar el código fuente.
3. Por generaciones.Los lenguajes de programación según su grado de independencia de la máquina:
a) Lenguaje máquina (representación binaria o hexadecimal.).
b) Lenguaje ensamblador o de bajo nivel (versión simbólica de un lenguaje máquina).
c) Lenguaje de medio nivel (lenguaje C).
d) Lenguaje de alto nivel (FORTRAN, COBOL, Pascal). 

Aunque todos los lenguajes de programación tienen un conjunto de instrucciones que permiten realizar dichas operaciones, existe una marcada diferencia en los símbolos, caracteres y sintaxis de los lenguajes de máquina, lenguajes ensambladores y lenguajes de alto nivel.

a) Lenguaje de máquina.El lenguaje de máquina de una computadora consta de cadenas de números binarios (ceros y unos) y es el único que "entienden" directamente los procesadores. Todas las instrucciones preparadas en cualquier lenguaje de máquina tienen por lo menos dos partes. La primera es el comando u operación, que dice a la computadora cuál es la función que va a realizar. Todas las computadoras tienen un código de operación para cada una de sus funciones. La segunda parte de la instrucción es el operando, que indica a la computadora donde hallar o almacenar los datos y otras instrucciones que se van a manipular; el número de operando de una instrucción varía en las distintas computadoras.


b) Lenguaje ensamblador La comunicación en lenguaje de máquina es particular de cada procesador que se usa, y programar en este lenguaje es muy difícil y tedioso, por lo que se empezó a buscar mejores medios de comunicación con ésta.
A fin de facilitar la labor de los programadores en el pasado, se desarrollaron códigos mnemotécnicos para las operaciones y direcciones simbólicas. Uno de los primeros pasos para mejorar el proceso de preparación de programas fue sustituir los códigos de operación numéricos del lenguaje de máquina por símbolos alfabéticos, que conforman un lenguaje mnemotécnico.


Todas las computadoras actuales tienen códigos mnemotécnicos aunque, naturalmente, los símbolos que se usan varían en las diferentes marcas y modelos. La computadora sigue utilizando el lenguaje de máquina para procesar los datos, pero los programas ensambladores traducen antes los símbolos de código de operación especificados a sus equivalentes en lenguaje de máquina.


Los lenguajes ensambladores tienen ventajas sobre los lenguajes de máquina. Ahorran tiempo y requieren menos atención a detalles. Se incurren en menos errores y los que se cometen son más fáciles de localizar. Además, los programas en lenguaje ensamblador son más fáciles de modificar que los programas en lenguaje de máquina. Pero existen limitaciones. La codificación en lenguaje ensamblador es todavía un proceso lento. Además, una desventaja importante de estos lenguajes es que tienen una orientación a la máquina. Es decir, están diseñados para la marca y modelo específico de procesador que se utiliza.En el principio de la computación este era el lenguaje que tenía que "hablar" el ser humano con la computadora y consistía en insertar en un tablero miles de conexiones y alambres y encender y apagar interruptores. Aunque en la actualidad ya no se emplea, es importante reconocer que ya no es necesario que nos comuniquemos en este lenguaje de "unos" y "ceros", pero es el que internamente una computadora reconoce o "habla".


c) Lenguajes de alto nivel Los primeros programas ensambladores producían sólo una instrucción en lenguaje de máquina por cada instrucción del programa fuente. Para agilizar la codificación, se desarrollaron programas ensambladores que podían producir una cantidad variable de instrucciones en lenguaje de máquina por cada instrucción del programa fuente. Dicho de otra manera, una sola macroinstrucción podía producir varias líneas de código en lenguaje de máquina.A diferencia de los programas de ensamble, los programas en lenguaje de alto nivel se pueden utilizar con diferentes marcas de computadoras sin tener que hacer modificaciones considerables. Esto permite reducir sustancialmente el costo de la reprogramación cuando se adquiere equipo nuevo.
Los lenguajes de programación según su forma de instruccionesLenguajes imperativos o procedimentales: lenguajes orientados a instrucciones (Pascal, C. C++, Ada, FORTRAN).  Lenguajes declarativos, funcionales o aplicativos: sus construcciones se basan en llamadas a funciones matemáticas, utilizados a menudo en Inteligencia Artificial ( LISP, ML. APL, Haskell). o Lógicos: manejan relaciones entre objetos. Las relaciones se especifican con reglas y  hechos. La ejecución de programas lógicos, consiste en la demostración de hechos sobre las relaciones por medio de preguntas. (PROLOG es el más utilizado de este tipo).  Lenguajes orientados a objetos: si soportan tipos de datos abstractos y clases. o (C++, Smalltalk, Java, Prolog++). Los lenguajes de programación por generaciones son aquellos nombrados como: 1ª., 2ª., 3ª. 4ª. generación y aquellos identificados como generación visual y generación internet.


Los lenguajes de programación según su forma de procesar el código fuente

 Traductores (translators).
 Compiladores (compilers).
 Ensambladores (assemblers).
 Interpretes (interpreters).
 Editores (editors).  

Traductor: Un traductor es un programa que procesa un texto fuente destino.

Compiladores: Un traductor que transforma textos fuente de lenguajes de alto nivel a lenguajes de bajo nivel se le denomina compilador. 
El tiempo que se necesita para traducir un lenguaje de alto nivel a lenguaje objeto se denomina tiempo de compilación. o El tiempo que tarda en ejecutarse un programa objeto se denomina tiempo de ejecución.  
Intérpretes: Los intérpretes son programas que simplemente ejecutan las instrucciones que encuentran en el texto fuente. En muchos casos coexisten en memoria el programa fuente y el programa intérprete.
Un ejemplo de lenguaje interpretado es BASIC en sus primeras versiones. La ejecución de un programa compilado es mucho más rápida que la de un programa interpretado. Sin embargo los intérpretes son más interactivos y facilitan la puesta a punto de programas.


ARQUITECTURA DE LA COMPUTADORA
En la disciplina de los procesadores de lenguajes, los compiladores son los más utilizados por los programadores para el desarrollo de aplicaciones. En el caso particular del desarrollo de compiladores, hay que tener bien definida la arquitectura de la computadora.
¿Cómo se pueden ejecutar las aplicaciones desarrolladas para otras arquitecturas de computadoras en la nueva arquitectura?

El problema planteado anteriormente no sólo es aplicable a la construcción de nuevas arquitecturas, sino también cuando es necesaria la compatibilidad de aplicaciones entre diferentes sistemas operativos y arquitecturas de computadoras.


Un intérprete software o emulador de software es un programa en código binario que lee una a una las instrucciones binarias de la arquitectura antigua de las computadoras, que se encuentran en un fichero ejecutable, y las interpreta. Los intérpretes no son muy rápidos, pero pueden construir y adaptar a distintas arquitecturas sin excesivos costos de desarrollo.Algunos ejemplos de intérpretes software binario son:Emuladores de DOS para distintos sistemas operativos (SoftPC de Insignia Solutions). 
Intérpretes de la máquinaabstracta JVM (Java Virtual Machine) para distintas plataformas y ue permiten ejecutar los códigos binarios denominados bytecode (ficheros con la extensión .class).
Un emulador hardware trabaja de forma similar a un intérprete de software, pero está implementado en HW de forma que decodifica las instrucciones de la arquitectura antigua y las traduce a la nueva arquitectura. Un ejemplo de emulador de hardware son los microprocesadores Java, que emulan la máquina abstracta JVM (Java Virtual Machine).Un traductor entre códigos binarios o ensambladores son conjuntos de instrucciones de la nueva arquitectura que reproducen el comportamiento de un programa en la arquitectura antigua (la información de la máquina antigua se almacena en registros de la nueva máquina). Un ejemplo de estos traductores son los desarrollados por DEC (Digital Equipment Corporation) para traducir instrucciones de la arquitectura VAX y MIPS a la nueva arquitctura ALPHA.
Un compilador nativo es aquél que toma un programa fuente antiguo y lo vuelve a compilar (recompilar) con compiladores desarrollados para la nueva arquitectura. Son los más rápidos y óptimos con respecto a las demás técnicas, pues produce la mejor calidad del código objeto.


GRAMATICAS DE LOS LENGUAJES DE PROGRAMACION 
FASES DE LOS COMPILADORES
Analizando en detalle el proceso de compilación, se divide en dos grandes fases, una de Análisis y la otra de Síntesis.
Fase de Análisis:En el llamado análisis lexicográfico o léxico, el compilador revisa y controla que las "palabras" estén bien escritas y pertenezcan a algún tipo de token (cadena) definido dentro del lenguaje, como por ejemplo que sea algún tipo de palabra reservada, o si es el nombre de una variable que este escrita de acuerdo a las pautas de definición del lenguaje. En esta etapa se crea la tabla de símbolos, la cual contiene las variables y el tipo de dato al que pertenece, las constantes literales, el nombre de funciones y los argumentos que reciben etc.
En el análisis sintáctico como su nombre lo indica se encarga de revisar que los tokens estén ubicados y agrupados de acuerdo a la definición del lenguaje. Dicho de otra manera, que los tokens pertenezcan a frases gramaticales validas, que el compilador utiliza para sintetizar la salida. Por lo general las frases gramaticales son representadas por estructuras jerárquicas, por medio de árboles de análisis sintáctico. En esta etapa se completa la tabla de símbolos con la dimensión de los identificadores y los atributos necesarios etc.
El análisis semántico se encarga de revisar que cada agrupación o conjunto de token tenga sentido, y no sea un absurdo. En esta etapa se reúne la información sobre los tipos para la fase posterior, en esta etapa se utiliza la estructura jerárquica de la etapa anterior y así poder determinar los operadores, y operandos de expresiones y preposiciones.
Fase de Síntesis:
Etapa de generación de código intermedio, aunque algunos compiladores no la tienen, es bueno saber de su existencia, en esta etapa se lleva el código del programa fuente a un código interno para poder trabajar más fácilmente sobre él. Esta representación interna debe tener dos propiedades, primero debe ser fácil de representar y segundo debe ser fácil de traducir al código objeto.

En la etapa de optimización de código, se busca obtener el código más corto y rápido posible, utilizando distintos algoritmos de optimización.
Etapa de generación de código, se lleva el código intermedio final a código maquina o código objeto, que por lo general consiste en un código maquina re localizable o código ensamblador. Se selecciona las posiciones de memoria para los datos (variables) y se traduce cada una de las instrucciones intermedias a una secuencia de instrucciones de maquina puro.
La tabla de símbolos no es una etapa del proceso de compilación, sino que una tarea, una función que debe realizar el proceso de compilación. En ella se almacenan los identificadores que aparecen en el código fuente puro, como así también los atributos de los mismos, su tipo, su ámbito y en el caso de los procedimientos el número de argumentos el tipo del mismo etc. En otras palabras una tabla de símbolos es una estructura de datos, que contiene un registro por cada identificador, y sus atributos. La tabla de símbolo es accedida tanto para escritura como parar lectura por todas las etapas. Detector de errores o manejador de errores, al igual que la tabla de símbolos no es una etapa del proceso de compilación, sino que es una función, muy importante, pues al ocurrir un error esta función debe tratar de alguna forma el error para así seguir con el proceso de compilación (la mayoría de errores son detectados en las etapas de análisis léxico, análisis sintáctico, análisis semántico).
¿Qué es lo que hacen los componentes de un compilador en sus Fases cuando tiene que analizar la siguiente expresión?suma  =  var1  +  var2  +  10 ;

Análisis Léxico El analizador léxico lee los caracteres del programa fuente, y verifica que correspondan a una secuencia lógica (identificador, palabra reservada etc.). Esta secuencia de caracteres recibe el nombre componente léxico o lexema. En este caso el analizador léxico verifica si el identificador id1 (nombre interno para "suma") encontrado se halla en la tabla de símbolos, si no está produce un error porque todavía no fue declarado, si la preposición hubiese sido la declaración del identificador "suma" en lenguajes C, C++ (int suma;) el analizador léxico agregaría un identificador en la tabla de símbolos, y así sucesivamente con todos los componentes léxicos que aparezcan.id1= id2+ id3 + 10Análisis Sintáctico El analizador sintáctico impone una estructura jerárquica a la cadena de componentes léxicos, generada por el analizador léxico, que es representada en forma de un árbol sintáctico.Análisis Semántico El analizador semántico verificara en este caso que cada operador tenga los operandos permitidos. 

ACTIVIDADES EN EL AULA – RESPONDER A LAS SIGUIENTES PREGUNTAS
1.¿Cuáles son los conceptos asociados a compiladores?
2. ¿Cuál es la clasificación de los lenguajes de programación de menor a mayor?
3. ¿Cuáles son los componentes de un compilador?
4. ¿Analizar cómo se implementan los componentes de un compilador?
5. ¿Cuáles es la diferencia entre un compilador y un intérprete, explica?
6. Elabore un esquema que permita comprender las fases del proceso de compilación y las etapas.
7. Realizar un mapa mental sobre los conceptos generales, clasificación, etapas y fases de los traductores, compiladores e intérpretes

PORCENTAJE ASIGNADO DEL LABORATORIO 1 

COMPUTO 1: 
40% GLOSARIOPROGRAMACIÓN DE SISTEMAS: 
Conjunto de reglas para crear soluciones a problemas computables. Conjunto de herramientas que nos permiten crear software de base que son de utilidad para interactuar con la máquina.
SOFTWARE DE BASE: Compilador, Querys, Sistema Operativo, Cargador.

AUTÓMATA: Son las cadenas posibles que aceptan un lenguaje.
EXPRESIONES REGULARES: Conjunto de símbolos que aceptan una palabra reservada. GRAMÁTICA: Reglas para escribir las sentencias del lenguaje.
LENGUAJE DE PROGRAMACIÓN: Es la notación formal para la descripción de algoritmos, basada en un conjunto de instrucciones en alto nivel, que finalmente pasarán a bajo nivel para interactuar con el hardware y generar herramientas de trabajo.

EJERCICIOS

ASIGNATURA:
COMPILADORES E INTERPRETES
DESCRIPCIÒN DE LA ASIGNATURA
Introducción
TRADUCTORES
IntroducciónExisten dos tipos principales de traductores de los lenguajes de programación de alto nivel:
COMPILADORES
INTERPRETES

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  FORTRAN

Saber como se obtiene un ejecutable permite saber  más sobre corrección y eficienciaPara entender más sobre lenguajes
Tipificación: estática, dinámica, fuerte, polimorfismo, conversiones, sobrecarga de operadores...
Estructura de bloques, ámbitos
Paso de parámetros
Gestión de memoria, punteros
Motivación (II)La teoría es imprescindible
Antes de la aplicación de teoría de autómatas ylenguajes formales, programación, etc. Los compiladores eran muy malosAplicar la teoría y herramientas a otros campos:
Intérpretes de comandos y consultas
Lenguajes de simulación (GPSS)
Intérpretes Gráficos (PS, GIF, JPEG)
Compilador; Definiciones I
Ensamblador: Compilador sencillo, el lenguaje fuente tiene una estructura simple que permite una traducción de una sentencia fuente a una instrucción en código máquina.
Compilador cruzado: Compilador que traduce un lenguaje fuente a objeto, el objeto es para un ordenador distinto del que compila.

Fases de un Compilador

Agrupación lógica de un compilador
Etapa Inicial
Fases, o parte de fases que dependen del lenguaje fuente y que son independientes de la máquina
Análisis léxico, sintáctico, semántico y generación de código  intermedio, manejo de errores de cada parte
Etapa Final
Fases que depende de la máquina, depende del lenguaje intermedio
Optimización de código, generación de código, operaciones con la tabla de símbolos


Concepto de Interprete


En lugar de producir un programa objeto como resultado de una traducción, un intérprete realiza las operaciones que implica el programa fuente.
Un intérprete 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 intérprete 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 de un Interprete
Un intérprete 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).
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 a sí mismos.


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 intérprete.
Puede ser interrumpido con facilidad.
Puede ser rápidamente modificado y ejecutado nuevamente.
Un Intérprete necesita menos memoria que un compilador.
Facilita la búsqueda de errores.
En algunos lenguajes está 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 máquina tantas veces como sea ejecutada
Durante la ejecución, el intérprete 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 Intérpretes
Intérpretes Puros
Interpretes Avanzados
Interpretes Incrementales
Intérpretes Puros

EJERCICIOS 

1. Realizar una aplicación que muestre el signo zodiacal, solo debes ingresar la fecha de nacimiento y la aplicación debe mostrar la imagen del signo del zodiaco con una breve descripción.para la fecha usar el control dateTimePicker

2. Desarrollar un programa que determine, si una cadena de texto ingresado por medio de un TextBox, es palíndromo. Ejemplo OSO

3. Desarrollar una aplicación que lea una frase dada por el usuario, luego mostrar el total de palabras que la conforman, total de caracteres incluyendo los espacios en blanco.          
 Ejemplo: hola mundo, tiene un total de dos palabras y 10 caracteres

4. Cree un programa que pida el ingreso de un número y muestre las tablas de multiplicar de este desde el uno al 12.
 Ejemplo, si ingreso el 3 tiene que mostrar, 3 x1 = 3, 3 x 2 = 6, 3 x 3 = 9, si ingresa el 4 mostraría, 4 x 1=4, 4 x  2=8, 4 x 3 = 12, hasta el 4 x 12

5. Ingresar un número entero positivo, distinto de cero e inferior a 2500. Calcular la sumatoria de todos sus antecesores, partiendo desde el cero.  Ejemplo: 6 deberá devolver 21, resultante de 6+5+4+3+2+1

6. Un alumno tiene una nota de examen práctico, otra por evaluación escrita y una tercera de evaluación parcial. Ingresar las tres notas y calcular su promedio. Además, se deberá indicar: PROMOCIONADO cuando el promedio sea >= 7 en color verde y negrita, APROBADO, si el promedio está comprendido entre >= 4 y <7 en color anaranjado y negrita, o DESAPROBADO cuando el  promedio es < 4 en color rojo y negrita.

7. Los empleados de una empresa cobran su sueldo de acuerdo a la categoría que poseen (en este caso A o B). Ingresar el nombre del empleado, los años de trabajo en la empresa y su categoría salarial. Calcular el sueldo sabiendo que los de categoría A cobran $650 y la B $450. Por cada año de antigüedad también tienen un plus de $30. Mostrar el resultado final. Usar radioButton para las opciones  

8. En una liga de futbol europea se ha organizado un torneo en la categoría menores. Participarán dieciséis  (16) equipos, cada uno de ellos participará en cuatro (4) encuentros. Se necesita generar un programa que, al finalizar el torneo, permita ingresar: nombre del equipo, cantidad de partidos ganados,  empatados, perdidos, total de goles realizados a favor, goles no atajados a los contrincantes y/o en contra.  A partir de los datos ingresados, se deberá obtener para cada equipo el puntaje obtenido en el campeonato, y teniendo en cuenta que la asociación otorga:  
Condición Puntos  Partido Ganado 2  Partido Empatado 1  Partido Perdido -1  
Al finalizar el proceso, se debe indicar:  a) El puntaje más alto,  b) El puntaje más bajo,  c) Cantidad de equipos cuya cantidad total de goles realizados a favor fue nula.  d) Cantidad de equipos cuya cantidad total de goles no atajados a los contrincantes y/o en contra fue superior a cinco  

9. Realizar un programa que calcule los valores de una resistencia eléctrica. Ejemplo    

10. Mini Calculadora v1.0. Este ejercicio consiste en hacer un programa que permita realizar 
las 4 operaciones básicas: Suma, Resta, Multiplicación y División. Este programa tendrá un funcionamiento similar a la calculadora de Windows, similar a este diseño y funcionamiento.      
11 - Al final desarrollar un menú principal desde donde se seleccione a cada uno de los ejercicios


Guia de resolucion de ejercicios donde se puso a prueba el conocimiento y habilidades concebidas en la asignatura que es impartida por el ing Marvin.
Se desarrollaron con el fin de medir las capacidades de aprendizaje de cada estudiante.
Segunda guia desafiante para reafirmar aprendizaje e incrementar habilidades para estudiantes que no defendieron muy bien la guia anterior


Introducción

Comienza la programación  del  compilador,  se  comienza con  algunos ejemplos  sencillos, de repaso, referidos a la programación en Visual C++, esto nos ayuda  a  recordar los conceptos básicos vistos en  introducción  a la  Informática y  Fundamentos de  programación. Para realizar los Ejercicios  de esta práctica debe apoyarse en el entorno de  programación de Visual Studio  2012 0 2013,  recordando de utilizar siempre usar siempre formularios y controles básicos, se evaluara el diseño y orden.  

EJERCICIOS

1. Un alumno desea saber cuál será su calificación de cada cómputo y  la final en la materia de compiladores e intérpretes. Dicha calificación se compone  por cada computo de los siguientes porcentajes para cada cómputo son: Laboratorio 1 30%,  Laboratorio 2 30%, Parcial 40%.  Recuerda son tres cómputos. Puede hacer uso del control TabControl

2. Realizar una aplicación que muestre el signo zodiacal, solo debes ingresar la fecha de nacimiento y la aplicación debe mostrar la imagen del signo del zodiaco con una breve descripción.para la fecha usar el control dateTimePicker

3. Crear una aplicación que muestre los números primos, comprendidos entre 0 a 1000

4. Desarrollar un programa que determine, si una cadena de texto ingresado por medio de un TextBox, es palíndromo. Ejemplo OSO

5. Desarrollar una aplicación que lea una frase dada por el usuario, luego mostrar el total de palabras que la conforman, total de caracteres incluyendo los espacios en blanco.             Ejemplo: hola mundo, tiene un total de dos palabras y 10 caracteres

6. Cree un programa que pida el ingreso de un número y muestre las tablas de multiplicar de este desde el uno al 12. Ejemplo, si ingreso el 3 tiene que mostrar, 3 x1 = 3, 3 x 2 = 6, 3 x 3 = 

9, si ingresa el 4 mostraría, 4 x 1=4, 4 x  2=8, 4 x 3 = 12, hasta el 4 x 12  

7. Crear un formulario con un ComboBox (con las opciones rojas, azules, amarillas, blancas) un mensaje que diga: “Elija un color para el fondo del formulario”. Cuando el usuario seleccione alguno, el fondo del formulario deberá cambiar al color indicado en el mismo. En el mismo formulario un mostrar un texto que diga “Aprendiendo a programar Visual C++”. Con un ListBox permitirán cambiar el color del texto (rojo, azul, verde y amarillo). Además agregue un botón para salir.

8. Ingresar un número entero positivo, distinto de cero e inferior a 2500. Calcular la sumatoria de todos sus antecesores, partiendo desde el cero.  Ejemplo: 6 deberá devolver 21, resultante de 6+5+4+3+2+1

9. Un alumno tiene una nota de examen práctico, otra por evaluación escrita y una tercera de evaluación parcial. Ingresar las tres notas y calcular su promedio. Además, se deberá indicar: PROMOCIONADO cuando el promedio sea >= 7 en color verde y negrita, APROBADO, si el promedio está comprendido entre >= 4 y <7 en color anaranjado y negrita, o DESAPROBADO cuando el  promedio es < 4 en color rojo y negrita.

10.Los empleados de una empresa cobran su sueldo de acuerdo a la categoría que poseen (en este caso A o B). Ingresar el nombre del empleado, los años de trabajo en la empresa y su categoría salarial. Calcular el sueldo sabiendo que los de categoría A cobran $650 y la B $450. Por cada año de antigüedad también tienen un plus de $30. Mostrar el resultado final. Usar radioButton para las opciones  

11.Ingresar dos datos por teclado: el precio de un pasaje y la categoría del pasajero, a saber: M = Menor, A = Adulto, J= Jubilado. Si el pasajero es un menor, se deberá hacer un 25% de descuento, si es un jubilado un 50% de descuento. Mostrar el precio resultante. Para la categoría del pasajero

12.Ingresar las notas de 10 alumnos pertenecientes a un curso e indicar: Cantidad de alumnos que aprobaron con una nota comprendida entre 4 y 6.  Cantidad de alumnos aplazados (nota menor a 4).  Cantidad de alumnos promocionados (nota superior o igual o 6).

13.En una liga de futbol europea se ha organizado un torneo en la categoría menores. Participarán dieciséis  (16) equipos, cada uno de ellos participará en cuatro (4) encuentros. Se necesita generar un programa que, al finalizar el torneo, permita ingresar: nombre del equipo, cantidad de partidos ganados,  empatados, perdidos, total de goles realizados a favor, goles no atajados a los contrincantes y/o en contra.  A partir de los datos ingresados, se deberá obtener para cada equipo el puntaje obtenido en el campeonato, y teniendo en cuenta que la asociación otorga:  
Condición Puntos  Partido Ganado 2  Partido Empatado 1  Partido Perdido -1  
Al finalizar el proceso, se debe indicar:  a) El puntaje más alto,  b) El puntaje más bajo,  c) Cantidad de equipos cuya cantidad total de goles realizados a favor fue nula.  d) Cantidad de equipos cuya cantidad total de goles no atajados a los contrincantes y/o en contra fue superior a cinco

14.Una compañía aérea posee las siguientes categorías de pasajes: P=PRIMERA, T=TURISTA y A=ECONOMICA. Por un viaje a El Salvador o Estados Unidos (lugares con los que opera únicamente), posee los  siguientes precios base: U$S 1500, U$S 900 y U$S 650 en cada una de las categorías respectivamente. Esos precios pueden sufrir un descuento, teniendo en cuenta la edad del pasajero, a saber:  
*Menores de 1 (un) año, abonan sólo el 10% del valor base *Menores de 3 (tres) años, abonan sólo el 30% del valor base  *Menores de 5 (cinco) años, abonan el 60% del valor base.  
Se pide calcular para cada boleto, el precio final a abonar. Finalizada la jornada, se deberá mostrar:  
a) Cantidad de pasajes vendidos en cada una de las categorías (PRIMERA, TURISTA y ECONOMICA), b) Total general vendido en U$S.  

15.Realizar un programa que calcule los valores de una resistencia eléctrica. Ejemplo    

16. Mini Calculadora v1.0. Este ejercicio consiste en hacer un programa que permita realizar las 4 operaciones básicas: Suma, Resta, Multiplicación y División. Este programa tendrá un funcionamiento similar a la calculadora de Windows, similar a este diseño y funcionamiento.      
17 - Al final desarrollar un menú principal desde donde se seleccione a cada uno de los ejercicios

No hay comentarios.:

Publicar un comentario