• Save
Cap1 compiladores
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Cap1 compiladores

  • 4,930 views
Uploaded on

Cap1 compiladores

Cap1 compiladores

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,930
On Slideshare
4,113
From Embeds
817
Number of Embeds
4

Actions

Shares
Downloads
0
Comments
0
Likes
7

Embeds 817

http://remingtonba.jimdo.com 725
http://sinapsis2.sinapsisbolivia.org 66
http://www37.jimdo.com 23
http://www.uip-virtual.edu.pa 3

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. INTRODUCCIÓN A LOS COMPILADORES
    • Capítulo 1
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 2. Resumen
    • Lenguajes
      • Instrucciones a la PC
      • Lenguajes de Máquina
      • Lenguajes Ensambladores
      • Lenguajes de Alto Nivel
      • Fortran
      • Algol
    • Conceptos de los Lenguajes Algorítmicos
    • Compilador
    • Autómatas Deterministas
    • Sistematización de los Lenguajes de Programación
      • BNF
      • Construcción Sistemática de las Expresiones
      • Optimización de Código
    • Nuevos Lenguajes
    • Traductores
      • Intérpretes
      • Compiladores
    • Compilación de un Programa
    • Partes del Compilador
    • Intérpretes y Compiladores
      • Compilar v.s. Interpretar
    • Dar Instrucciones a la Computadora
      • ¿Cómo Instruir a la Computadora?
    • Ejecución Eficiente de las Acciones
      • Funciones Importantes de los Compiladores
    • Anatomía de un Compilador
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 3. Introducción
    • Pueden ser usados para describir cualquier acción.
    • Hay muchas formas de describir la misma acción .
    • ¿Por qué no con lenguajes naturales?
      • ¿Español?
        • <User1>“Dame la clave, PC1“.
        • <PC1>&quot;Lo siento, temo que no puedo hacer eso&quot;.
    • Lenguajes Naturales:
      • La misma expresión describe muchas acciones posibles.
        • Ambiguas.
    • Usamos un lenguaje de programación
      • Ejemplos: Java, C, C++, Pascal, BASIC, Scheme.
    • Lenguajes
    • Instrucciones a una PC
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Los modismos pueden ser aún mucho más ambiguos
  • 4. Lenguaje de Máquina
    • En 1946 se desarrolló la primera computadora digital.
      • En un principio, estas máquinas ejecutaban instrucciones consistentes en códigos numéricos que señalaban a los circuitos de la máquina los estados correspondientes a cada operación.
      • Esta expresión mediante códigos numéricos se llamó Lenguaje Máquina, interpretado por un secuenciador cableado o por un microprograma.
    • Pero los códigos numéricos de las máquinas son engorrosos.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Es difícil atribuir a una sola persona la invención de la computadora. Pero si se tiene que señalar a una sola persona es a John Vincent Atanasoff.
  • 5. Ensamblar Programas
    • Los códigos numéricos de las máquinas son engorrosos.
    • Pronto los primeros usuarios de las computadoras descubrieron la ventaja de escribir sus programas mediante claves más fáciles de recordar que esos códigos numéricos.
      • Al final, todas esas claves juntas se traducían manualmente a Lenguaje Máquina.
      • Estas claves constituyen los llamados:
        • Lenguajes Ensambladores
          • Estos se generalizaron en cuanto se dio el paso decisivo de hacer que las propias máquinas realizaran el proceso mecánico de la traducción.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. A este trabajo se le llama ensamblar el programa
  • 6. Lenguajes Ensambladores Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 7. Lenguaje Algebraico
    • A pesar de todo, el Lenguaje Ensamblador seguía siendo el de una Máquina, pero más fácil de manejar.
      • Los trabajos de investigación se orientaron entonces hacia la creación de un lenguaje que expresara las distintas acciones a realizar de una manera lo más sencilla posible para el hombre.
      • Así, en 1950, John Backus dirigió una investigación en I.B.M. en un lenguaje algebraico.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. John Backus
  • 8. Lenguajes de Alto Nivel
    • En 1954 se empezó a desarrollar un lenguaje que permitía escribir fórmulas matemáticas de manera traducible por una computadora.
    • Le llamaron FORTRAN (FORmule TRANslator).
      • Fue el primer lenguaje considerado de Alto Nivel.
      • Se introdujo en 1957 para el uso de la computadora IBM modelo 704.
      • Permitía una programación más cómoda y breve que lo existente hasta ese momento, lo que suponía un considerable ahorro de trabajo.
      • Surgió así por primera vez el concepto de un traductor, como un programa que traducía un lenguaje a otro lenguaje.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
      • En el caso particular de que el lenguaje a traducir es un lenguaje de alto nivel y el lenguaje traducido de bajo nivel, se emplea el término compilador.
    IBM 704
  • 9. Fortran
    • La tarea de realizar un compilador no fue fácil.
    • Este desarrollo del FORTRAN estaba muy influenciado por la máquina objeto en la que iba a ser implementado.
      • Como un ejemplo de ello tenemos el hecho de que los espacios en blanco fuesen ignorados, debido a que el periférico que se utilizaba como entrada de programas (una lectora de tarjetas perforadas) no contaba correctamente los espacios en blanco.
    • Paralelamente al desarrollo de FORTRAN en América, en Europa surgió una corriente más universitaria:
      • Pretendía que la definición de un lenguaje fuese independiente de la máquina y en donde los algoritmos se pudieran expresar de forma más simple.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. El primer compilador de FORTRAN tardó 18 años en ser elaborado y era muy sencillo.
  • 10. Algol Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 11. Conceptos de los Lenguajes Algorítmicos
    • En el ALGOL aparecen por primera vez muchos de los conceptos de los nuevos lenguajes algorítmicos:
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 12. Compilador
    • Junto a este desarrollo en los lenguajes, también se iba avanzando en la técnica de compilación.
    • En 1958, Strong y otros proponían una solución al problema de que un compilador fuera utilizable por varias máquinas objeto.
      • Para ello, se dividía por primera vez el compilador en dos fases:
        • &quot;front end“
          • La primera fase es la encargada de analizar el programa fuente.
        • &quot;back end“
          • La segunda fase es la encargada de generar código para la máquina objeto.
    • El puente de unión entre las dos fases era un lenguaje intermedio que se designó con el nombre de UNCOL (UNiversal Computer Oriented Language).
      • Para que un compilador fuera utilizable por varias máquinas bastaba únicamente modificar su back end.
      • Aunque se hicieron varios intentos para definir el UNCOL, el proyecto se ha quedado simplemente en un ejercicio teórico.
      • De todas formas, la división de un compilador en front end y back end fue un adelanto importante.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 13. Autómatas Deterministas
    • A la par se van poniendo las bases para la división de tareas en un compilador.
    • Así, en 1959 Rabin y Scott proponen el empleo de autómatas deterministas y no deterministas para el reconocimiento lexicográfico de los lenguajes.
    • Rápidamente se aprecia que la construcción de analizadores léxicos a partir de expresiones regulares es muy útil en la implementación de los compiladores.
      • Johnson y otros apuntan diversas soluciones.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. En 1975, con la aparición de LEX surge el concepto de un generador automático de analizadores léxicos a partir de expresiones regulares, basado en el sistema operativo UNIX.
  • 14. Autómatas Deterministas
    • Un autómata finito o máquina de estado finito:
      • Es un modelo matemático de un sistema que recibe una cadena constituida por símbolos de un alfabeto y determina si esa cadena pertenece al lenguaje que el autómata reconoce.
    • Un autómata finito determinista o AFD:
      • Es un modelo compuesto de un número finito de estados y transiciones entre los estados y acciones.
    • Un AFND o autómata finito no determinista:
      • Es aquel que presenta cero, una o más transiciones por el mismo caracter del alfabeto.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Autómata: instrumento que posee mecanismos automáticos.
  • 15. Herramienta de Programación Lex
    • Lex es un programa que genera analizadores léxicos (scanners ó lexers).
      • Se utiliza comúnmente con el generador de análisis sintáctico yacc.
      • Originalmente escrito por Eric Schmidt y Mike Lesk.
      • Es el analizador léxico estándar en los sistemas Unix.
        • Se incluye en el estándar POSIX (Portable Operating System Interface).
      • Toma como entrada una especificación de analizador léxico.
        • Devuelve como salida el código fuente implementando el analizador léxico en C.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Posix es el equivalente a las API de Windows.
  • 16. Estructura de un Archivo Lex Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Definition Section (sección de declaraciones) %% Rules Section (sección de reglas) %% C Code Section (sección de código en C) El símbolo %%, es el marcador de separación.
  • 17. Sistematización de los Lenguajes de Programación Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Un gran número de profesionales contribuyeron al desarrollo de los traductores
  • 18. BNF
    • El Backus-Naur form (BNF):
      • También conocido como Backus-Naur formalism, Backus normal form o Panini-Backus Form.
    • El BNF se utiliza extensamente como notación para las gramáticas de los lenguajes de:
      • Programación de la computadora
      • Sistemas de comando
      • Protocolos de comunicación
      • Así como una notación para representar partes de las gramáticas de la lengua natural.
    • La mayoría de los libros de textos para la teoría y/o la semántica del lenguaje de programación documentan el lenguaje de programación en BNF.
    • Algunas variantes, tales como la augmented Backus-Naur form (ABNF), tienen su propia documentación.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Es una meta sintaxis usada para expresar gramáticas libres de contexto: es decir, una manera formal de describir lenguajes formales.
  • 19. Construcción Sistemática de las Expresiones Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Lisp es el segundo lenguaje de programación de alto nivel. Es de tipo declarativo, fue creado en 1958 en el MIT (Instituto Tecnológico de Massachusetts).
  • 20. Construcción Sistemática de las Expresiones Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 21. Optimización de Código Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 22. Nuevos Lenguajes Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 23. Java Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 24. Traductores
    • Traductor
      • 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.
      • Existen 2 tipos de traductores:
        • Compiladores.
        • Intérpretes.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 25. Intérpretes
    • Ej: Basic, Smalltalk, PHP, Java Script, etc.
    • Un intérprete es un programa capaz de analizar y ejecutar otros programas, escritos en un lenguaje de alto nivel.
    • Realizan la traducción del código a medida que sea necesario y normalmente, no guardan el resultado de dicha traducción.
    • No realizan compilación ni generan el código objeto.
    • Los intérpretes son conocidos como motores de scripts ya que permiten la traducción de estos.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Pasos de la interpretación: Programa fuente Intérprete Traducción y ejecución línea a línea
  • 26. Compiladores
    • Ej: C++, Pascal, Fortran, *Java (virtual machine), *Visual Basic (runtime library), etc.
    • Un compilador es un programa que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente.
    • Usualmente este segundo lenguaje es código máquina.
    • El proceso de traducción se conoce como compilación.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Pasos de la compilación: Programa fuente Compilador Programa objeto Montador Programa ejecutable en lenguaje de máquina
  • 27. Compilación de un Programa Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Programa fuente Compilador Programa objeto Existen errores en la compilación? Programa ejecutable Enlazador Ejecución no si Con un editor Ej.: C++ Verificación y corrección de errores Obtención del programa objeto El montador obtiene el programa ejecutable Se ejecuta el programa y salida del mismo
  • 28. Partes (programas) del Compilador
    • Un compilador no funciona de manera aislada, sino que necesita de otros programas para conseguir su objetivo:
      • Obtener un programa ejecutable a partir de un programa fuente en un lenguaje de alto nivel.
    • Algunos de esos programas son el preprocesador, el linker, el depurador y el ensamblador.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Algunos de los programas del compilador El preprocesador El linker El depurador Ensamblador
  • 29. Programas del Compilador Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 30. Intérpretes y Compiladores Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Un ensamblador es un compilador cuyo lenguaje fuente es el lenguaje ensamblador.
  • 31. Compilar v.s. Interpretar
    • Ventajas de compilar frente a interpretar:
      • Se compila una vez, se ejecuta n veces.
      • En bucles, la compilación genera código equivalente al bucle, pero interpretándolo se traduce tantas veces una línea como veces se repite el bucle.
      • El compilador tiene una visión global del programa, por lo que la información de mensajes de error es mas detallada.
      • Mayor velocidad de ejecución.
      • Menor sobrecarga de memoria.
    • Ventajas del intérprete frente al compilador:
      • Un intérprete necesita menos memoria que un compilador.
        • En principio eran más abundantes dado que las computadoras tenían poca memoria.
      • Permiten una mayor interactividad con el código en tiempo de desarrollo.
      • La propia ejecución puede modificar el programa.
      • Las variables pueden cambiar dinámicamente de tipo.
      • Facilidad de depuración.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 32. Dar Instrucciones a la Computadora
    • Escribimos un programa usando un lenguaje de programación.
      • Descripción abstracta de alto nivel.
    • Los microprocesadores hablan en lenguaje ensamblador.
      • Detalles de implementación de bajo nivel
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Programa Escrito en Lenguaje de Programación Traducción a Lenguaje Ensamblador Compilador
  • 33. ¿Cómo Instruir a la Computadora?
    • Entrada/Salida:
      • Input:
        • Lenguaje de programación de alto nivel.
      • Output:
        • Instrucciones de assembler de bajo nivel.
    • Compilador tiene que:
      • Leer y entender el programa.
      • Determinar con precisión que acciones se requieren.
      • Encontrar la forma de llevar a cabo esas acciones.
      • Instruir a la computadora a llevar a cabo las acciones.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
  • 34. Ejecución Eficiente de las Acciones
    • Mapeo de alto a bajo nivel:
      • Mapeo simple de un programa a assembler produce una ejecución ineficiente.
      • Más alto el nivel de abstracción más ineficiente.
    • Si el mapeo no es eficiente:
      • Las abstracciones de alto nivel son inútiles.
    • Se necesita:
      • Proveer un nivel alto de abstracción con rendimiento equivalente a si usáramos Assembler.
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Mapeo: trazar un camino. Abstracción: precisar, aislando información no relevante.
  • 35. Ejemplo
    • int expr(int n)
    • {
    • int d;
    • d = 4 * n * n * (n + 1) * (n + 1);
    • return d;
    • }
    • lda $30,-32($30)
    • stq $26,0($30)
    • stq $15,8($30)
    • bis $30,$30,$15
    • bis $16,$16,$1
    • stl $1,16($15)
    • lds $f1,16($15)
    • sts $f1,24($15)
    • ldl $5,24($15)
    • bis $5,$5,$2
    • s4addq $2,0,$3
    • ldl $4,16($15)
    • mull $4,$3,$2
    • ldl $3,16($15)
    • addq $3,1,$4
    • mull $2,$4,$2
    • ldl $3,16($15)
    • addq $3,1,$4
    • mull $2,$4,$2
    • stl $2,20($15)
    • ldl $0,20($15)
    • br $31,$33
    • bis $15,$15,$30
    • ldq $26,0($30)
    • ldq $15,8($30)
    • addq $30,32,$30
    • ret $31,($26),1
    • Programa de entrada
    • Assembler de salida
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
      • s4addq $16,0,$0
      • mull $16,$0,$0
      • addq $16,1,$16
      • mull $0,$16,$0
      • mull $0,$16,$0
      • ret $31,($26),1
    Assembler de salida Sin optimizar Optimizado Optimizar código: utilizar mejor la potencia del hardware.
  • 36. Funciones Importantes de los Compiladores
    • Velocidad / rendimiento.
    • Tamaño de código.
    • Consumo de poder.
    • Compilación rápida / eficiente.
    • Seguridad / confiabilidad
    • Debugging.
    • Lenguajes de Programación
      • Desde C a lenguajes OO.
      • Definiciones aún más abstractas.
    • Microprocesadores
      • De simple CISC a RISC a ...
    • Optimizar código para:
    • Incremento del nivel de abstracción
    Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Mayor nivel de abstracción Menor nivel de abstracción Debugging: depuración de errores.
  • 37. Anatomía de un Compilador Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Analizador Sintáctico (Parser) Generador de Código Optimizador de Código Analizador Semántico Analizador Léxico (Scanner)
    • Léxico: perteneciente al diccionario de una lengua.
    • Sintáctico: parte de la gramática para coordinar las palabras y formar oraciones.
    • Semántico: estudio del significado de los signos.
    Parse Tree: árbol gramatical Program (Character Stream): flujo de programa Token Stream: flujo de token Intermediate Representation: representación intermedia Optimized Intermediate Representation: representación intermedia optimizada Assembly Code: código en ensamblador Análisis Síntesis