Your SlideShare is downloading. ×
  • Like
  • Save
Cap1 compiladores
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Cap1 compiladores

  • 4,371 views
Published

Cap1 compiladores

Cap1 compiladores

Published 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,371
On SlideShare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
0
Comments
0
Likes
7

Embeds 0

No embeds

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