Compilador. Ámbitos de utilización 1. Ámbitos de utilización 2

Documentos relacionados
Lenguaje de programación. COMPILADORES Unidad I: Introducción al proceso de compilación

Unidad I Introducción a la programación de Sistemas. M.C. Juan Carlos Olivares Rojas

INSTITUCIÓN EDUCATIVA SAN CRISTÓBAL

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

Tema 2 Introducción a la Programación en C.

Técnicas de Programación

TEMA 3: El proceso de compilación, del código fuente al código máquina

16 Análisis sintáctico I

Generación de Código Intermedio

C1 INTRODUCCIÓN AL LENGUAJE C. Fundamentos de Informática Departamento de Ingeniería de Sistemas y Automática. EII. Universidad de Valladolid

Tema V Generación de Código

Introducción a la programación

Qué es un programa informático?

Algoritmos y Lenguajes de Programación

Es un conjunto de palabras y símbolos que permiten al usuario generar comandos e instrucciones para que la computadora los ejecute.

Herramientas desarrolladas con la teoría de la programación de sistemas.

Evolución del software y su situación actual

Procesadores de Lenguaje

Fundamentos de Programación 2017-I

Tema 5 Tabla de Símbolos

Un. VI. Generador de código intermedio.

Conceptos y definiciones básicos en computación

LÓGICA DE PROGRAMACIÓN

Conceptos básicos sobre gramáticas

INICIACIÓN A LA PROGRAMACIÓN 1ª parte

CUP. Diseño de compiladores. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP 20/04/2014

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

Elementos de un programa en C

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013

Unidad II: Análisis semántico

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

Diseño de compiladores. Organización de memoria. Organización de memoria. Organización de memoria. Zona de código 04/05/2014 ORGANIZACIÓN DE MEMORIA

Compiladores e intérpretes Análisis Léxico I. Análisis Léxico I

Tema III: Introducción al lenguaje de programación

Computadora y Sistema Operativo

LABORATORIO DE PROCESADORES DE LENGUAJE Curso: Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison

by Tim Tran:

Tema 5 - Lenguajes de programación 15/03/2011. Lenguajes de programación. Tipología y evolución. Compilación y depuración.

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

PROGRAMA DE LABORATORIO SECCIÓN: ÁREA A LA QUE PERTENECE: POS-REQUISITO: AUXILIAR:

Introducción a compiladores. Universidad Autónoma de Aguascalientes Prof. Eduardo Serna-Pérez Correo-e: eduardo.serna@gmail.com

12 La herramienta LEX

2.2 Nombres, Ligado y Ámbito

Construyendo Programas más Complejos

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Capítulo 9. Introducción a los lenguajes formales. Continuar

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Metodología de Desarrollo de Programas

2. Codificar de forma sistemática la secuencia de instrucciones en un lenguaje.

Convivencia Introducción

Tema 7. Generación de código

Tema 8 Gestión de la memoria en tiempo de ejecución.

Contenido. Capítulo 1. Teoría de conjuntos. 1. Capítulo 2. Lenguaje. 39. Capítulo 3. Lenguajes formales. 55

Enteros. Son los números que no contienen componentes fraccionarios y, por tanto, no contienen punto decimal.

Las Etapas de la Compilación

TEMA 6: INTRODUCCIÓN A UML

Tema 3: Lenguaje ensamblador. La primera abstracción de la máquina para el programador

El proceso del Análisis Léxico

INICIACIÓN A LA PROGRAMACIÓN I

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

La última versión disponible cuando se redactó este manual era la 5 Beta (versión ), y sobre ella versa este manual.

JavaCC Parte I. 1 Compiladores / Guía VII / Ciclo Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores.

Unidad IV: Programación de microcontroladores

1. Computadores y programación

Tema III: Semestre: A-2011

ARQUITECTURA BÁSICA DEL ORDENADOR: Hardware y Software. IES Miguel de Cervantes de Sevilla

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Diferentes Perspectivas de un Ordenador

Toda copia en PAPEL es un "Documento No Controlado" a excepción del original.

Compilación de Programas C en UNIX y LINUX

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

Construcción de tablas de análisis sintáctico LL(1)

Fundamentos de Programación. Sabino Miranda-Jiménez

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

Programación de Sistemas Depuradores (Debugger) MIS. Lizbeth Hdz. Glz.

Programación I.

