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

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

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

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

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

LÓGICA DE PROGRAMACIÓN

1. Computadores y programación

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

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

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

Lenguaje de Programación

Lenguajes de programación Última modificación 2008/10

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

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

Universidad Centroccidental Lisandro Alvarado. Decanato de Ciencias y Tecnología Departamento de Sistemas

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

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

Procesadores de lenguaje Tema 6 La tabla de símbolos

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Objetos de aprendizaje: Computadora

Algoritmos y Lenguajes de Programación

Tema 1: Introducción

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

FUNCIONAMIENTO DEL ORDENADOR

Principios de Computadoras II

GRAMATICAS LIBRES DEL CONTEXTO

Procesamiento de documentos XML.

TEMA 1 LENGUAJES DE PROGRAMACIÓN

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

TEMA 2. CONCEPTOS BÁSICOS DE ALGORÍTMICA

Introducción a la Operación de Computadoras Personales

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

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

Elementos de un programa en C

PROGRAMACIÓN. UNIDAD II. ALGORITMO PROFA : HAU MOY

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

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002

Principios de Programación en Java

Estructuras de control

: Algorítmica y Estructura de Datos I

Tema: Tabla de Símbolos

Algoritmos y solución de problemas. Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal

Java Avanzado Facultad de Ingeniería. Escuela de computación.

2.2 Nombres, Ligado y Ámbito

INTRODUCCION A LA PROGRAMACION

DISEÑO DE UNA METODOLOGÍA DOCENTE

Procesadores de Lenguaje

Tabla de Símbolos. Programación II Margarita Álvarez

Computación II. Introducción a Visual Basic

Guía práctica de estudio 05: Diagramas de flujo

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

La resolución de un problema

Diseño arquitectónico 1ª edición (2002)

Se llama hardware a todos los dispositivos que forman la PC y que se puedan tocar, es decir, es todo el conjunto de accesorios que se le pueden

Estructuras de Control

TECNICO SUPERIOR EN INFORMÁTICA EMPRESARIAL MÓDULO INTRUCCIONAL

Introducción a los Sistemas Operativos

Fundamentos de programación. Diagramas de flujo, Diagramas N-S, Pseudocódigo y Java

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

I02.- SISTEMAS INFORMÁTICOS: ESTRUCTURA, ELEMENTOS COMPONENTES Y SU FUNCIÓN EN EL CONJUNTO. PROGRAMAS: TIPOS Y CARACTERÍSTICAS.

Universidad Católica de Santiago del Estero Facultad de Matemática Aplicada Carrera de Ingeniería en Electrónica

Cristian Blanco

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Nombre de la asignatura: Programación Básica. Créditos: Objetivo de aprendizaje

Compiladores y Lenguajes de Programación. Maria de Guadalupe Cota Ortiz

Índice de contenido. Índice de contenido... i Indice de prácticas...ix Prólogo...xi Cómo utilizar este libro...xv

Para convertir un decimal a un binario se necesita la siguiente tabla.

Tema 3. Electrónica Digital

JAVA 7 Los fundamentos del lenguaje Java

Processadors de Llenguatge II. Compiladores

Introducción a la programación

Estructuras en LabVIEW.

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

Operadores y Expresiones

Lenguajes de Cuarta Generación (4GL)

Inteligencia artificial

PROGRAMACION CONCURRENTE Y DISTRIBUIDA

Misión Sucre P.N.F. de Informática U.C.: Algoritmia y Programación. Elaborado por: Ing. Víctor Valencia

Programación Estructurada

Universidad Autónoma Metropolitana Unidad Azcapotzalco. División de Ciencias Básicas e Ingeniería. Licenciatura en Ingeniería en Computación

DES: Programa(s) Educativo(s): Tipo de materia: Clave de la materia: Semestre: Área en plan de estudios:

Fundamentos de Programación Visual Basic

Anexo. Control de errores

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

Resultado de Aprendizaje:

Lenguajes de Programación. Juan Zamora O. Semestre II Nombres, Ambitos y Ligados

PROGRAMACIÓN UNIDADES

Introducción a la Computación. Capítulo 10 Repertorio de instrucciones: Características y Funciones

