4 o Ingeniería Informática
|
|
|
- Daniel Lagos Muñoz
- hace 8 años
- Vistas:
Transcripción
1 Esquema del tema 1. Introducción 2. Etapas del proceso de traducción 3. La interpretación 4 o Ingeniería Informática II26 Procesadores de lenguaje Estructura de los compiladores e intérpretes 4. La arquitectura real de compiladores e intérpretes 5. Resumen del tema 1. Introducción Tanto los compiladores como los intérpretes son programas de gran complejidad. Afortunadamente, se sabe suficiente acerca de cómo estructurarlos y hay suficientes herramientas formales para que la complejidad se reduzca a niveles razonables. En este tema veremos en qué fases se divide un compilador o un intérprete. Veremos también qué tienen en común y cómo difieren entre sí compiladores e intérpretes. 2. Etapas del proceso de traducción Podemos modelar el proceso de traducción entre dos lenguajes como el resultado de dos etapas. En la primera etapa se analiza la entrada para averiguar qué es lo que se intenta comunicar. Esto es lo que se conoce como análisis. El fruto de esta etapa es una representación de la entrada que permite que la siguiente etapa se desarrolle con facilidad. La segunda etapa, la síntesis, toma la representación obtenida en el análisis y la transforma en su equivalente en el lenguaje destino. En el caso de la interpretación, se utiliza la representación intermedia para obtener los resultados deseados El objetivo de esta etapa es obtener una representación de la entrada que nos permita realizar la síntesis o la interpretación con comodidad. Utilizaremos los árboles de sintaxis abstracta como representación intermedia. Un ejemplo sería la traducción siguiente: asignación valor = valor+inc; /* Actualizamos */ id valor suma id valor id inc El paso de la entrada al árbol de sintaxis abstracta no es trivial. Para facilitarlo, se divide la tarea en varias partes. Supón que tuvieras que describir un lenguaje de programación. Una manera de hacerlo sería comenzando por describir cuáles son las unidades elementales tales como identificadores, palabras reservadas, operadores, etc. que se encuentran en la entrada. Después podrías describir cómo se pueden combinar esas unidades en estructuras mayores tales como expresiones, asignaciones, bucles y demás. Finalmente, especificarías una serie de normas que deben cumplirse para que el programa, además de estar bien escrito, tenga significado. Estas normas se refieren
2 2 II26 Procesadores de lenguaje a aspectos tales como que las variables deben declararse o las reglas que se siguen para decidir los tipos de las expresiones. Estos pasos se corresponde con las tres fases en las que frecuentemente se divide el análisis: léxico: divide la entrada en componentes léxicos. sintáctico: encuentra las estructuras presentes en la entrada. semántico: comprueba que se cumplen las restricciones semánticas del lenguaje léxico En esta fase se analiza la entrada carácter a carácter y se divide en una serie de unidades elementales: los componentes léxicos. Cada uno de estos componentes se clasifica en una categoría y puede recibir uno o más atributos con información relevante para otras fases (por ejemplo un entero tendría una etiqueta indicando su valor). El criterio que se emplea para clasificar cada componente es su pertenencia o no a un lenguaje (generalmente regular). En esta fase también se filtran elementos tales como los blancos y los comentarios. En nuestro ejemplo, tendríamos como categorías los identificadores, la suma, la asignación y el punto y coma. Además, hay otros componentes que se filtran o, más formalmente, son omitidos: los blancos y los comentarios. Teniendo en cuenta esto, nuestro analizador léxico ve: v a l o r = v a l o r + i n c ; / * A c t u a l i z a m o s * / Y lo que pasa al sintáctico es: id valor asig id valor suma id inc pyc Donde hemos asumido que id es el componente léxico que representa los identificadores; asig representa la asignación; suma, las sumas y pyc, el punto y coma. Como puedes ver, han desaparecido tanto los blancos como los comentarios sintáctico Partiendo de lo que ha recibido del analizador léxico, la tarea del analizador sintáctico consiste en ir descubriendo las estructuras presentes en el código de acuerdo con una gramática incontextual. A partir de las estructuras que ha encontrado, el analizador sintáctico construye un árbol sintáctico (que no hay que confundir con el árbol de sintaxis abstracta comentado antes). Para especificar las construcciones que se permiten, se suelen emplear gramáticas incontextuales, que veremos más adelante. En nuestro ejemplo, supondremos que una asignación se compone de un identificador seguido de un símbolo de asignación, una expresión y un punto y coma. Esto se escribe en la gramática en forma de regla: Asig id asig Expr pyc. Análogamente, podemos decir que una expresión es bien un identificador, bien la suma de dos expresiones. En reglas: Expr id Expr Expr suma Expr El árbol sintáctico nos permite expresar cómo se puede obtener (formalmente, derivar) la entrada a partir de las reglas. En nuestro ejemplo, el árbol de derivación es: Asig Expr Expr Expr id valor asig id valor suma id inc pyc
3 Estructura de los compiladores e intérpretes 3 Es interesante darse cuenta de que, tanto en las reglas como en la construcción del árbol, se hace caso omiso de los posibles atributos de los componentes léxicos; únicamente se tiene en cuenta su categoría semántico La última fase del análisis, el análisis semántico, toma como entrada el árbol sintáctico y comprueba si, además de las restricciones sintácticas, se cumplen otras restricciones impuestas por el lenguaje y que no pueden ser comprobadas mediante una gramática incontextual. Algunos ejemplos de estas restricciones son la necesidad de declarar las variables antes de usarlas, las reglas de tipos o la coincidencia entre los parámetros de las funciones en las definiciones y las llamadas. Como salida de esta fase, se obtiene una representación semántica, por ejemplo el árbol de sintaxis abstracta comentado antes. Además, se ha comprobado que tanto valor como inc están declaradas y con tipos compatibles Síntesis Terminado el análisis, se debe generar código para la máquina objetivo. Habitualmente, se divide la generación en dos etapas: Generación de código intermedio. Generación de código objeto: se traduce el código intermedio a código de máquina. El código intermedio es una especie de ensamblador light. Por un lado, su forma es muy similar al ensamblador: tiene registros, instrucciones de salto a etiquetas pero no bucles, etc. Esto hace que su traducción a código objeto sea muy fácil. Por otro lado, se eliminan gran parte de detalles engorrosos del código máquina real como el número limitado de registros disponibles o la gran variedad de instrucciones de máquina donde elegir. Esto simplifica notablemente la generación de código desde el AST. Desgraciadamente, esta aproximación no es gratis ni universal. Encontrar un lenguaje intermedio que sea adecuado para todas las arquitecturas y lenguajes no es tarea sencilla y probablemente no sea posible. Ademas de la simplificación en el diseño de la generación de código, utilizar un lenguaje intermedio tiene una gran ventaja si tenemos que desarrollar más de un compilador porque tengamos que abarcar varios lenguajes o varias máquinas destino. Supongamos que tenemos L lenguajes fuente y queremos escribir compiladores para M máquinas distintas. La aproximación inmediata, escribir un compilador para cada par lenguaje-máquina, supone escribir L M compiladores. Sin embargo, si escribimos L traductores desde los lenguajes fuente a un lenguaje intermedio y después M traductores de este lenguaje intermedio a los lenguajes máquina correspondientes necesitamos sólo L compiladores y M traductores: Java Java Sparc Sparc ML ML PowerPC PowerPC Pascal Pascal L. interm. Pentium Pentium C C Alpha Alpha C++ C++ Además, si se quiere añadir un nuevo lenguaje a nuestra colección, no es necesario crear M compiladores para él, basta con un traductor al lenguaje intermedio. Esto permite que se desarroc Universitat Jaume I
4 4 II26 Procesadores de lenguaje llen nuevos lenguajes con comodidad. Más importante, si aparece una nueva arquitectura, basta con desarrollar un traductor del lenguaje intermedio a esta nueva máquina. Como hemos comentado, no hay un lenguaje intermedio universal. Por eso, en la práctica se emplean lenguajes intermedios adaptados para lenguajes de alto nivel similares (por ejemplo, la familia C, C++, Pascal) y máquinas destino que compartan una serie de características comunes Generación de código intermedio En esta etapa se traduce la entrada a una representación independiente de la máquina pero fácilmente traducible a lenguaje ensamblador. Esta representación puede tomar diversas formas que pueden entenderse como visiones idealizadas del lenguaje ensamblador de una máquina virtual. Algunas de las representaciones más comunes son: Árboles de representación intermedia (distintos de los árboles de sintaxis abstracta), código de tres direcciones, código de dos direcciones, código de pila, representaciones en forma de grafo, mixtas, etc... En nuestro ejemplo, la sentencia valor = valor+inc; se puede traducir como: lw $r0, -2($fp) # Carga valor en $r0 lw $r1, -1($fp) # Carga inc en $r1 add $r0, $r0, $r1 # Hace la suma sw $r0, -2($fp) # Guarda el resultado en valor Generación de código objeto Una vez obtenido el código intermedio, es necesario generar el código objeto. Lo habitual es que no se genere el código objeto directamente sino que se genere código en ensamblador y después se utilice un ensamblador. De cualquier forma, esta fase es totalmente dependiente de la arquitectura concreta para la que se esté desarrollando el compilador. En particular, hay que enfrentarse a problemas como: Selección de instrucciones teniendo en cuenta su eficiencia. Elección de los modos de direccionamiento adecuados. Utilización eficiente de los registros. Empleo eficiente de la caché. Otros... Las instrucciones que genera gcc para nuestro ejemplo son: movl leal addl -8(%ebp), %edx -4(%ebp), %eax %edx, (%eax) Como ves, se tiene en cuenta el tamaño de las variables (por eso se emplea 4 y 8 en lugar de 2 y 1), se utilizan registros de la máquina concreta y se emplean instrucciones especiales como leal para aprovechar mejor el procesador.
5 Estructura de los compiladores e intérpretes Optimización Tanto a la hora de generar código intermedio como código objeto es habitual encontrarse con que el resultado de la traducción es muy ineficiente. Esto es debido a que la traducción se realiza de manera local, lo cual provoca la aparición de código redundante. Por ejemplo, la sentencia a[i]=a[i]+1 genera el siguiente código intermedio: addi $r0, $zero, 0 # Dirección de a lw $r1, 3($zero) # Acceso a i add $r0, $r0, $r1 # Sumamos i a la dirección de a lw $r0, 0($r0) # Valor de a[i] addi $r1, $zero, 1 # Valor entero (1) add $r0, $r0, $r1 # Hacemos la suma addi $r1, $zero, 0 # Dirección de a lw $r2, 3($zero) # Acceso a i add $r1, $r1, $r2 # Sumamos i a la dirección de a sw $r0, 0($r1) # Guardamos el resultado Sin embargo, es fácil darse cuenta de que no hace falta calcular dos veces la dirección de a[i], con lo que se pueden ahorrar, al menos, tres instrucciones. Ejercicio 1 Escribe el código de menor longitud que se te ocurra para el ejemplo anterior. No puedes utilizar instrucciones distintas de las mostradas. En otras ocasiones, es posible utilizar instrucciones especializadas para mejorar la velocidad. Por ejemplo, si la instrucción anterior a valor = valor+inc; es inc=1;, gcc -O genera incl %ebx Por esto, es habitual incluir módulos encargados tanto de la optimización del código intermedio como del código objeto Otros módulos del compilador Además de los módulos correspondientes a las fases que hemos descrito, existen dos módulos que tienen un papel fundamental para el proceso de compilación: la tabla de símbolos y el módulo de gestión de errores La tabla de símbolos A lo largo del proceso de análisis se va generando gran cantidad de información que se puede considerar ligada a los objetos que se van descubriendo en el programa: variables, constantes, funciones, etc. El acceso a esta información se realiza mediante los nombres de estos objetos. Esto hace necesario tener alguna manera de, a partir de un identificador, encontrar sus propiedades. La estructura de datos que guarda esta información se denomina tabla de símbolos y puede interactuar con prácticamente todas las fases de la compilación. Algunos ejemplos de la información guardada son: Constantes: tipo, valor. Variables: tipo, dirección en memoria, tamaño. Funciones: número y tipo de los argumentos, tipo devuelto, dirección. Es importante tener en cuenta que la información asociada con un identificador puede variar a lo largo del programa. Así, por ejemplo, el identificador i se refiere a dos variables distintas en el siguiente código: c Universitat Jaume I
6 6 II26 Procesadores de lenguaje int main() { int i=1; { float i=2.0; printf("%f\n", i); /* i es un float */ } printf("%d\n", i); /* i es un int */ } Una cuestión de gran importancia será encontrar una estructura de datos eficiente para acceder a los elementos de la tabla Gestión de errores Es un hecho que al programar se cometen errores. Es más, se puede decir casi con total seguridad que un compilador encuentra más programas erróneos que correctos. Así pues, es importante que el compilador ayude en la detección y corrección de errores. Para ello, el compilador debe, ante un error: Diagnosticarlo de la manera más clara posible. Detener la generación de código. Intentar recuperarse para poder continuar el análisis. Veremos que, en general, no es posible detectar los errores, sólo sus síntomas. Por ejemplo, ante la entrada a:= b 1; no es posible saber si falta un + entre la b y el 1 o si sobra un espacio o si sobra el uno... Sin embargo, será posible asegurar que la presencia de un error ha sido detectada lo antes posible; en nuestro ejemplo, detectaremos el error al ver el Módulos externos al compilador Aunque con lo que hemos visto hasta ahora podríamos considerar que tenemos el compilador completo, hay otros módulos que también se utilizan en el proceso de construcción de programas y que en muchos casos son programas independientes invocados por el propio compilador. Comentaremos brevemente tres: el preprocesador, en enlazador y el soporte en ejecución El preprocesador En algunos lenguajes (probablemente el más conocido es C), existe una fase anterior al análisis léxico: el preproceso. En esta fase se realizan acciones tales como expansión de macros o inclusión de ficheros. Es interesante darse cuenta de que el preprocesador se comporta como un compilador muy restringido en sus capacidades y que tiene sus propias fases de análisis y síntesis El enlazador En muchos casos, el resultado de la compilación no es un programa completo sino una parte de él: un fichero objeto. Una vez se han compilado todas las partes del programa, hay que unirlas, probablemente también empleando alguna biblioteca, para crear el programa final. El programa encargado de esto es el enlazador (linker en inglés) Soporte en ejecución Además de las acciones especificadas por el programador, el código final tiene que hacer una serie de acciones necesarias para el buen funcionamiento del programa. La parte añadida al programa para hacer esto es lo que se conoce como soporte en ejecución. Algunas de sus funciones son preparar la memoria al comienzo de la ejecución, gestionar la memoria o la pila durante la ejecución y preparar la finalización de la ejecución de una manera razonable. Según los casos, este código puede estar contenido en funciones de la biblioteca estándar del lenguaje, puede ser añadido al programa o generado automáticamente.
7 Estructura de los compiladores e intérpretes 7 3. La interpretación Mientras que el objetivo de los compiladores es obtener una traducción del programa fuente a otro lenguaje, los intérpretes tienen como objeto la obtención de los resultados del programa. Para ello deben realizar dos tareas: analizar su entrada y llevar a cabo las acciones especificadas por ella. La parte de análisis puede realizarse de manera idéntica a como se lleva a cabo en los compiladores. Es la parte de síntesis la que se diferencia sustancialmente. En el caso de la interpretación, se parte del árbol de sintaxis abstracta y se recorre, junto con los datos de entrada, para obtener los resultados. En el caso del árbol asignación id valor suma id valor id inc El recorrido consistiría en: Analizar el nodo asignación. Visitar su hijo derecho (la suma) para obtener el valor que hay que asignar: Visitar el hijo izquierdo de la suma, recuperar el valor actual de valor. Visitar el hijo derecho de la suma, recuperar el valor actual de inc. Hacer la suma. Guardar el resultado de la suma en valor. Actualmente es habitual encontrar híbridos entre la compilación y la interpretación que consisten en compilar a un lenguaje intermedio para una máquina virtual y después interpretar este lenguaje. Esta aproximación es la que se sigue, por ejemplo, en Java, Python o la plataforma.net. 4. La arquitectura real de compiladores e intérpretes Siguiendo la descripción de las fases hecha más arriba, vemos que la estructura de un compilador es similar a la siguiente: Programa fuente léxico sintáctico semántico Síntesis Árbol de sintaxis abstracta Generación de código intermedio Optimización de código intermedio Generación de código objeto Optimización de código objeto Programa objeto c Universitat Jaume I
8 8 II26 Procesadores de lenguaje De manera análoga, un intérprete tendría esta estructura: Programa fuente léxico sintáctico semántico Síntesis Árbol de sintaxis abstracta Generación de resultados Resultados O, si utilizáramos una máquina virtual, el intérprete tendría esta estructura: Programa fuente léxico sintáctico semántico Síntesis Árbol de sintaxis abstracta Generación de código intermedio Optimización de código intermedio Código intermedio Intérprete de máquina virtual Resultados Sin embargo, en la práctica, la separación entre las distintas fases no está tan marcada. Lo habitual es que el analizador sintáctico haga las veces de maestro de ceremonias, pidiendo al analizador léxico los componentos léxicos a medida que los va necesitando y pasando al analizador semántico la información que va obteniendo. De hecho, lo más normal es que este último (el analizador semántico) no exista como un módulo separado sino que esté integrado en el sintáctico. Así se elimina la necesidad de crear un árbol de análisis. Esta organización suele llamarse traducción dirigida por la sintaxis. Si la memoria disponible es escasa, puede resultar imposible mantener una representación de todo el programa. En estos casos, se unen las fases de análisis y de síntesis. De esta manera, se va generando código al mismo tiempo que se analiza el programa fuente. Esta forma de trabajar era habitual en compiladores más antiguos y exige ciertas características especiales al lenguaje, como las declaraciones forward de Pascal.
9 Estructura de los compiladores e intérpretes 9 5. Resumen del tema Dos etapas en la traducción: análisis y síntesis. : Léxico: de caracteres a componentes. Sintáctico: de componentes a árboles de análisis. Semántico: de árboles de análisis a AST. Síntesis: En compilación: Generación de código intermedio. Generación de código objeto. Optimización (mezclada con las anteriores). En interpretación, dos opciones: Generación directa de resultados. Generación de código intermedio e interpretación del código intermedio. c Universitat Jaume I
4 o Ingeniería Informática
Esquema del tema 1. Introducción 4 o Ingeniería Informática II26 Procesadores de lenguaje Estructura de los compiladores e intérpretes 2. Etapas del proceso de traducción 3. La interpretación 4. La arquitectura
Unidad I Introducción a la programación de Sistemas. M.C. Juan Carlos Olivares Rojas
Unidad I Introducción a la programación de Sistemas M.C. Juan Carlos Olivares Rojas Agenda 1.1 Qué es y que estudia la programación de sistemas? 1.2 Herramientas desarrolladas con la teoría de programación
Tema 2 Introducción a la Programación en C.
Tema 2 Introducción a la Programación en C. Contenidos 1. Conceptos Básicos 1.1 Definiciones. 1.2 El Proceso de Desarrollo de Software. 2. Lenguajes de Programación. 2.1 Definición y Tipos de Lenguajes
Unidad II: Análisis semántico
Unidad II: Análisis semántico Se compone de un conjunto de rutinas independientes, llamadas por los analizadores morfológico y sintáctico. El análisis semántico utiliza como entrada el árbol sintáctico
Tema 5 Tabla de Símbolos
Traductores, Compiladores e Intérpretes 1 Tema 5 También se la llama tabla de nombres o tabla de identificadores y tiene dos funciones principales: - Efectuar chequeos semánticos. - Generación de código.
Lenguaje de programación. COMPILADORES Unidad I: Introducción al proceso de compilació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
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
Diseño de compiladores Gestión de la memoria / Generación de código ORGANIZACIÓN DE MEMORIA Organización de memoria Depende del tipo de lenguaje (declarativos, imperativos), del compilador y del sistema
16 Análisis sintáctico I
2 Contenido Recordando la estructura de un compilador Recordando el análisis léxico l análisis sintáctico Comparación con el análisis léxico l Rol del Parser Lenguajes de programación Gramáticas structura
Técnicas de Programación
Técnicas de Programación 2.1.- Introducción: unos conceptos previos y primeros conceptos de la API Introducción La resolución de un problema con medios informáticos implica generalmente la siguiente secuencia
Generación de Código Intermedio
Generación de Código Intermedio Programación II Margarita Álvarez Generación de código intermedio Con la generación de código intermedio se inicia la tarea de síntesis. Aunque un programa fuente se puede
PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07
PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07 1. En qué método de análisis sintáctico puede suceder que en la construcción del árbol de derivación de las posibles expansiones de un símbolo no terminal
Procesadores de Lenguaje
Procesadores de Lenguaje Generación de código intermedio Cris%na Tirnauca Domingo Gómez Pérez DPTO. DE MATEMÁTICAS, ESTADÍSTICA Y COMPUTACIÓN Este tema se publica bajo Licencia: CreaIve Commons BY NC SA
C1 INTRODUCCIÓN AL LENGUAJE C. Fundamentos de Informática Departamento de Ingeniería de Sistemas y Automática. EII. Universidad de Valladolid
C1 INTRODUCCIÓN AL LENGUAJE C Fundamentos de Informática Departamento de Ingeniería de Sistemas y Automática. EII. Universidad de Valladolid Índice 1. Lenguajes de Programación 1. Definición. 2. Niveles
Construyendo Programas más Complejos
Arquitectura de Ordenadores Construcciones de Alto Nivel en Ensamblador Abelardo Pardo [email protected] Universidad Carlos III de Madrid Departamento de Ingeniería Telemática Construyendo Programas más
INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA
APUNTES DE JAVA FUNCIONAMIENTO DE UN PROGRAMA Assembler Ensamblador Ejecuta Programador Programa fuente BASIC Interprete Ejecuta C, C++, Pascal Compilador Compila Ejecuta Programa fuente Programa Objeto
Tema 2 Conceptos básicos de programación. Fundamentos de Informática
Tema 2 Conceptos básicos de programación Fundamentos de Informática Índice Metodología de la programación Programación estructurada 2 Pasos a seguir para el desarrollo de un programa (fases): Análisis
Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas
Unidad V Análisis Semántico M.C. Juan Carlos Olivares Rojas Agenda 5.1 Analizador semántico 5.2 Verificación de tipos en expresiones. 5.3 Conversión de tipos. 5.4 Acciones agregadas en un analizador sintáctico
Es un conjunto de palabras y símbolos que permiten al usuario generar comandos e instrucciones para que la computadora los ejecute.
Los problemas que se plantean en la vida diaria suelen ser resueltos mediante el uso de la capacidad intelectual y la habilidad manual del ser humano. La utilización de la computadora en la resolución
Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.
LENGUAJE C CARACTERISTICAS DEL LENGUAJE 'C' El lenguaje 'C' se conoce como un lenguaje compilado. Existen dos tipos de lenguaje: interpretados y compilados. Los interpretados son aquellos que necesitan
La última versión disponible cuando se redactó este manual era la 5 Beta (versión ), y sobre ella versa este manual.
Manual de Dev-C++ 4.9.9.2 Página 1 de 11 Introducción Dev-C++ es un IDE (entorno de desarrollo integrado) que facilita herramientas para la creación y depuración de programas en C y en C++. Además, la
PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4
PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4 En esta práctica trabajaremos con ANTLR a nivel semántico utilizando gramáticas con atributos. ANTLR permite implementar con facilidad los dos modelos
Elementos de un programa en C
Elementos de un programa en C Un programa en C consta de uno o más archivos. Un archivo es traducido en diferentes fases. La primera fase es el preprocesado, que realiza la inclusión de archivos y la sustitución
Tema 7. Generación de código
Departamento de Tecnologías de la Información Tema 7 Generación de código Ciencias de la Computación e Inteligencia Artificial Índice 7.1 Visión general 7.2 Código de tres direcciones 2 Índice 7.1 Visión
TEMA 3: El proceso de compilación, del código fuente al código máquina
TEMA 3: El proceso de compilación, del código fuente al código máquina 3.1 Fase de compilación y linkado (link, montado o enlace) Un programa escrito en un lenguaje de alto nivel, no puede ser ejecutado
Las Etapas de la Compilación
Las de la Compilación El en la Compilación Universidad de Cantabria Outline 1 El Problema 2 Las y el Qué pasos son necesarios dar para hallar la estructura de un programa? En qué pasos podemos dividirlos
Tema V Generación de Código
Tema V Generación de Código Una vez que se ha realizado la partición HW/SW y conocemos las operaciones que se van a implementar por hardware y software, debemos abordar el proceso de estas implementaciones.
Compiladores: Generación de Código. Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. María Constanza Pabón
Compiladores: Generación de Código Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. María Constanza Pabón Generación de Código Representación Intermedia Tabla de Símbolos
Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria
1.2. Jerarquía de niveles de un computador Qué es un computador? Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria Es un sistema tan complejo
INICIACIÓN A LA PROGRAMACIÓN 1ª parte
TEMA 4 INICIACIÓN A LA PROGRAMACIÓN 1ª parte Qué es la programación? La programación es el proceso de diseñar, codificar, depurar y mantener el código fuente de programas computacionales. En la actualidad,
Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo
TEMA 2: CONCEPTOS BÁSICOS DE ALGORÍTMICA 1. Definición de Algoritmo 1.1. Propiedades de los Algoritmos 2. Qué es un Programa? 2.1. Cómo se construye un Programa 3. Definición y uso de herramientas para
APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.
APUNTADORES Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No hay que confundir una dirección de memoria con el contenido
PROGRAMA DE LABORATORIO SECCIÓN: ÁREA A LA QUE PERTENECE: POS-REQUISITO: AUXILIAR:
UNIVERSIDAD DE SAN CARLOS DE GUATEMALA FACULTAD DE INGENIERÍA ESCUELA DE CIENCIAS PROGRAMA DE LABORATORIO CÓDIGO: 777 CRÉDITOS: 4 NOMBRE CURSO: ESCUELA: PRE-REQUISITO: Organización de Lenguajes y Compiladores
Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C
Algoritmo y Estructura de Datos Ing. M. Laura López 1 Estructura de un programa en C 2 Estructura de un programa en C #include Archivos de cabecera # define Definición de constantes Declaraciones Globales
Programación Básica Estructuras de Datos y Funciones en C
Arturo Vega González [email protected] Division de Ciencias e Ingenierías Universidad de Guanajuato Campus León Sesión 8 Universidad de Guanajuato, DCI, Campus León 1 / 33 Contenido 1 Estructuras de Datos
1. Computadores y programación
1. Computadores y programación Informática y computadora (RAE) Informática (Ciencia de la computación) Conjunto de conocimientos científicos y técnicos que hacen posible el tratamiento automático de la
Tema 1.3. Un lenguaje mínimo y su procesador: Restricciones contextuales
Tema 1.3. Un lenguaje mínimo y su procesador: Restricciones contextuales Profesor Federico Peinado Elaboración del material José Luis Sia Federico Peinado Facultad de Informática Universidad Complutense
Capítulo 9. Introducción a los lenguajes formales. Continuar
Capítulo 9. Introducción a los lenguajes formales Continuar Introducción Un lenguaje es un conjunto de símbolos y métodos para estructurar y combinar dichos símbolos. Un lenguaje también recibe el nombre
Escribir programas a partir de un diagrama de flujo
Escribir programas a partir de un diagrama de flujo por Iván Cruz En esta lectura se revisará una estrategia específica para lograr implementar un programa computacional a partir de un diagrama de flujo,
CUP. Diseño de compiladores. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP 20/04/2014
CUP Diseño de compiladores CUP Cup es un generador de analizadores sintácticos LALR Recibe de entrada un archivo con la estructura de la gramática y su salida es un parser escrito en Java Manual oficial:
TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013
TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES Ingeniería Técnica en Informática de Sistemas Segundo curso Departamento de Informática y Análisis Numérico Escuela Politécnica Superior Universidad de Córdoba
Fundamentos de Programación 2017-I
Fundamentos de Programación 2017-I Fundamentos para la construcción de código a partir del algoritmo Objetivo: El alumno construirá programas utilizando el lenguaje de programación C a través de un análisis
Nombres, Ligaduras, Chequeo de Tipos y Alcance. Luis Garreta (Basados en el libro de Robert Sebesta)
Nombres, Ligaduras, Chequeo de Tipos y Alcance Luis Garreta [email protected] (Basados en el libro de Robert Sebesta) 1 Nombres, Ligaduras, Chequeo de Tipos y Alcance Nombres Variables El concepto
Métodos que devuelven valor Dado el siguiente triángulo rectángulo:
Métodos que devuelven valor Dado el siguiente triángulo rectángulo: hipotenusa altura base Para dibujar este triángulo necesitamos los siguientes datos: base y altura La base y la altura, se utilizarán
Conceptos básicos sobre gramáticas
Procesamiento de Lenguajes (PL) Curso 2014/2015 Conceptos básicos sobre gramáticas Gramáticas y lenguajes Gramáticas Dado un alfabeto Σ, un lenguaje es un conjunto (finito o infinito) de cadenas de símbolos
Contenido. Capítulo 1. Teoría de conjuntos. 1. Capítulo 2. Lenguaje. 39. Capítulo 3. Lenguajes formales. 55
Contenido Capítulo 1. Teoría de conjuntos. 1 1.1 Conjuntos.... 3 1.1.1 Definiciones básicas.... 3 1.1.2 Operaciones sobre conjuntos.... 6 1.1.3 Diagrama de Venn.... 7 1.1.4 Álgebra de conjuntos.... 7 1.2
Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se realizan en base al alcance ofrecido por el compilador.
Unidad III: Optimización Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se realizan en base al alcance ofrecido por el compilador. La optimización va a depender del lenguaje
Un. VI. Generador de código intermedio.
Un. VI. Generador de código intermedio. La administración de la memoria se da en esta etapa. Se debe considerar tanto la memoria estática como dinámica, y en esta se utilizan generalmente pilas. Los lenguajes
Toda copia en PAPEL es un "Documento No Controlado" a excepción del original.
S U P E RIO R DE MISANTLA Apartado: 7.1 Copia No. Código:PD-SCD-1016 Versión No.: 02 Hoja : 2 de 12 4.- COMPETENCIAS A DESARROLLAR 4.1 Competencias Específicas: Diseña mediante el uso de reglas semánticas
Computadora y Sistema Operativo
Computadora y Sistema Operativo Según la RAE (Real Academia de la lengua española), una computadora es una máquina electrónica, analógica o digital, dotada de una memoria de gran capacidad y de métodos
TEMA 2 Introducción a C# ANÁLISIS Y DESARROLLO DE APLICACIONES INFORMÁTICAS Curso 2010/2011
TEMA 2 Introducción a C# ANÁLISIS Y DESARROLLO DE APLICACIONES INFORMÁTICAS Curso Origen Nuevo lenguaje de propósito general de Microsoft para la plataforma.net Es el único que ha sido diseñado específicamente.net
Programación. Test Autoevaluación Tema 3
Programación Test Autoevaluación Tema 3 Autores: M. Paz Sesmero Lorente Paula de Toledo Heras Fco. Javier Ordoñez Morales Juan Gómez Romero José A. Iglesias Martínez José Luis Mira Peidro SOLUCIONES 1.
Tema 8 Gestión de la memoria en tiempo de ejecución.
Traductores, Compiladores e Intérpretes 1 Tema 8 Gestión de la memoria en tiempo de ejecución. S Organización de la memoria en tiempo de ejecución. Cuando un programa se ejecuta sobre un sistema operativo
Tema 13: Apuntadores en C
Tema 13: Apuntadores en C M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com [email protected] @edfrancom edgardoadrianfrancom Estructuras de datos (Prof. Edgardo A. Franco) 1 Contenido Introducción
Introducción a la programación
Introducción a la programación Conceptos Básicos El objetivo fundamental de éste curso es enseñar a resolver problemas mediante una computadora. El programador de computadoras es antes que nada una persona
Expresiones y sentencias
Expresiones y sentencias Expresión Construcción (combinación de tokens) que se evalúa para devolver un valor. Sentencia Representación de una acción o una secuencia de acciones. En C, todas las sentencias
SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos
TEMA 2 Diseño de Algoritmos 7 2. DISEÑO DE ALGORITMOS 2.1. Concepto de Algoritmo En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo (del griego y latín, dixit algorithmus
Algoritmos y Lenguajes de Programación
Introducción y horario Algoritmos y Lenguajes de Programación 543242-2 [email protected] Código: 543242-2 Carrera: Ing. Civil Electrónica Clases 7 de Marzo a 28 de Junio Horario clases Martes, 9:10 a
1.1 Tipos de Datos Primitivos. 1.2 Tipos de datos estructurados. 1.3 Definición de estructura de datos
1.1 Tipos de Datos Primitivos 1.2 Tipos de datos estructurados 1.2.1 Arreglos unidimensionales, bidimensionales y cadenas de caracteres 1.2.2 Registros o Estructuras (unión y estructura) 1.3 Definición
EJERCICIO GUIADO. JAVA: DISEÑO DE FORMULARIOS DESDE CÓDIGO
EJERCICIO GUIADO. JAVA: DISEÑO DE FORMULARIOS DESDE CÓDIGO La Ventana de Diseño La ventana de diseño es una gran herramienta que nos permite diseñar formularios de forma relativamente sencilla. Simplemente
OPTIMIZACIÓN DE CÓDIGO
OPTIMIZACIÓN DE CÓDIGO INTRODUCCION La finalidad de la optimización de código es producir un código objeto lo más eficiente posible. En algunos casos también se realiza una optimización del código intermedio.
Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.
Java Avanzado. Guía 1 Java Avanzado Facultad de Ingeniería. Escuela de computación. Java Avanzado. Guía 2 Introducción Este manual ha sido elaborado para orientar al estudiante de Java Avanzado en el desarrollo
Modos de Direccionamiento
Arquitectura de Ordenadores Modos de Direccionamiento del Intel Pentium Abelardo Pardo [email protected] Universidad Carlos III de Madrid Departamento de Ingeniería Telemática Modos de Direccionamiento ADM-1
Convivencia Introducción
Convivencia Introducción Dra. Carolina Mañoso Dpto. Informática y Automática.UNED Definición (1/3) El sistema operativo como máquina virtual o extendida: Un sistema operativo es una serie de componentes
Informática Ingeniería en Electrónica y Automática Industrial
Informática Ingeniería en Electrónica y Automática Industrial Entrada y salida estándar V1.3 Autores Entrada y salida estándar Entradas y salidas Salida con formato: printf() Entrada de datos con formato:
TIPOS DE DATOS EN ABAP
TIPOS DE DATOS EN ABAP En ABAP existen los diferentes tipos de datos: Declaración de Campos Para declarar variables en un programa ABAP, debemos utilizar la sentencia DATA. Ejemplo: DATA var. Esta sentencia,
TIPOS DE SOFTWARE. A grandes rasgos, se puede decir que existen tres tipos de software:
SOFTWARE Software es un término informático que hace referencia a un programa o conjunto de programas de cómputo que incluye datos, procedimientos y pautas que permiten realizar distintas tareas en un
Procesadores de lenguaje Tema 6 La tabla de símbolos
Procesadores de lenguaje Tema 6 La tabla de símbolos Departamento de Ciencias de la Computación Universidad de Alcalá Resumen La tabla de símbolos. Requerimientos de información. Diseño de la tabla de
M. en E. Noemí López García
La forma de indicar al servidor que nuestro código PHP comienza es: M. en E. Noemí López García sentencias php Existen otros métodos de indicar el inicio de código php pero el indicado es el más común
Construcción de tablas de análisis sintáctico LL(1)
Construcción de tablas de análisis sintáctico LL(1) Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Diego Centeno Gerardo Cortés Juan Diego Alfaro Resumen. A la medida en
Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones
Unidad Didáctica 2 Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.3 Índice
Laboratorio de Arquitectura de Redes. Entrada y salida estándar
Laboratorio de Arquitectura de Redes Entrada y salida estándar Entrada y salida estándar Entradas y salidas Salida con formato: printf() Entrada de datos con formato: scanf() El buffer de teclado Entrada
$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos
PROGRAMACIÓN DE SHELL SCRIPTS EN LINUX El shell es un intérprete de órdenes, pero el shell no es solamente eso; los intérpretes de órdenes de Linux son auténticos lenguajes de programación. Como tales,
Programación Estructurada
Programación Estructurada PROGRAMACIÓN ESTRUCTURADA 1 Sesión No. 2 Nombre: El lenguaje de programación C Contextualización Una constante en todos los lenguajes de programación (viejos y nuevos) es la implementación
Instalación e introducción a R, Rstudio y R Commander
Instalación e introducción a R, Rstudio y R Commander Grado en Ingeniería Química Departamento de Matemáticas Introducción R es un lenguaje de programación especialmente indicado para el análisis estadístico.
LABORATORIO DE PROCESADORES DE LENGUAJE Curso: Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison
LABORATORIO DE PROCESADORES DE LENGUAJE Curso: 2008-2009 Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison Planteamiento del problema En esta práctica se trata de realizar, mediante el
Lenguajes de Programación. Juan Zamora O. Semestre II Nombres, Ambitos y Ligados
Lenguajes de Programación Nombres, Ambitos y Ligados Juan Zamora O. Semestre II - 2013 Nombres, Ambitos y Ligados Aspectos semánticos fundamentales de las variables. Conceptos a revisar: Abstracción Nombres
ÁRBOLES DE SINTAXIS. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales.
ÁRBOLES DE SINTAXIS ÁRBOL grafo dirigido acíclico. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales. Los nodos terminales (nodos hojas) están rotulados por los
TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS
TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS Una vez que ya sabes crear tus propios programas, vamos a analizar los fundamentos del lenguaje de programación C. Este capítulo incluye además los siguientes temas:
1.2.-Analisis de los componentes
1.2.-Analisis de los componentes 1.2.1.-CPU La Unidad Central de Proceso (conocida por sus siglas en inglés, CPU). Es el lugar donde se realizan las operaciones de cálculo y control de los componentes
Tema 3: Lenguaje ensamblador. La primera abstracción de la máquina para el programador
Tema 3: Lenguaje ensamblador La primera abstracción de la máquina para el programador Índice Introducción. Generación código máquina: ensamblador, montador y cargador. Instrucciones y directivas. Macros
METACOMPILADOR DIDÁCTICO GENERADOR DE CÓDIGO JAVA
METACOMPILADOR DIDÁCTICO GENERADOR DE CÓDIGO JAVA Erick Leonel Rico Preciado 1, Ana Cristina Bueno Campos 1, José Gerardo Carpio Flores 2, Ruth Sáez de Nanclares Rodríguez 2, Martha Alicia Rocha Sánchez
Cliente- Servidor. Bases de Datos Distribuidas
1 2 3 4 Cliente- Servidor La tecnología que se utiliza habitualmente para distribuir datos es la que se conoce como entorno (o arquitectura) cliente/servidor (C/S). Todos los SGBD relacionales del mercado
Compiladores e intérpretes Análisis Léxico I. Análisis Léxico I
Análisis Léxico I Profesor: Eridan Otto Análisis Léxico I Introducción Funciones Tokens,Patrones y Lexemas Reconocimiento de tokens Implementación de un AL 1 Análisis léxico: Introducción En esta unidad
Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I
Tema 4: Gramáticas independientes del contexto Teoría de autómatas y lenguajes formales I Bibliografía Hopcroft, J. E., Motwani, R., y Ullman, J. D. Introducción a la Teoría de Autómatas, Lenguajes y Computación.
media = ( temp0 + temp1 + temp2 + temp3 + temp temp23 ) / 24; printf( "\nla temperatura media es %f\n", media );
Arrays en el lenguaje C Introducción Una posible definición de array sería: Un conjunto de datos del mismo tipo, identificados por el mismo nombre, y que se pueden distinguir mediante un número de índice.
Objetivo. Introducción. Tema: GENERACION DE CODIGO. Compiladores, Guía 11 1
Compiladores, Guía 11 1 Tema: GENERACION DE CODIGO. Facultad : Ingeniería Escuela :Computación Asignatura:Compiladores Objetivo Reconocer las diferentes instrucciones para la generación de código.ensamblador
Java para no Programadores
Java para no Programadores Programa de Estudio Java para no Programadores Aprende a programar con una de las tecnologías más utilizadas en el mercado de IT. Este curso está orientado a quienes no tienen
Evolución del software y su situación actual
Evolución del software y su situación actual El software es el conjunto de programas que permite emplear la PC, es decir, es el medio de comunicación con la computadora, el control de sus funciones y su
ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF
ESCUELA POLITÉCNICA SUPERIOR GRADO EN DISEÑO IND. INFORMÁTICA CURSO 2012-13 PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF HASTA AHORA... En prácticas anteriores se ha aprendido: La estructura principal de un
TEMA 6: INTRODUCCIÓN A UML
TEMA 6: INTRODUCCIÓN A UML Por qué modelamos? El modelado es una parte central de todas las actividades que conducen a la producción de un software de calidad. Como tal la ingeniería software debe basarse
Programación Orientada a Objetos Profr. Pedro Pablo Mayorga
Actividad 3 Historia de los paradigmas de programación Unidad 1 Paradigma de programación Un paradigma de programación representa un enfoque particular o filosofía para la construcción del software. No