Unidad I: Organización del Computador. Ing. Marglorie Colina

ESCUELA DE INFORMÁTICA

Fundamentos de programación JAVA

METACOMPILADOR DIDÁCTICO GENERADOR DE CÓDIGO JAVA

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Pruebas de escritorio

CAPÍTULO V SISTEMA PROPUESTO PARA LA DETERMINACIÓN DEL TIPO DE ELECTRODO A UTILIZAR Y PARA EL CÁLCULO DE LOS COSTOS DE SOLDADURA AL ARCO

Fundamentos de Programación Visual Basic

Programación Básica Estructuras de Datos y Funciones en C

Iván Ruiz Rube Departamento de Ingeniería Informática Escuela Superior de Ingeniería Universidad de Cádiz

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

TEMA 2. CONCEPTOS BÁSICOS DE ALGORÍTMICA

Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I

INTRODUCCION A LA PROGRAMACION

Software de Gestión y Programación

Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1

1. LENGUAJES DE PROGRAMACIÓN.

Definición: Dispositivo mecánico-electrónico que procesa Información (numérica, alfanumérica )

Colección de Tesis Digitales Universidad de las Américas Puebla. Romero Martínez, Modesto

Traducción de direcciones

Desarrollo del Programa Docente de Procesadores del Lenguaje

Principios de Computadoras II

Asignatura: Entornos de programación Entornos orientados a estructura

Transcripción:

#gcc hello.c -o hello.exe -fsyntax-only hello.c: In function `main : hello.c:3: i undeclared hello.c:8: unterminated string of char hello.c:9: undefined reference to print Un compilador es es un programa que traduce un programa llamado programa fuente escrito en un cierto lenguaje denominado lenguaje fuente a un programa objeto en lenguaje objeto. Además el el compilador emite unos ciertos mensajes de error. Programa fuente en lenguaje fuente Mensajes de error y diagnostico Programa objeto en lenguaje objeto PL. Introducción a los compiladores. 2 Ámbitos de utilización 1 Las técnicas de de construcción de de compiladores se se utilizan también en en otros muchos ámbitos Los editores de texto de sintaxis resaltada, que facilitan la edición de programas. Los programas formateadores de texto (como por ejemplo TeX y LaTeX, que a partir del documento y de los comandos de formateado permiten obtener un fichero adecuado para su visualización o impresión). Verificadores estáticos de sintaxis (como lint) que permiten detectar muchos errores antes de la compilación. (Algo parecido a lo que se obtiene con la opción -fsyntax-only del compilador de GNU gcc). Los interpretes (para lenguajes como Lisp o Basic, o para programas con sus propios lenguajes interpretados como Derive o Mathematica). Lenguajes de macros de aplicaciones extensibles (Scheme en el mundo GNU y Visual Basic for Applications en el mundo Microsoft Windows). Ámbitos de utilización 2 Lenguajes de scripts y de pegamento (perl, tcl/tk, phyton) que permiten el rápido desarrollo de aplicaciones con partes escritas en distintos lenguajes. El análisis de los ficheros de configuración requeridos en muchos modernos sistemas (ficheros.ini de Microsoft Windows o los ficheros de recursos de las X). es de circuitos de silicio (que a partir de lenguajes especiales que describen el trazado de los circuitos impresos obtienen las máscaras para la obtención del circuito impreso mediante técnicas fotográficas). Lenguajes de consulta a bases de datos. Análisis de especificaciones de protocolos de comunicación en lenguajes formales de especificación (como el Abstract Syntax Notation - ASN.1). PL. Introducción a los compiladores. 3 PL. Introducción a los compiladores. 4