Tutor: Ing. Eddie Galarza. Autores: Edison Xavier Sánchez Quevedo Edison Saúl Gallardo Calvopiña

Tema 1: Introducción

ESTRUCTURAS ALGORITMICAS

Tema I. La computación en el profesional de la Ingeniería

by Tim Tran:

1

Tema: Entorno a C# y Estructuras Secuenciales.

Programa de Asignatura Programación Visual I

SENA TALLER DE PROGRAMACIÓN

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

CONTENIDOS MÍNIMOS BLOQUE 2. NÚMEROS

El Ciclo de Vida del Software

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

Transcripción:

COMPILADORES Unidad I: Introducción al proceso de compilación Flor Prof. Flor Narciso GIDyC-Departamento de Computación LABSIULA-Escuela de Ingeniería de Sistemas Facultad de Ingeniería Universidad de Los Andes fnarciso@ula.ve Lenguaje de programación Un lenguaje de programación se puede definir de diferentes maneras: Notación formal para describir algoritmos y funciones que serán ejecutados por una computadora. Lenguaje para comunicar instrucciones a una computadora. Convención para escribir descripciones que puedan ser evaluadas. Clasificación de los lenguajes de Lenguaje de máquina La forma más baja de un lenguaje de programación. La notación que entiende directamente una computadora. Binario o hexadecimal. Cada instrucción se representa: Un código numérico y Unas direcciones de memoria. Arquitectura de la máquina de Von Neumann. Conjunto de instrucciones basado en: Datos Operaciones aritméticas y lógicas Asignaciones de posiciones de memoria Control de flujo Clasificación de los lenguajes de Lenguaje ensamblador Versión simbólica de un lenguaje de máquina: Cada código de operación se indica por un código simbólico: ADD, MUL... Asignaciones de memoria se dan con nombres simbólicos 1

Clasificación de los lenguajes de Lenguaje de nivel intermedio Características de los lenguajes máquina: Acceso directo a posiciones memoria Almacenar variables en registros del procesador Características de lenguajes de alto nivel: Manejo de estructuras de control Manejo de datos Clasificación de los lenguajes de Lenguaje de alto nivel Características superiores a los lenguajes ensambladores No acceso directo al sistema Estructura de datos complejas Utilización de bloques, procedimientos o subrutinas Ejemplos: Ada, ALGOL, Basic, C, C++, C#, Clipper, Cobol, Fortran, Java, Lexico, Logo, Object Pascal, Pascal, Perl, PHP, PL/SQL, Phyton, Modula 2. Lenguajes funcionales: Haskell, Lisp TAREA!!!! Ejemplo: Lenguaje C Clasificación de los lenguajes de Lenguaje orientado a problemas concretos Resolución de problemas en un campo específico. Ejemplos: SQL, XBASE, Postscript Procesar Someter a un proceso de transformación mediante operaciones programadas. Es decir, transformar un origen (fuente) en un destino mediante una herramienta de transformación que permita operaciones programadas: la computadora. 2

Procesador de lenguaje Procesador de lenguaje Nombre genérico que reciben las aplicaciones informáticas en las que uno de los datos fundamentales de entrada es un lenguaje: - Traductores - Compiladores - Ensambladores - Enlazadores - Cargadores - Intérpretes - Desensambladores - Dees - Depuradores - Analizadores de rendimiento - Optimizadores de código - Compresores - Preprocesadores - Formateadores - Editores TAREA!!!! Se tomará como paradigma de los procesadores de lenguaje los es. Los lenguajes de alto nivel hicieron necesarios los es a partir de los años 50. Desde entonces, gracias al descubrimiento de técnicas sistemáticas para el manejo de muchas tareas que surgen en la compilación, al desarrollo de buenos lenguajes de implantación, entornos de programación y herramientas de software, el diseño y desarrollo de un se ha simplificado enormemente. Traductor Compilador Lee un texto fuente y lo traduce a un texto objeto. Está escrito en un lenguaje de Implantación (LI). Puede ser cualquier lenguaje desde uno de alto nivel a uno máquina. El texto fuente está escrito en lenguaje fuente (LF). Normalmente uno de alto nivel pero también puede ser de bajo nivel. El texto objeto está escrito en lenguaje objeto (LO). Puede ser otro lenguaje de alto nivel, un lenguaje máquina o un ensamblador. Traductor que acepta programas escritos en un lenguaje de programación de alto nivel y los traduce a otro lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas veces como se desee. 3

