Compiladores. Guía 1 1 Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores Tema: Introducción Lenguaje Micro C a Compiladores y al Contenido En esta guía se presenta una breve introducción a los conceptos básicos que se utilizan en el ámbito de los compiladores y se familiarizara al alumno con los lenguajes que se utilizaran en el curso. Objetivos Específicos • • Entender los conceptos básicos de compiladores Conocer los lenguajes que se utilizaran en las siguientes prácticas Material y Equipo • Guía No 1 Introducción Teórica Lenguajes de Programación La programación de computadoras se realiza en los llamados lenguajes de programación, éstos posibilitan la comunicación entre el programador y la computadora, a través de un conjunto de instrucciones u órdenes especificadas por el lenguaje. Un lenguaje de programación puede definirse como “una notación formal para describir algoritmos o funciones que serán ejecutados por el ordenador” Según su grado de independencia de la maquina, los lenguajes de programación se clasifican en: • Lenguaje maquina: Es la notación que entiende directamente el ordenador, por eso sus instrucciones están escritas con código binario. El repertorio de sus instrucciones, así 2 • • • • Compiladores. Guía 1 como la estructura de estas, están ligadas directamente a la arquitectura de la maquina. Lenguaje ensamblador: es esencialmente una versión simbólica de un lenguaje maquina. Cada código de operación se indica por un código simbólico. Por ejemplo ADD para adición y MUL para multiplicación. Lenguajes de nivel medio: tienen algunas de las características de los lenguajes de bajo nivel (por ejemplo acceso directo a posiciones de memoria), añadidas a posibilidades de manejo de estructuras de control y de datos de lenguajes de alto nivel. Lenguajes de alto nivel: facilitan la escritura de programas con estructuras de datos complejas, la utilización de bloques, y procedimientos o subrutinas. Dentro de estos lenguajes destacan un tipo de lenguajes, denominados lenguajes orientados a objetos, que permiten definir tipos abstractos de datos. Lenguajes de orientados a problemas concretos: se utilizan para la resolución de problemas en un campo específico. Procesadores de lenguaje Procesadores de lenguajes es el nombre genérico que reciben todas las aplicaciones informáticas en las cuales uno de los datos fundamentales de entrada es un lenguaje. La definición anterior afecta una gran variedad de herramientas software, entre las cuales tenemos: • Traductores: Es un programa que procesa un texto fuente y genera un texto objeto • Ensamblador: Si el lenguaje fuente es el lenguaje ensamblador y el lenguaje objeto es el lenguaje maquina, entonces al traductor se le llama ensamblador. • Compiladores: Un traductor que transforma texto fuente de lenguajes de alto nivel a lenguajes de bajo nivel se le denomina compilador. • Intérprete: Son programas que simplemente ejecutan las instrucciones que se encuentran en el texto fuente. Traductores Como ya se menciono, un traductor es un programa que procesa un texto fuente y genera un texto objeto. El traductor está escrito en lenguaje de implementación (LI) o también denominado lenguaje host. El texto fuente está escrito en lenguaje fuente (LF), por ejemplo un lenguaje de alto nivel. El texto objeto está escrito en lenguaje objeto (LO), por Compiladores. Guía 1 3 ejemplo un lenguaje de máquina, ensamblador u otro lenguaje de alto nivel. Se suele utilizar la notación T, la cual se muestra en la siguiente figura LF LO LI La notación T también se puede representar de forma abreviada como: LFLILO. Estructura general de un traductor Todas las fases de un traductor se pueden agrupar en dos áreas: el análisis del programa fuente y su síntesis en el correspondiente programa objeto. El análisis consiste en verificar la corrección del programa fuente, para lo cual se descompone el programa fuente en trozos elementales o unidades mínimas sintácticas denominadas componentes léxicos o tokens. Los tokens se pueden agrupar para comprobar su disposición correcta en las distintas construcciones y sentencias del lenguaje a analizar (análisis sintáctico y semántico). Comprobándose de esta forma la validez sintáctica y semántica del programa fuente. En caso contrario se emiten los errores oportunos (manejo de errores). La información también se utiliza durante la fase de análisis (por ejemplo ara comprobar si una variable se intentó declarar dos veces). La tarea de síntesis tiene por objeto la generación del código del lenguaje objeto. En el caso particular de los compiladores suele incluirse también la generación de código intermedio, como un medio para garantizar la transportabilidad entre distintas maquina objeto o como método para poder utiliza el mismo back-end, entre compiladores de lenguajes diferentes. La generación de código intermedia se apoya directamente en la información recogida en la tabla de símbolos durante la fase de análisis. La generación de cogió para la máquina objeto definitiva tan solo se apoya en el código intermedio. También es necesario un tratamiento de errores para la fase de síntesis. La siguiente figura muestra las fases de un traductor 4 Compiladores. Guía 1 Procedimiento MUSIM/0 Los componentes léxicos o tokens que conforman el lenguaje son los siguientes: • Identificadores, que solo son nombres de variables y están compuestos por una única letra minúscula de rango a-z. • Constantes numéricas de un solo digito, de rango 0-9. • Operadores: +,-,*,/, y %. Compiladores. Guía 1 5 • • • • • Símbolo de asignación: = (igual). Paréntesis: ( y ). Separador de sentencias: ; (punto y coma). Indicadores de principio y fin de bloque: { y }. Palabras reservadas que están formadas por una letra mayúscula. Tan solo son tres: R (lectura), W(escritura) y M(programa principal). Puede observarse que este lenguaje solo permite tres tipos de sentencias: lectura, asignación y escritura. Tiene un solo tipo de datos: entero. Las variables están formadas por una única letra minúscula, y las constantes son de un dígito. Tiene cinco operadores +(adición), -(diferencia), *(producto), /(división entera), y %(modulo). Se permite el uso de paréntesis. Ejemplo 1: M { R R c W } a; b; = a + b; c; Analicemos lo que hace este programa. “R a” y “R b” indica que le leen las variables a y b. “c = a + b” indica que en la variable c se asignara el resultado de la suma de a y b. “W c” indica que se escribirá la variable c. En pocas palabras, este programa leerá dos variables, las sumara y finalmente mostrará el resultado en pantalla. Ejercicio 1 M { R a; R b; R c; p = (a + b + c)/3; W p; } Describa lo que hace el programa anterior según las definiciones del lenguaje: _____________________________________________________________ _____________________________________________________________ 6 Compiladores. Guía 1 _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ Ejercicio 2 M { R a; R b; r = (a * a) + (b * b); W r; } Describa lo que hace el programa anterior: _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ Ejercicio 3 Escriba un programa en MUSIM/0 que lea un número, calcule y muestre en pantalla cuanto es ese número elevado al cubo. _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ Ejercicio 4 Escriba un programa en MUSIM/0 que lea 5 números, calcule y muestre en pantalla: la sumatoria, promedio y multiplicatoria de los 5 números. _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ Compiladores. Guía 1 7 Ejercicio 5 Escriba un programa en MUSIM/0 que lea un número y determine si este es par o impar. Si es par deberá mostrar 0 en pantalla, mientras que si es impar deberá mostrar 1 _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ ENSAMPOCO/0 Como lenguaje objeto se utiliza un lenguaje intermedio que es un pequeño ensamblador, que se denomina ENSAMPOCO/0. Este ensamblador trabaja sobre una maquina abstracta, en este caso particular es una máquina de pila. La maquina tendrá una memoria de 26 celdas cuyas direcciones se nombrarán con las letras de la ‘a’ a la ‘z’, y una pila LIFO donde se realizarán las operaciones aritméticas. A continuación se describe distintas instrucciones. Instrucción .CODE PUSHC PUSHA LOAD STORE la forma de trabajo de las Descripción Indica el comienzo del código Coloca una constante en la pila. El operando es una constante Coloca en la pila la dirección de una variable. El operando es una variable, dado que las direcciones se denominan con el nombre de las variables Asume que el último valor insertado en la pila es una dirección. Esta dirección es extraída de la pila y en su lugar se pone el valor ubicado en dicha dirección. No tiene operando Usa los dos últimos elementos de la pila. Uno es la dirección de una celda y memoria y el otro el valor a almacenar en dicha celda. El último elemento de la pila es el valor y el otro la dirección. Después de ejecutada la instrucción, los dos elementos implicados son 8 Compiladores. Guía 1 NEG ADD MUL DIV MOD INPUT OUTPUT END extraídos de la pila, dejándolos en el mismo lugar. No tiene operando. Cambia el signo del último valor introducido en la pila, dejándolo en el mismo lugar. No tiene operando Opera con los dos últimos elementos introducidos en la pila, extrayéndolos y dejando en su lugar el resultado. Por lo tanto la pila habrá disminuido en un elemento. No tiene operando. Opera con los dos últimos elementos introducidos en la pila, extrayéndolos y dejando en su lugar el producto. Por tanto la pila habrá disminuido en un elemento. No tiene operando. Opera con los dos últimos elementos introducidos en la pila, extrayéndolos y dejando en su lugar el producto. Por lo tanto la pila habrá disminuido en un elemento. No tiene operando. Opera con los dos últimos elementos introducidos en la pila, extrayendo primero el denominador y después el numerador y dejando en su lugar el modulo. Por tanto, la pila habrá disminuido en un elemento. No tiene operando. Toma el valor del buffer de entrada, en este caso el teclado, y lo coloca en la dirección asignada a la variable. La pila no sufre cambios. Toma el valor de la dirección indicada y lo lleva al buffer de salida, en este caso la pantalla. La pila no sufre cambios. Indica el fin de programa. Ejemplo 3 A continuación se muestran un programa fuente en MUSIM/0, y su traducción al código intermedio ENSAMPOCO/0 Código en MUSIM/0 M { R a; R b; z = a + b; W z; } Compiladores. Guía 1 9 Traduccion a ENSAMPOCO/0 .CODE INPUT a INPUT b PUSHA z PUSHA a LOAD PUSHA b LOAD ADD STORE OUTPUT z END Ejercicio 6 Traducir el siguiente código en MUSIM/0 A ENSAMPOCO/0 M { R a; R b; z = a + b - 2; W z; } Traducción a ENSAMPOCO/0 _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 10 Compiladores. Guía 1 Ejercicio 7 Traducir el siguiente código en MUSIM/0 a ENSAMPOCO/0 M{ R a; R b; R c; q = (a * a) + (b * b) + (c * c); W q; } _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ Compiladores. Guía 1 11 Lenguaje Micro C o C-: El lenguaje Micro C es un subconjunto pequeño del lenguaje de programación C. Como referencia utilice el Apéndice A “Proyecto de Compilador” del libro Construcción de Compiladores de Kenneth C. Louden, el cual define al lenguaje de programación denominado C Minus o C-. Micro-C es un lenguaje case sensitive, es decir que el compilador de este lenguaje trata a las letras mayúsculas y minúsculas como caracteres diferentes. Los comentarios y caracteres ignorados. Los comentarios son secuencias de carácter incluido dentro de par de secuencias de /*…*/ pareados. Los comentarios pueden extender sobre varias líneas, pero los comentarios anidados no se reconocen, es decir que el primer encontrado */ dentro de un comentario lo cierra. Otros caracteres ignorados incluyen el newline, la tabulación horizontal, el CR, y el espacio blanco. Tokens Las secuencias de caracteres encerrados dentro de dos apóstrofes (') son símbolos terminales. Cualquier otra secuencia de caracteres denota el nombre de una clase léxica, por ejemplo: En secciones posteriores léxicas siguientes: utilizaremos las definiciones • letra = ' _ ' | ' a ' | ' b ' |... | ' z ' | ' A ' | ' B ' |... | ' Z ' • dígito = ' 0 ' | ' 1 ' |... | ' 9 ' Observe que el carácter underscore (_) es tratando como una letra. Identificadores: Un identificador es una secuencia finita de letras y de dígitos que comienzan con una letra. Los identificadores pueden ser de cualquier longitud, sin embargo, los 12 Compiladores. Guía 1 identificadores sin diferencia en sus primeros 8 caracteres correspondientes se consideran iguales. • Identificador = (letra) (letra | dígito) *. Constantes numéricas. Un integer_constant es una secuencia de dígitos comenzar con un 0, a menos que sea el número 0). (no debe • integer_constant = digit+ Una constante numérica se debe separar de un identificador o de una palabra clave. Constantes de carácter. Un chat_constant se define como una comilla simple de apertura (“”), un carácter ASCII extendido imprimible y una comilla simple de cierre. Strings Constantes. Una constante de string es una secuencia de los caracteres incluidos dentro de dos comillas dobles ("). Una constante de string puede incluir la secuencia \” que representa un carácter de comillas doble en la secuencia en la cual ocurre, tal que no termina el string. La secuencia \n representa el carácter del NEWLINE, mientras que la secuencia \ \ representa el carácter del backslash y se puede incluir en un string también. Una secuencia consistente de un backslash seguido por cualquier carácter a excepción de 'n', '\ ', o ' " ' es ilegal. Por consiguiente, un string constante no debe extenderse más allá del extremo de la línea. Un par de /*…*/ dentro de un string constante no se trata como comentario. Operadores • • • • add_op = ' + ' | ' - ' mul_op = ' * ' | '/' eq_op = ' = = ' | '! = ' rel_op = ' < ' | ' < = ' | ' > = ' | ' > ' Compiladores. Guía 1 13 Investigación complementaria. 1) Investigar que es léxico y en qué consiste el análisis léxico de un traductor. 2) Investigar que es MICRO C, cuáles son sus definiciones léxicas (Identificadores, constantes numéricas, constantes de carácter, operadores, otros símbolos, entre otros). 3) Escribir un programa fuente en MICRO C que lea una temperatura en grados Celsius, lo convierta a temperatura absoluta y este resultado lo muestre en pantalla. 4) Escribir un programa en MICRO C que calcule el factorial de un número. 5) Investigar con el tutorial de Jflap como implementar Autómatas Finitos Deterministas (AFD). 14 Compiladores. Guía 1 Hoja de cotejo: Guía 1: Introducción a Compiladores y al Lenguaje Micro C Alumno: Máquina No: Docente: GL: 1 1 Fecha: EVALUACION % CONOCIMIENTO Del 20 al 30% APLICACIÓN DEL CONOCIMIENTO Del 40% al 60% 1-4 5-7 8-10 Conocimie nto deficient e de los fundament os teóricos Conocimiento y explicación incompleta de los fundamentos teóricos Conocimiento completo y explicación clara de los fundamentos teóricos No tiene actitud proactiva . Actitud propositiva y con propuestas no aplicables al contenido de la guía. Tiene actitud proactiva y sus propuestas son concretas. ACTITUD Del 15% al 30% TOTAL 100% Nota