Ámbitos de utilización 3 Preprocesadores, procesan un texto fuente modificándolo en cierta forma previamente a la compilación. (Por ejemplo muchos compiladores admiten un conjunto de macroinstrucciones ajenas al lenguaje en sí que indican al compilador si tiene que incluir algún fichero externo, si ha de hacer o no un listado completo de la compilación,...) Traductores de lenguaje natural, serían los que tradujeran un lenguaje natural en otro, por ejemplo español a inglés. (Esto en la actualidad no se ha conseguido debido fundamentalmente a la ambigüedad del lenguaje natural. Los mayores logros en la materia siempre trabajan con un subconjunto del lenguaje natural, limitando las construcciones sintácticas válidas y/o el vocabulario. Este tema se aborda generalmente mediante técnicas de inteligencia artificial.) Un poco de historia 1 Primeras máquinas muy pequeñas y sencillas. Programadas usando secuencias de dígitos binarios. En seguida se vio que era mucho mejor utilizar códigos nemotécnicos para las instrucciones máquina. Así nacieron los lenguajes ensambladores. Al principio traducidos a mano. A finales de los 40 se vio que la traducción de los códigos nemotécnicos a código máquina la podían hacer los propios ordenadores mediante programas ensambladores. Con el tiempo se desarrollaron lenguajes más complejos, conocidos como autocodes (autocódigos), permitían describir los programas de forma más concisa. Cada instrucción del autocode podía representar varias instrucciones en código máquina. Los programas para trasladar estos primeros lenguajes de alto nivel en código máquina eran más complejos que los ensambladores se llamaron compiladores. PL. Introducción a los compiladores. 5 PL. Introducción a los compiladores. 6 Un poco de historia 2 Durante los 50 los lenguajes de alto nivel evolucionaron para describir los problemas independientemente del código máquina de los ordenadores utilizados (Por ejemplo, en FORTRAN IV el número máximo de dimensiones de un array estaba limitado a 3, en parte porque la máquina objetivo, la IBM 709, tenía sólo 3 registros para indexar los arrays. Incluso en C, diseñado a mediado de los 70, el operador de incremento ++, estaba motivado por la existencia del código máquina equivalente en la PDP-11). Algol 60, que en realidad apareció en el 58, fue el precursor de un nuevo enfoque en el diseño de lenguajes de alto nivel. Se diseñó teniendo en mente la resolución de problemas y se ignoraron las cuestiones relativas a como debería ser traducido para ejecutarse en una máquina real. La La mayoría de de los los lenguajes modernos han sido diseñados independientemente de de una arquitectura de de máquina concreta. Uso de lenguajes de alto nivel Los lenguajes de alto nivel compilados están en la la actualidad bien establecidos. Ventajas Mejora de productividad de los programadores Reducción de errores lógicos Facilidad de depurado Desventajas Programas mas lentos que los obtenidos en ensamblador Mayor tamaño de los programas obtenidos PL. Introducción a los compiladores. 7 PL. Introducción a los compiladores. 8

Interpretar versus compilar Hay dos maneras de ejecutar un programa escrito en un lenguaje de alto nivel. Compilación: traducirlo todo el programa a otro programa equivalente en código máquina del ordenador. Entonces se ejecuta el programa obtenido. Interpretación: interpretar las instrucciones del programa escrito en lenguaje de alto nivel y ejecutarlas una por una. Interprete Fácil localización de errores. Difícil localización de errores. Cada vez que se ejecuta el Sólo es necesaria una programa es necesaria su compilación. Y una vez realizada, interpretación. la velocidad de ejecución es alta. Adecuado en la etapa de desarrollo y depuración. Adecuado cuando no hay más errores (etapa de explotación) Estructura de un compilador 1 Front end o etapa inicial Back end o etapa final PL. Introducción a los compiladores. 9 PL. Introducción a los compiladores. 10 Estructura de un compilador 2 El proceso de compilación se puede dividir en una serie de fases, que pueden llevarse a cabo simultáneamente o consecutivamente y cada una de las cuales transforma el programa fuente de una representación en otra. En En la la práctica se se pueden agrupar algunas fases, y las las representaciones intermedias entre entre las las fases fases agrupadas no no necesitan ser ser construidas explícitamente. front end = a. léxico + a. sintáctico + a. semántico (middle end = generación de código intermedio) back end = opt. de cod. intermedio + gen. de cod. + opt. de cod Si el front end (etapa de análisis o etapa inicial), que comprende aquellas fases que dependen principalmente del lenguaje fuente, se diseña adecuadamente. Es posible usar distintos back end (etapa de síntesis o etapa final), que incluye las fases que dependen de la máquina objeto, de modo que se puede obtener código para distintas máquinas. Etapa de análisis La etapa de análisis (front end o etapa inicial) agrupa aquellas fases que dependen principalmente del lenguaje fuente, y comprende: El analizador léxico (también llamada scanner): agrupar los caracteres individuales en entidades lógicas. El analizador sintáctico (también llamado parser) analiza la estructura general de todo el programa, agrupando las entidades simples identificadas por el scanner en construcciones mayores, como sentencias, bucles, rutinas, que componen el programa completo. Normalmente se utiliza la representación de árboles sintácticos para reflejar dicha estructura. Una vez determinada la estructura del programa se puede analizar su significado (semántica) mediante el analizador semántico. Se determina que variables almacenaran enteros, cuales número en coma flotante, si el acceso a los arrays cae dentro del rango fijado en su definición,..., etc. PL. Introducción a los compiladores. 11 PL. Introducción a los compiladores. 12