Compilación Compilación Proceso por el cual se traducen programas en código fuente (programa fuente) a programas en código objeto (programa objeto). El programa que realiza esta traducción se llama. El archivo de código objeto que se obtiene con la compilación está representado normalmente en código de máquina, aunque también puede ser un código intermedio binario multiplataforma (bytecode). El tiempo que se tarda en traducir un programa en código fuente se llama tiempo de compilación. El tiempo que tarda en ejecutarse un programa en código objeto se llama tiempo de ejecución. El programa fuente y los datos se procesan en momentos diferentes. Código fuente Código objeto Conjunto de líneas de código que conforman un bloque de texto que normalmente genera otro código mediante un o intérprete para ser ejecutado por una computadora. Normalmente se refiere a la programación de software. Un único programador o un equipo de programadores escriben el código fuente en el lenguaje de programación elegido. Posteriormente en un proceso de compilación el código fuente se traduce en código objeto. Código resultante de la compilación del código fuente, por lo general está codificado en código de máquina y distribuido en varios archivos resultantes de la compilación de cada archivo de código fuente. 4

Compiladores Los es son las herramientas más utilizadas por los informáticos para el desarrollo de aplicaciones. En el caso particular del desarrollo de es se hace necesario definir tres aspectos básicos: El léxico, la sintaxis y la semántica del lenguaje fuente a ser compilado. La estructura interna del. La arquitectura de la computadora y su conjunto de instrucciones del lenguaje objeto. La construcción de un para un determinado lenguaje es una tarea compleja, que se puede reducir siguiendo una metodología: dividir en módulos las diferentes fases. La complejidad dependerá de las características del lenguaje fuente y del lenguaje objeto y de su diferencia de niveles. Programa fuente FRONT-END ANÁLISIS SÍNTESIS Fases de un : Análisis : Comprobar la corrección del programa fuente Léxico Sintáctico Semántico Síntesis Generación de código intermedio Optimización de código intermedio Generación de código Optimización de código BACK-END Programa objeto 5

Fases de un : Análisis léxico: Se realiza en el nivel de los caracteres, debe reconocer tokens y entregarlos junto con sus atributos al analizador sintáctico, aunque estos últimos no son necesarios para el análisis sintáctico, sino para las fases siguientes. El programa fuente es tratado con el analizador léxico (scanner), lee secuencialmente caracteres, los compara con patrones que representan unidades sintácticas e identifica éstas, también llamadas componentes léxicos o tokens, tales como: constantes, identificadores (de variables, de funciones, de procedimientos, de tipos, etc.), palabras reservadas y operadores. Una vez identificado el token es entregado al analizador sintáctico. A cada token se le asocia una serie de informaciones, según las necesidades del traductor. Fases de un : Análisis sintáctico: Llamado también parser, realiza su análisis en el nivel de la sentencia. Es mucho más complejo que el análisis léxico. Su función es tomar los tokens que ha encontrado el analizador léxico y determinar la estructura sintáctica de las sentencias, agrupando los tokens en clases sintácticas ( los no terminales de la gramática), tales como expresiones, funciones, etc. Fases de un : Análisis semántico: Detecta la validez semántica (reglas de significado) de las sentencias aceptadas por el sintáctico. Típico de esta fase es la comprobación de tipos de datos. Fases de un : Generación de código intermedio: El código intermedio no es un lenguaje de programación de ninguna máquina real, sino que corresponde a una máquina abstracta, que se debe definir lo más general posible, de manera que sea posible traducir este código intermedio a cualquier máquina real. El objetivo del código intermedio es reducir el número de programas necesarios para construir traductores y permitir más fácilmente la transportabilidad de los traductores desde unas máquinas a otras. 6

