Tutorial de diseño de compiladores: Qué es, Tipos, Herramientas, Ejemplo

¿Qué es un compilador?

Un compilador es un programa informático que ayuda a transformar el código fuente escrito en un lenguaje de alto nivel en un lenguaje máquina de bajo nivel. Traduce el código escrito en un lenguaje de programación a otro lenguaje sin cambiar el significado del código. El compilador también hace que el código final sea eficiente y esté optimizado para el tiempo de ejecución y el espacio de memoria.

El proceso de compilación incluye mecanismos básicos de traducción y detección de errores. El proceso del compilador pasa por el análisis léxico, sintáctico y semántico en el front-end, y la generación y optimización del código en el back-end.

En este tutorial de diseño de compiladores, aprenderás

  • ¿Qué es un compilador?
  • Features of Compilers
  • Types of Compiler
  • Tasks of Compiler
  • History of Compiler
  • Steps for Language processing systems
  • Compiler Construction Tools
  • Why use a Compiler?
  • Application of Compilers
  • Features of Compilers

    • Correctness
    • Speed of compilation
    • Preserve the correct the meaning of the code
    • The speed of the target code
    • Recognize legal and illegal program constructs
    • Good error reporting/handling
    • Code debugging help

    Types of Compiler

    Following are the different types of Compiler:

    • Single Pass Compilers
    • Two Pass Compilers
    • Multipass Compilers

    Single Pass Compiler

    Single Pass Compiler
    Single Pass Compiler

    In single pass Compiler source code directly transforms into machine code. For example, Pascal language.

    Two Pass Compiler

    Two Pass Compiler
    Two Pass Compiler

    Two pass Compiler is divided into two sections, viz.

    1. Front end: It maps legal code into Intermediate Representation (IR).
    2. Back end: It maps IR onto the target machine

    The Two pass compiler method also simplifies the retargeting process. It also allows multiple front ends.

    Multipass Compilers

    Multipass Compilers
    Multipass Compiladores

    El compilador multipasos procesa el código fuente o árbol sintáctico de un programa varias veces. Divide un programa grande en múltiples programas pequeños y los procesa. Desarrolla múltiples códigos intermedios. Todos estos multipass toman la salida de la fase anterior como entrada. Por lo tanto, requiere menos memoria. También se conoce como ‘Compilador Amplio’.

    Tareas del Compilador

    Las principales tareas que realiza el Compilador son:

    • Descompone el programa fuente en trozos y les impone una estructura gramatical
    • Permite construir el programa destino deseado a partir de la representación intermedia y también crear la tabla de símbolos
    • Compila el código fuente y detecta errores en él
    • Gestiona el almacenamiento de todas las variables y códigos.
    • Soporta la compilación por separado
    • Lee, analiza todo el programa y lo traduce a un equivalente semántico
    • Traduce el código fuente a código objeto dependiendo del tipo de máquina

    Historia del Compilador

    Los hitos importantes de la historia del Compilador son los siguientes:

    • La palabra «compilador» fue utilizada por primera vez a principios de los años 50 por Grace Murray Hopper
    • El primer compilador fue construido por John Backum y su grupo entre 1954 y 1957 en IBM
    • COBOL fue el primer lenguaje de programación que se compiló en múltiples plataformas en 1960
    • El estudio de los problemas de escaneo y análisis sintáctico se llevó a cabo en los años 60 y 70 para proporcionar una solución completa
      • Pasos para los sistemas de procesamiento del lenguaje

        Antes de conocer el concepto de compiladores, primero hay que entender algunas otras herramientas que trabajan con compiladores.

        Pasos para los sistemas de procesamiento del lenguaje
        Pasos para los sistemas de procesamiento del Lenguaje

        • Preprocesador: El preprocesador es considerado como una parte del Compilador. Es una herramienta que produce la entrada para el Compilador. Se ocupa del procesamiento de macros, aumento, extensión del lenguaje, etc.
        • Intérprete: Un intérprete es como el Compilador que traduce el lenguaje de alto nivel a lenguaje de máquina de bajo nivel. La principal diferencia entre ambos es que el intérprete lee y transforma el código línea por línea. El compilador lee todo el código de una vez y crea el código máquina.
        • Ensamblador: Traduce el código del lenguaje ensamblador a un lenguaje comprensible para la máquina. El resultado del ensamblador se conoce como un archivo de objetos que es una combinación de instrucciones de la máquina, así como los datos necesarios para almacenar estas instrucciones en la memoria.
        • Enlazador: El enlazador le ayuda a enlazar y fusionar varios archivos de objetos para crear un archivo ejecutable. Todos estos archivos pueden haber sido compilados con ensambladores distintos. La tarea principal de un enlazador es buscar los módulos llamados en un programa y averiguar la ubicación de memoria donde se almacenan todos los módulos.
        • Cargador: El cargador es una parte del SO, que realiza las tareas de cargar archivos ejecutables en la memoria y ejecutarlos. También calcula el tamaño de un programa que crea espacio de memoria adicional.
        • Compilador cruzado: Un compilador cruzado en el diseño de compiladores es una plataforma que le ayuda a generar código ejecutable.
        • Compilador de fuente a fuente: Compilador de fuente a fuente es un término utilizado cuando el código fuente de un lenguaje de programación se traduce en la fuente de otro lenguaje.

        Herramientas de construcción de compiladores

        Las herramientas de construcción de compiladores se introdujeron a medida que las tecnologías relacionadas con la informática se extendieron por todo el mundo. También se les conoce como compilador-compilador, compilador-generador o traductor.

        Estas herramientas utilizan un lenguaje o algoritmo específico para especificar e implementar el componente del compilador. A continuación se muestran los ejemplos de herramientas de construcción de compiladores.

        • Generadores de escáner: Esta herramienta toma expresiones regulares como entrada. Por ejemplo LEX para el sistema operativo Unix.
        • Motores de traducción dirigida por sintaxis: Estas herramientas de software ofrecen un código intermedio utilizando el árbol de análisis sintáctico. Su objetivo es asociar una o más traducciones a cada nodo del árbol de parse.
        • Generadores de parser: Un generador de parser toma una gramática como entrada y genera automáticamente un código fuente que puede analizar flujos de caracteres con la ayuda de una gramática.
        • Generadores de código automático: Toma el código intermedio y lo convierte en lenguaje de máquina
        • Motores de flujo de datos: Esta herramienta es útil para la optimización del código. Aquí, la información es suministrada por el usuario y el código intermedio se compara para analizar cualquier relación. También se conoce como análisis de flujo de datos. Ayuda a averiguar cómo se transmiten los valores de una parte del programa a otra.

        ¿Por qué utilizar un compilador?

        • El compilador verifica todo el programa, para que no haya errores de sintaxis o semánticos
        • El archivo ejecutable es optimizado por el compilador, por lo que se ejecuta más rápido
        • Permite crear una estructura interna en memoria
        • No es necesario ejecutar el programa en la misma máquina en la que se construyó
        • Traduce todo el programa en otro lenguaje
        • Genera archivos en disco.
        • Enlazar los archivos en un formato ejecutable
        • Comprobar errores de sintaxis y tipos de datos
        • Ayuda a mejorar la comprensión de la semántica del lenguaje
        • Ayuda a manejar los problemas de rendimiento del lenguaje
        • Oportunidad de un proyecto detrivial programming project
        • The techniques used for constructing a compiler can be useful for other purposes as well

        Application of Compilers

        • Compiler design helps full implementation Of High-Level Programming Languages
        • Support optimization for Computer Architecture Parallelism
        • Design of New Memory Hierarchies of Machines
        • Widely used for Translating Programs
        • Used with other Software Productivity Tools

        Summary

        • A compiler is a computer program which helps you transform source code written in a high-level language into low-level machine language
        • Correctness, velocidad de compilación, preservar el correcto el significado del código son algunas características importantes del diseño del compilador
        • Los compiladores se dividen en tres partes 1) Compiladores de una sola pasada 2)Compiladores de dos pasadas, y 3) Compiladores de varias pasadas
        • El «compilador» fue palabra utilizada por primera vez a principios de la década de 1950 por Grace Murray Hopper
        • Los pasos para el sistema de procesamiento del lenguaje son: Preprocesador, Intérprete, Ensamblador, Enlazador/Cargador
        • Las herramientas importantes de construcción de compiladores son 1) Generadores de escáner, 2)Motores de traducción dirigida de sintaxis-3), 4) Generadores de parser, 5) Generadores de código automático
        • La tarea principal del compilador es verificar todo el programa, para que no haya errores sintácticos o semánticos

        .