Etapa de síntesis La etapa de síntesis (back end o etapa final) agrupa aquellas fases que dependen principalmente de la máquina objetivo, y comprende: El optimizador de código intermedio que transforma la representación intermedia en otra equivalente pero más eficiente. El generador de código genera un programa equivalente para su ejecución en la máquina objetivo, añadiéndole posiblemente rutinas de biblioteca y código de inicialización. Finalmente puede haber un optimizador de código para mejorar aún más el código generado. El manejador de errores y el administrador de la tabla de símbolos Un compilador tiene que tener un determinado comportamiento ante programas erróneos. Este proceso se agrupa en una fase llamada manejador de errores. Cada una de las fases anteriores interacciona con el manejador de errores. Otro elemento en la compilación es la tabla de símbolos a la que acceden cada una de las fases a través del administrador de la tabla de símbolos. En la tabla de símbolos se almacena información sobre los distintos identificadores. (De variables, constantes, funciones y procedimientos, como: tipo, memoria asignada, ámbito, alcance,..., etc. Las fases anteriores introducen estas información sobre los identificadores en la tabla de símbolos y después la utilizan de varias formas). PL. Introducción a los compiladores. 13 PL. Introducción a los compiladores. 14 Proceso de compilación 1 posicion := inicial + vel * 2 Analizador léxico id 1 := id 2 + id 3 * 2 Analizador sintáctico := id 1 id2 + * id 3 2 Analizador semántico := + id 1 id2 id 3 * entareal 2 <ident, posicion> <oper, :=> <ident, inicial> <oper, +> <ident, vel> <oper, *> <const, 2> Generador de código intermedio temp1 := entareal(2) temp2 := id3 + temp1 temp3 := id2 + temp2 id1:= temp3 Optimizador de código intermedio temp1 := id3 * 2.0 id1:= id2 + temp1 TABLA DE SÍMBOLOS 1 posición... 2 inicial... 3 vel... 4 Generador de código MOVF id3, R2 MULF #2.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 Entorno de trabajo de un compilador Editor estructura del programa fuente Preprocesador programa fuente programa objeto en lenguaje ensamblador Ensamblador código máquina relocalizable Editor de carga y enlace Ejecutable biblioteca. archivos objeto relocalizables PL. Introducción a los compiladores. 15 PL. Introducción a los compiladores. 16

Construcción de un compilador En la construcción de un compilador se puede proceder siguiendo varios enfoques, pudiéndose escribir: en lenguaje ensamblador, con lo que se consiguen compiladores muy eficientes pero difíciles de mantener. en un lenguaje de alto nivel, con lo que se hace más fácil el mantenimiento, pero aún requiere mucho tiempo de desarrollo. utilizando herramientas de construcción de compiladores como flex, bison, JavaCC, JJTree, JTB. Herramientas Generadores de analizadores sintácticos Producen analizadores sintácticos partiendo de una gramática independiente del contexto (ej. yacc, bison, JavaCC) Generadores de analizadores léxicos Generan automáticamente analizadores léxicos partiendo de una especificación basada en expresiones regulares (ej. lex, flex, JavaCC) Generadores de árboles sintácticos Proporcionan medios para facilitar la creación de árboles sintácticos (ej. JJTree, JTB) Dispositivos de traducción dirigida por la sintaxis Producen grupos de rutinas que recorren el árbol de análisis sintáctico generando código intermedio Generadores automáticos de código Toman un conjunto de reglas que definen la traducción de cada operación del lenguaje intermedio al lenguaje máquina objeto. La técnica fundamental es la concordancia de plantillas. Dispositivos para análisis de flujo de datos Permiten la optimización de código en función de una recolección de información sobre la forma en que se transmiten los valores de una parte de un programa a cada una de las otras partes. PL. Introducción a los compiladores. 17 PL. Introducción a los compiladores. 18