Fases de un : Optimización de código intermedio: Es independiente de la máquina. Algunas optimizaciones pueden consistir en evaluación de expresiones constantes, el uso de las propiedades asociativa, conmutativa de algunos operadores, reducción de expresiones comunes, etc. Generación de código: Una vez que se ha obtenido el código intermedio se pasará a ensamblador o a código máquina de una máquina real en el caso de un o a otro lenguaje en el caso de un traductor. Fases de un : Optimización de código: En este caso ya depende de la máquina, de su arquitectura, de la asignación óptima de registros, el uso de operaciones de registros en vez de usar memoria. Manejo de errores: Los errores encontrados en la diferentes fase de análisis se envían a un módulo de manejo de errores. En el caso más sencillo, sacará un mensaje indicando el error, el número de línea donde se ha producido y abortará el proceso de análisis o traducción. Puede sofisticarse este módulo si se intenta recuperar el error (una especie de reparación provisional) para continuar el proceso el mayor tiempo posible y encontrar el máximo de errores. Fases de un : Tabla de símbolos: Es una estructura de datos que contiene toda la información relativa a cada identificador que aparece en el programa fuente. Cada elemento de la tabla se compone de al menos del identificador y sus atributos. Los atributos son informaciones relativas a cada identificador, necesarias para o bien realizar el análisis semántico o bien la traducción. Cualquiera de los tres analizadores puede rellenar algún atributo, pero el nombre del identificador (lexema) es misión del analizador léxico. Estructura de un : FRONT-END: Analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Suele ser independiente de la plataforma o sistema para el cual se vaya a compilar. BACK-END: Genera el código de máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el FRONT-END. 7

Estructura de un : Esta división permite que el mismo BACK-END se utilice para generar el código de máquina de varios lenguajes de programación distintos y que el mismo FRONT-END que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para la generación de código de máquina en varias plataformas distintas. El código que genera el BACK END normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker). Tipos de es Esta taxonomía de los tipos de es no es excluyente, por lo que puede haber es que se adscriban a varias categorías: Compiladores cruzados: Se ejecutan en una máquina pero el código objeto que producen es para otra máquina. Compiladores optimizadores: Realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original. Compiladores de una sola pasada: Generan el código máquina a partir de una única lectura del código fuente. Tipos de es Herramientas para la construcción de Compiladores de varias pasadas: Necesitan leer el código fuente varias veces antes de poder producir el código de máquina. Compiladores JIT (Just In Time): Forman parte de un intérprete y compilan partes del código según se necesitan. Tarea: Investigar acerca de los es de varias pasadas Generadores de analizadores léxicos: Basada en el uso de expresiones regulares, generan automáticamente el código fuente para el análisis léxico a partir de una especificación de los tokens. La más usada es lex, incorporada en el sistema operativo UNIX. Existen versiones para PC. Generadores de analizadores sintácticos: Construyen el código fuente del analizador sintáctico a partir de la especificación de la gramática del lenguaje fuente. La mas usada yacc incluida en UNIX. Tambien existen versiones para PC. 8

Herramientas para la construcción de Analizadores de gramáticas: Dada una gramática especificada formalmente, verifican si es de un determinado tipo o no. Normalmente se utilizan para verificar las gramáticas LL(k) y LR(k). Máquinas de traducción dirigida por sintaxis: Producen un conjunto de rutinas que recorren el árbol sintáctico y generan código intermedio. Asocian una o más traducciones a cada nodo sintáctico. Herramientas para la construcción de Generadores automáticos de código: Trabajan con un conjunto de reglas que permiten la traducción del código en lenguaje intermedio al lenguaje objeto. Las reglas suelen remplazar instrucciones de código intermedio por patrones que contienen las instrucciones equivalentes de la máquina objeto. Analizadores de flujo: Suministran la información necesaria para realizar las optimizaciones de código. Aplicaciones de los Las técnicas empleadas en la construcción de traductores, es e intérpretes pueden aplicarse en la construcción de otras herramientas: Editores sensibles al contexto Conversores de formato Preprocesadores Formateadores de código fuente Generadores de código Verificación estática de programas Aplicaciones de los Formateadores de texto Intérpretes de comandos de un sistema operativo Construcción de entornos operativos Intérpretes para consultar base de datos Compiladores de silicio Procesamiento de lenguajes naturales Reconocimiento del habla 9