Sie sind auf Seite 1von 13

Procesadores de Lenguaje En pocas palabras, un compilador es un programa que puede leer un programa en un lenguaje - El idioma de origen - y traducirlo a un programa

equivalente en otro idioma - el idioma de destino, ver fig. 1,1. Una funcin importante de la compilador es reportar cualquier error en el programa de origen que detecta durante el proceso de traduccin. CAPTULO 2. INTRODUCCIN programa fuente Compila h + programa de destino Figura 1.1: Un compilador Si el destino es un programa ejecutable en lenguaje de mquina del programa, lo que puede entonces ser llamado por el usuario para procesar las entradas y salidas de producir; vase la fig. 1,2. Objetivo La salida del programa tFigura 1.2: Ejecucin del programa de destino Un intrprete es otro tipo comn de procesador de lenguaje. En lugar de produccin de un programa de destino como una traduccin, un intrprete parece directamente ejecutar las operaciones especificadas en el programa de origen de los insumos suministrados por el usuario, como se muestra en la figura. 1,3. fuente del programa intrprete 1 t-salida entrada Figura 1.3: Un intrprete El programa objeto en lenguaje de mquina producida por un compilador suele ser mucho ms rpido que un intrprete en las entradas de funcin de las salidas. Un intrprete, Sin embargo, por lo general puede dar un mejor diagnstico de error que un compilador, ya que ejecuta la instruccin del programa fuente en la declaracin. Ejemplo 1.1: Los procesadores de lenguaje Java combinar compilacin e interpretacin, como se muestra en la figura. 1,4. Una fuente del programa Java puede primero ser compilados en una forma intermedia llamada bytecodes. Los bytecodes son interpretados por un mquina virtual. Un beneficio de esta disposicin es que bytecodes compilados en una mquina puede ser interpretada en otro equipo, tal vez a travs de una red. Con el fin de lograr un procesamiento ms rpido de las entradas a las salidas, algunos compiladores Java, llamado just-in-time compiladores, traducir los bytecodes en lenguaje de mquina inmediatamente antes de que se ejecute el programa intermedio para procesar la entrada. 1,1. PROCESADORES DE LENGUAJE programa fuente Traductor programa intermedio entrada Figura 1.4: Un compilador hbrido Adems de un compilador, varios programas pueden ser necesarios otros para crear un programa ejecutable de destino, como se muestra en la figura. 1,5. Un programa de fuente puede ser dividido en mdulos almacenados en archivos separados. La tarea de recoger la fuente programa a veces es confiada a un programa separado, llamado preprocesador. El preprocesador tambin puede expandir abreviaturas, llamadas macros, en idioma de origen pt en ENTOS. El programa de fuente modificado se alimenta entonces a un compilador. El compilador puede producir un programa en lenguaje ensamblador como su salida, porque el lenguaje ensamblador es ms fcil de producir como salida y es ms fcil de depurar. El conjunto

idioma es luego procesada por un programa llamado ensamblador que produce cdigo mquina reubicable como su salida. Los grandes programas a menudo se compilan en pedazos, por lo que la mquina reubicable cdigo puede tener que ser unidos entre s con otros ficheros objeto reubicables y archivos de biblioteca en el cdigo que realmente ejecuta en la mquina. El enlazador resuelve direcciones externas de memoria, donde el cdigo en un archivo puede referirse a una ubicacin en otro archivo. El cargador entonces rene todos los archivos ejecutables de objetos en memoria para su ejecucin. 1.11 Ejercicios para la Seccin 1.1 Ejercicio 1.1.1: Cul es la diferencia entre un compilador y un intrprete? Ejercicio 1.1.2: Cules son las ventajas de (a) un compilador de ms de un intrprete (B) un intrprete durante un compilador? Ejercicio 1.1.3: Qu ventajas tiene un sistema de tratamiento de la lengua en que produce el compilador de lenguaje ensamblador en lugar de lenguaje de mquina? Ejercicio 1.1.4: Un compilador que traduce un lenguaje de alto nivel a otro lenguaje de alto nivel se denomina un traductor de fuente a fuente. Qu ventajas hay que usar C como un lenguaje objetivo para un compilador? Ejercicio 1.1.5: Describir algunas de las tareas que un ensamblador tiene que realizar. CAPTULO 1. INTRODUCCIN programa fuente yo T JPreprocessor fuente modificado programa Yo fCompilier blanco t asamblea programa / I Assembler 1 i cdigo mquina reubicable archivos de la biblioteca reubicable obiect archivos blanco t cdigo mquina Figura 1.5: Un sistema de procesamiento de lenguajes 1.2 Estructura de un compilador Hasta aqu hemos tratado a un compilador como una sola caja que asigna una fuente programa en un programa de destino semnticamente equivalentes. Si abrimos la caja un poco, vemos que hay dos partes en este mapeo: anlisis y sntesis. La parte de anlisis divide el programa fuente en partes constituyentes y impone una estructura gramatical en ellos. A continuacin se utiliza esta estructura para crear una representacin intermedia del programa fuente. Si la parte de anlisis detecta que el programa fuente es o sintcticamente mal formado o semnticamente poco slido, entonces debe proporcionar mensajes informativos, de modo que el usuario puede tomar accin correctiva. La parte de anlisis tambin puede recabar informacin acerca de la fuente programa y lo almacena en una estructura de datos llamada tabla de smbolos, que se pasa junto con la representacin intermedia a la parte de sntesis. La parte de sntesis construye el programa de destino deseado a partir del intermedio y representacin de la informacin en la tabla de smbolos. La parte de anlisis

se llama a menudo el extremo delantero del compilador; la parte de sntesis es el extremo posterior. Si examinamos el proceso de compilacin con ms detalle, se ve que opera como una secuencia de fases, cada una de las cuales transforma una representacin de la fuente de programa a otro. Una descomposicin tpica de un compilador en fases se muestra en la figura. 1,6. En la prctica, varias fases pueden estar agrupados, y las representaciones intermedias entre las fases no necesita ser agrupados construido de forma explcita. La tabla de smbolos, que almacena informacin acerca de la 1,2. LA ESTRUCTURA OFA COMPILADOR L Tabla ESymbol , Carac, arroyo, / Analizador lxico 1 muestra Atream F Analizador de sintaxis rbol sintctico + 1 Analizador Semntico Yo generador de cdigo intermedio I II Yo cin intermedia representan yo Independiente de la mquina representacin intermedia Generador de cdigo de 1i I I I Yo meta-cdigo mquina C I depende de la mquina optimizador de cdigo Yo, yo t-Arget cdigo mquina t Figura 1.6: Fases de un compilador programa de cdigo fuente completo, es utilizado por todas las fases del compilador. Algunos compiladores tienen una fase de optimizacin independiente de la mquina entre el extremo delantero y el extremo trasero. El propsito de esta fase de optimizacin es realizar transformaciones en la representacin intermedia, de modo que la parte posterior extremo puede producir un programa de destino mejor de lo que de otro modo habra producido a partir de una representacin intermedia sin optimizar. Puesto que la optimizacin est opcional, una o la otra de las dos fases de optimizacin que se muestran en la figura. 1.6 puede faltar. 1.2.1 Anlisis lxico La primera fase de un compilador se llama anlisis lxico o exploracin. El lxico analizador lee la secuencia de caracteres que componen el programa fuente 6 CAPTULO 1. INTRODUCCIN y los grupos de los personajes en secuencias significativas llamado lexemas. Para cada uno lexema, el analizador lxico produce como salida una seal de la forma (Token de nombre, atributo-valor)

que lo pasa a la fase siguiente, el anlisis de sintaxis. En la ficha, la primer componente simblico-name es un smbolo abstracto que se utiliza durante la sintaxis anlisis, y los segundos componentes de atributo-valor apunta a una entrada en la tabla de smbolos para este token. Informacin de la 'entrada la tabla de smbolos se necesita para el anlisis semntico y generacin de cdigo. Por ejemplo, supongamos que un programa de cdigo contiene la instruccin de asignacin posicion = i n i t i a l + r a t e * 60 (1.1) Los personajes de esta tarea podra ser agrupadas en las siguientes lexemas y se asignan a las fichas siguientes pasan al analizador de sintaxis: 1. ion postulan es un lexema que se asignan en un token (id, I), donde id es un smbolo abstracto de pie para el identificador y los puntos 1 al symboltable entrada para la posicin. La entrada de la tabla de smbolos para un identificador tiene informacin sobre el identificador, como su nombre y tipo. 2. El smbolo de asignacin = es un lexema que se asigna a la seal (=). Dado que esta muestra no necesita atributo-valor, hemos omitido el segundo componente. Podramos haber utilizado cualquier smbolo abstracto como para asignar el token de nombre, pero por conveniencia notacional hemos optado por utilizar el lexema s mismo como el nombre del smbolo abstracto. 3. inicial es un lexema que se asigna en el token (id, 2), donde 2 puntos a la entrada de la tabla de smbolos para i n i t i a l. 4. + Es un lexema que se asigna a la seal (+). 5. tasa es un lexema que se asigna en el token (id, 3), donde a 3 puntos la entrada de la tabla de smbolos para una r e t. 6. * Es un lexema que se asigna en el token (*). 7. 60 es un lexema que se asigna a la seal (60). ' Los espacios en blanco que separan los lexemas sera descartado por el analizador lxico. La Figura 1.7 muestra la representacin de la instruccin de asignacin (1,1) despus de anlisis lxico como la secuencia de tokens En esta representacin, los nombres simblicos =, + y * son smbolos abstractos para la asignacin, adems, y operadores de multiplicacin, respectivamente. "Tcnicamente hablando, para el lexema 60 que deben componer una muestra como (nmero 4), donde 4 indica la tabla de smbolos para la representacin interna de 60 entero sino que nos aplazar la discusin de fichas para los nmeros hasta el captulo 2. El Captulo 3 discute las tcnicas para la construccin de analizadores lxicos. 1,2. LA ESTRUCTURA DE UN COMPILADOR ;M3rate posicion = i n i t i a l + r a t e * 60 t Analizador Lxico t (Id, 1) (=) (id, 2) (+) (id, 3) (*) (60) t Analizador de sintaxis (Id, 2) / JF (Id, 3) / \ 60 Analizador sSemantic \ +,

') 2 (id, * \ ') 3 (id, int t ofloat tI 60 I Generador de cdigo Intermedio I t tl = i n t t d e l a t o (6 0) t 2 = id3 * ti t 3 = id2 + t 2 id1 = t 3 tl = id3 * 60.0 id1 = id2 + t1 LDF R2, id3 MULF R2, R2, # 60,0 LDF R1, id2 ADDF R1, R1, R2 STF d i l y R l Figura 1.7: Traduccin de una sentencia de asignacin 8 CAPTULO 1. INTRODUCCIN 1.2.2 Sintaxis Anlisis La segunda fase del compilador es el anlisis de la sintaxis o el anlisis. El analizador utiliza los primeros componentes de las seales producidas por el analizador lxico para crear una representacin intermedia en forma de rbol que representa la estructura gramatical de la corriente de seal. Una representacin tpica es un rbol de sintaxis en el que cada uno nodo interior representa una operacin y los hijos del nodo representan la argumentos de la operacin. Un rbol de sintaxis para el flujo de seal (1,2) se muestra como la salida del analizador sintctico en la figura. 1,7. Este rbol muestra el orden en el que las operaciones en la asignacin posicion = i n i t i a l + r a t e * 60 se han de realizar. El rbol tiene un nodo interior marcado con * (id, 3) como su hijo izquierdo y el entero 60 como su hijo derecho. El nodo (id, 3) representa la tasa de identificador. * El nodo etiquetado aclara que primero debemos multiplicar el valor de r a t e por 60. El + nodo etiquetado indica que debemos aadir el resultado de esta multiplicacin al valor de inicial. La raz de la rbol, etiquetados =, indica que hay que almacenar el resultado de esta adicin en la ubicacin para el ion postulan identificador. Este orden de las operaciones es consistente con las convenciones usuales de la aritmtica que nos dicen que la multiplicacin tiene precedencia mayor que la suma, y por lo tanto que la multiplicacin es ser realiza antes de la adicin. Las fases posteriores de la compilador utilizar la estructura gramatical para ayudar analizar el programa fuente y generar el programa de destino. En el captulo 4 vamos a utilizar gramticas libres de contexto para especificar la estructura gramatical de lenguajes de programacin y algoritmos para discutir la construccin de sintaxis eficiente Los analizadores de forma automtica a partir de ciertas clases de gramticas. En los captulos 2 y 5 veremos que las definiciones dirigidas por la sintaxis puede ayudar a especificar la traduccin de construcciones del lenguaje de programacin. 1.2.3 Anlisis Semntico El analizador semntico utiliza el rbol de sintaxis y de la informacin en el smbolo mesa para el registro del programa de origen para mantener la coherencia semntica del lenguaje

definicin. Tambin recoge informacin sobre el tipo y la guarda en el rbol de sintaxis o la tabla de smbolos, para su uso posterior durante la generacin de cdigo intermedio. Una parte importante del anlisis semntico es la verificacin de tipos, donde el compilador comprueba que cada operador ha emparejan operandos. Por ejemplo, la programacin de muchos definiciones de la lengua requiere un ndice de matriz a ser un nmero entero, el compilador debe informar de un error si un nmero de punto flotante se utiliza para indexar un array. La especificacin del lenguaje puede permitir algunas conversiones de tipos de llamadas coacciones. Por ejemplo, un operador aritmtico binario se puede aplicar a un par de enteros o de un par de nmeros de punto flotante. Si el operador se aplica a un nmero de coma flotante y un entero, el compilador puede convertir o coaccionar el entero en un nmero de coma flotante. 1,2. LA ESTRUCTURA DE UN COMPILADOR 9 Tal coaccin aparece en la figura. 1,7. Supongamos que la posicin, i n i t i a l, y tasa han sido declarados nmeros de punto flotante, y que el lexema 60 por s mismo forma un nmero entero. El comprobador de tipos en el analizador semntico en la fig. 1,7 descubre que el operador * se aplica a una tasa de nmero de coma flotante y un entero 60. En este caso, el nmero entero puede ser convertido en un punto flotante nmero. En la fig. 1,7, nota que la salida del analizador semntico tiene una nodo extra para el operador inttofloat, que explcitamente convierte el entero argumento en un nmero de punto flotante. Tipo de control y anlisis semntico se discuten en el Captulo 6. 1.2.4 Generacin de cdigo intermedio En el proceso de traduccin de un programa fuente a cdigo de objetivo, un compilador puede construir una o ms representaciones intermedias, que pueden tener una variedad de formas. rboles de sintaxis son una forma de representacin intermedia, son de uso comn durante la sintaxis y el anlisis semntico. Tras el anlisis de la sintaxis y la semntica de la fuente de programas, muchos compiladores generar una representacin explcita de bajo nivel intermedio o como mquina, que podemos considerar como un programa para una mquina abstracta. Este intermedio representacin debe tener dos propiedades importantes: debe ser de fcil producir y debe ser fcil de traducir en la mquina de destino. En el captulo 6, se considera una forma intermedia llamada cdigo de tres direcciones, que consta de una secuencia de montaje-como instrucciones con tres operandos por instruccin. Cada operando puede actuar como un registro. La salida del intermedio generador de cdigo en la figura. 1.7 consiste en la secuencia de cdigo de tres direcciones tl = i n t t d e l a t o (60) t 2 = id3 * tl t 3 = id2 + t 2 id1 = t 3 Hay varios puntos que vale la pena destacar sobre las instrucciones de tres direcciones. En primer lugar, cada instruccin de asignacin de tres direcciones tiene a lo sumo un operador en el lado derecho. Por lo tanto, estas instrucciones fijar el orden en el que las operaciones han de ser hecho, la multiplicacin precede a la adicin en el programa de origen (1,1). En segundo lugar, el compilador debe generar un nombre temporal para guardar el valor calculado

por una instruccin de tres direcciones. En tercer lugar, algunas "instrucciones de tres direcciones", como el primero y el ltimo de la secuencia (1,3), arriba, tiene menos de tres operandos. En el captulo 6, cubrimos las representaciones principales intermedios utilizados en compiladores. Los captulos 5 presenta las tcnicas para traduccin dirigida por la sintaxis que se aplican en el Captulo 6 de tipo de generacin y comprobacin de cdigo intermediopara las tpicas construcciones de lenguajes de programacin tales como expresiones, flujo-decontrol construcciones y llamadas a procedimientos. 10 CAPTULO 1. INTRODUCCIN 1.2.5 Optimizacin de Cdigo Las independiente del equipo de optimizacin de cdigo intentos de fase para mejorar la cdigo intermedio para que mejor cdigo objetivo resultar. Por lo general, mejores medios ms rpido, pero otros objetivos se puede desear, como la ms corta del cdigo, o cdigo de destino que consume menos energa. Por ejemplo, un algoritmo sencillo genera el cdigo intermedio (1,3), utilizando una instruccin para cada operador en el rbol representacin que viene desde el analizador semntico. Un simple cdigo intermedio algoritmo de generacin seguido por la optimizacin del cdigo es una forma razonable para generar cdigo buen objetivo. El optimizador puede deducir que la conversin de 60 de entero a punto flotante puede hacerse una vez y para todo en tiempo de compilacin, por lo que la operacin inttofloat se puede eliminar mediante la sustitucin el nmero entero 60 por el nmero de punto flotante de 60,0. Adems, t3 se utiliza slo una vez para transmitir su valor a id1 lo que el optimizador puede transformar (1,3) en la secuencia ms corta Hay una gran variacin en la cantidad de optimizacin de cdigo diferentes compiladores realizar. En los que s la mayora, los llamados "compiladores de optimizacin" una cantidad significativa de tiempo que se gasta en esta fase. Hay optimizaciones simples que mejoran notablemente el tiempo de ejecucin del programa de destino sin ralentizar compilacin demasiado. Los captulos del 8 de discutir optimizaciones independientes de la mquina y mquina-dependiente en detalle. 1.2.6 Generacin de cdigo El generador de cdigo toma como entrada una representacin intermedia de la fuente programa y lo asigna a la lengua de destino. Si el idioma de destino es una mquina ubicaciones de cdigo, los registros o en la memoria se seleccionan para cada una de las variables utilizadas por el programa. Entonces, las instrucciones intermedios se traducen en secuencias de instrucciones de mquina que llevan a cabo la misma tarea. Un aspecto crucial de cdigo generacin es la asignacin juiciosa de registros para contener variables. Por ejemplo, utilizando los registros R1 y R2, el cdigo intermedio en (1,4) podra se traducen en el cdigo de la mquina LDF R2, id3 MULF R 2, R 2, # 60.0 LDF R l, id2 ADDF R l, l R, R2 STF i d l, R l El primer operando de cada instruccin especifica un destino. El F en cada uno

instruccin nos indica que se trata de nmeros de punto flotante. El cdigo en 1,2. LA ESTRUCTURA DE UN COMPILADOR 11 (1,5) carga el contenido de id3 direccin en el registro R2, luego lo multiplica con constante de coma flotante 60,0. El # significa que 60,0 ha de ser tratado como un constante inmediata. La tercera instruccin mueve id2 en el registro R1 y el cuarto le aade el valor calculado previamente en el registro R2. Finalmente, el valor en el registro R1 se almacena en la direccin de IDL, as que el cdigo implementa correctamente la instruccin de asignacin (1,1). El captulo 8 se refiere a la generacin de cdigo. Esta discusin sobre la generacin de cdigo ha ignorado la importante cuestin del almacenamiento asignacin de los identificadores en el programa fuente. Como veremos en el Captulo 7, la organizacin del almacenamiento en tiempo de ejecucin depende del lenguaje es compilado. Asignacin de almacenamiento-se toman las decisiones, ya sea durante intermedia generacin de cdigo o durante la generacin de cdigo. 1.2.7 Gestin de la tabla de smbolos Una funcin esencial de un compilador es registrar los nombres de las variables utilizadas en el fuente del programa y recopilar informacin sobre los distintos atributos de cada nombre. Estos atributos pueden proporcionar informacin sobre el almacenamiento asignado para un nombre, su tipo, su mbito de aplicacin (donde en el programa de su valor puede ser utilizado), y en el ca, se de nombres de procedimientos, cosas tales como el nmero y tipo de su argumentos, el mtodo de pasar cada argumento (por ejemplo, por valor o por referencia), y el tipo devuelto. La tabla de smbolos es una estructura de datos que contiene un registro para cada variable nombrar, con los campos para los atributos del nombre. La estructura de datos debe estar diseado para permitir que el compilador para encontrar el registro para cada nombre de forma rpida y a almacenar o recuperar datos de ese registro rpidamente. Las tablas de smbolos se discuten en Captulo 2. 1.2.8 La Agrupacin de fases en pases La discusin de las fases se ocupa de la organizacin lgica de un compilador. En una aplicacin, las actividades de varias fases pueden agruparse en un pase que lee un archivo de entrada y escribe un archivo de salida. Por ejemplo, las fases de front-end de anlisis lxico, anlisis sintctico, anlisis semntico, y la generacin de cdigo intermedio podra ser agrupados en una sola pasada. Cdigo optimizacin podra ser un paso opcional. Entonces podra haber un pase de back-end que consiste en la generacin de cdigo para una mquina de destino particular. Algunas colecciones de compilacin se han creado alrededor cuidadosamente diseado intermedio representaciones que permiten a la parte delantera para un idioma concreto para interfaz con la parte trasera de una mquina de destino determinado. Con estas colecciones, podemos producir compiladores para lenguajes de origen diferentes para la mquina de destino mediante la combinacin de diferentes frontal termina con la parte trasera de la mquina de destino. Del mismo modo, podemos producir compiladores para los equipos de destino diferentes, combinando un frontal con la parte final de los equipos de destino diferentes. 12 CAPTULO 1. INTRODUCCIN 1.2.9 Construccin del compilador-Tools

El escritor del compilador, al igual que cualquier desarrollador de software, puede utilizar provechosamente moderno entornos de desarrollo de software que contienen herramientas tales como editores de lenguaje, depuradores, gerentes versin, perfiladores, arneses de prueba, y as sucesivamente. Adems a estos generales de desarrollo de software herramientas, otras herramientas ms especializadas tienen sido creado para ayudar a implementar las distintas fases de un compilador. Estas herramientas utilizan lenguajes especializados para especificar e implementar especfico componentes, y muchos utilizan algoritmos muy sofisticados. El ms exitoso herramientas son aquellas que ocultar los detalles del algoritmo de generacin y producir componentes que pueden ser fcilmente integrados en el resto de la compilador. Algunas de uso comn de construccin de compiladores herramientas incluyen 1. Generadores de analizadores sintcticos que automticamente producen analizadores de sintaxis de un descripcin gramatical de un lenguaje de programacin. 2. Generadores de escner que producen analizadores lxicos a partir de expresiones regulares descripcin de los smbolos de una lengua. 3. Dirigidas por la sintaxis motores de traduccin que producen colecciones de rutinas para caminar un rbol de anlisis y generacin de cdigo intermedio. 4. Generador de cdigo-generadores que producen un generador de cdigo de una coleccin de reglas para la traduccin de cada operacin del lenguaje intermedio en el lenguaje de mquina por un equipo de destino. 5. Flujo de datos de los motores de anlisis que faciliten la obtencin de informacin acerca de cmo se transmiten los valores de una parte de un programa para cada uno por otra parte. Datos de anlisis de flujo es una parte clave de la optimizacin del cdigo. 6. La construccin de compiladores-toolk2ts que proporcionan un conjunto integrado de rutinas para la construccin de las distintas fases de un compilador. Vamos a describir muchas de estas herramientas en este libro. 1.3 La evolucin de los lenguajes de programacin Las computadoras electrnicas por primera vez en la dcada de 1940 y se programaron en lenguaje de mquina por secuencias de 0 y de 1 que dice explcitamente el ordenador lo que las operaciones a ejecutar y en qu orden. Las propias operaciones eran de muy baja: mover datos de un lugar a otro, agregar el contenido de dos registros, comparar dos valores, y as sucesivamente. No hace falta decir que este tipo de la programacin fue lento, tedioso y propenso a errores. Y una vez escrito, el programas eran difciles de entender y modificar. 1,3. LA EVOLUCIN DE LOS LENGUAJES DE PROGRAMACIN 1.3.1 El traslado a lenguajes de alto nivel El primer paso hacia los lenguajes de programacin ms personas son bienvenidas, fue la desarrollo de los lenguajes ensambladores mnemotcnicas en la dcada de 1950. Inicialmente, las instrucciones en un lenguaje ensamblador no eran ms que representaciones mnemnicas de instrucciones de mquina. Ms tarde, las macroinstrucciones se aadieron al conjunto idiomas para que un programador podra definir abreviaturas para los parmetros frecuentemente utilizado secuencias de instrucciones de la mquina. Un paso importante hacia lenguajes de alto nivel se hizo en la segunda mitad de la dcada de 1950 con el desarrollo de Fortran para clculo cientfico, Cobol para el negocio de procesamiento de datos, y Lisp para el clculo simblico. La filosofa detrs de estas lenguas fue la creacin de ms alto nivel con anotaciones que

programadores podan escribir ms fcilmente clculos numricos, aplicaciones empresariales, programas y simblicos. Estas lenguas fueron tan exitosos que todava estn en uso hoy en da. En las dcadas siguientes, muchos ms idiomas se han creado con la innovadora caractersticas para ayudar a hacer la programacin ms fcil, ms natural y ms robusto. Ms adelante en este captulo, discutiremos algunas de las caractersticas clave que son comunes a muchos lenguajes de programacin modernos. Hoy en da, hay miles de lenguajes de programacin. Se pueden clasificar en una variedad de maneras. Una clasificacin es por generacin. La primera generacin idiomas son los idiomas de la mquina, la segunda generacin de los lenguajes ensambladores, y tercera generacin de los lenguajes de alto nivel como Fortran, Cobol, Lisp, C, C + +, C # y Java. Lenguajes de cuarta generacin son lenguajes diseados para aplicaciones especficas como NOMAD para la generacin de informes, SQL para bases de datos consultas y PostScript para formatear el texto. El trmino de la quinta generacin idioma se ha aplicado a lenguajes lgicos-y basados en restricciones como Prolog y OPS5. Otra clasificacin de las lenguas utiliza el trmino imperativo para las lenguas en el que un programa especifica cmo un clculo que se debe hacer y declarativa para los idiomas en los que un programa de clculo especifica lo que se debe hacer. Lenguajes como C, C + +, C # y Java son lenguajes imperativos. En imperativo idiomas existe una nocin de estado del programa y sentencias que cambian el estado. Los lenguajes funcionales como Haskell y ML y la lgica limitacin lenguajes como Prolog son a menudo considerados como lenguajes declarativos. El trmino von Neumann idioma se aplica a los lenguajes de programacin cuyo modelo computacional se basa en la arquitectura de computadores von Neumann. Muchas de las lenguas de hoy en da, tales como Fortran y C son von Neumann idiomas. Un lenguaje orientado a objetos es la que soporta programacin orientada a objetos, un estilo de programacin en el que un programa consiste en una coleccin de objetos que interactan entre s. Simula 67 y Smalltalk son el primer gran lenguajes orientados a objetos. Lenguajes como C + +, C #, Java y Ruby son ms recientes orientadas a ob-yecto idiomas. Lenguajes de script son lenguajes interpretados con operadores de alto nivel diseadas para "ti conseguir pegado a sus" clculos. Estos clculos fueron originalmente 14 CAPTULO 1. INTRODUCCIN llamado "scripts". Awk, JavaScript, Perl, PHP, Python, Ruby y Tcl son populares ejemplos de lenguajes de script. Los programas escritos en lenguajes de scripting son a menudo mucho ms corto que los programas equivalentes escritos en lenguajes como C. 1.3.2 Impactos sobre compiladores Dado que el diseo de lenguajes de programacin y compiladores estn ntimamente relacionados, los avances en los lenguajes de programacin nuevas exigencias sobre los autores de compiladores. Tuvieron que idear algoritmos y representaciones de traducir y apoyar las nuevas caractersticas del lenguaje. Desde la dcada de 1940, la arquitectura informtica ha evolucionado

tambin. No slo los autores de compiladores tienen que seguir nuevas caractersticas del lenguaje, tambin tuvieron que idear algoritmos de traduccin que tendran mxima ventaja de las capacidades de hardware nuevos. Los compiladores pueden ayudar a promover el uso de lenguajes de alto nivel, minimizando la sobrecarga de ejecucin de los programas escritos en estos idiomas. Compiladores tambin son fundamentales en la toma de arquitecturas de alto rendimiento efectivo de ordenador en las aplicaciones de los usuarios. De hecho, el rendimiento de un sistema informtico es tan dependiente de la tecnologa compilador que los compiladores se utiliza como una herramienta para evaluar conceptos arquitectnicos antes de que un equipo se construye. Escrito Compiler es un reto. Un compilador por s mismo es un gran programa. Adems, muchos modernos sistemas de tratamiento de la lengua manejar varios idiomas de origen y los equipos de destino dentro del mismo marco, es decir, las que sirven como colecciones de los compiladores, posiblemente formada por millones de lneas de cdigo. Por consiguiente, buenas tcnicas de ingeniera de software son esenciales para la creacin y la evolucin de los procesadores modernos del lenguaje. Un compilador debe traducir correctamente el conjunto potencialmente infinito de programas que se puede escribir en el idioma de origen. El problema de la generacin de la cdigo objetivo ptimo de un programa fuente es indecidible en general, por lo autores de compiladores deben evaluar las compensaciones sobre cules son los problemas a abordar y lo heurstica a utilizar para abordar el problema de la generacin de cdigo eficiente. Un estudio de los compiladores es tambin un estudio de cmo la teora se rene la prctica, como veremos en la seccin 1.4. El propsito de este texto es ensear la metodologa y las ideas fundamentales utilizado en el diseo del compilador. No es la intencin de este texto para ensear a todo el algoritmos y tcnicas que podran ser utilizados para la construccin de un st comi-de-la-arte lenguaje de procesamiento del sistema. Sin embargo, los lectores de este texto adquirir el bsico conocimiento y entendimiento para aprender a construir un compilador con relativa facilidad. 1.3.3 Ejercicios para la Seccin 1.3 Ejercicio 1.3.1: Indique cul de los siguientes trminos: a) imperativo b) declarativo c) von Neumann d) orientado a objetos e) funcional f) de tercera generacin g) de cuarta generacin h) scripting 1,4. LA CIENCIA DE LA CONSTRUCCIN DE UN COMPILADOR aplican a cul de los siguientes idiomas: 1) C 2) C + + 3) Cobol 4) Fortran 5) Java 6) Lisp 7) ML 8) Per1 9) Python 10) VB. 1.4 La ciencia de la construccin de un compilador Diseo del compilador est llena de bellos ejemplos donde complicados problemas del mundo real se resuelven mediante la abstraccin de la esencia del problema matemticamente. Estos sirven como excelentes ilustraciones de cmo abstracciones se puede utilizar para resolver problemas:

tener un problema, formular una abstraccin matemtica que captura la caractersticas claves, y resolverlo utilizando tcnicas matemticas. El problema formulacin debe basarse en un slido conocimiento de las caractersticas de programas de ordenador, y la solucin debe ser validado y perfeccionado empricamente. Un compilador debe aceptar todos los programas de cdigo que se ajusten a la especificacin de la lengua, el conjunto de programas de cdigo es infinita y cualquier programa puede ser muy grande, que consta de posiblemente millones de lneas de cdigo. Cualquier transformacin realizada por el compilador al traducir un programa fuente debe conservar el sentido de que el programa se compila. Escritores del compilador por lo tanto tienen influencia ms no slo a los compiladores que generan, sino tambin todos los programas que sus compiladores compilar. Esta influencia hace que escribir compiladores particularmente gratificante; sin embargo, tambin hace que el desarrollo compilador desafiante. 1.4.1 Modelado en el Diseo e Implementacin del compilador El estudio de los compiladores es principalmente un estudio de la forma en que diseamos el derecho matemtica modelos y elegir los algoritmos correctos, mientras que equilibrar la necesidad de generalidad y poder en contra de la simplicidad y eficiencia. Algunos de los modelos fundamentales son la mayora de mquinas de estado finito y regulares expresiones, lo que nos encontraremos en el captulo 3. Estos modelos son tiles para describir las unidades lxicas de programas (palabras clave, identificadores y tal) y para describir los algoritmos utilizados por el compilador para reconocer esas unidades. Tambin entre los modelos ms fundamentales son gramticas libres de contexto, que se utiliza para describir la estructura sintctica de los lenguajes de programacin tales como el desove de parntesis o construcciones de control. Vamos a estudiar gramtica en el captulo 4. De manera similar, los rboles son un importante modelo para representar la estructura de los programas de y su traduccin en cdigo objeto, como veremos en el captulo 5. 1.4.2 La ciencia de la optimizacin del cdigo El trmino "optimizacin" en el diseo del compilador se refiere a los intentos que un compilador hace para producir cdigo que es ms eficiente que el cdigo obvio. "Optimizacin" es por lo tanto un nombre inapropiado, ya que no hay manera de que el cdigo producido por un compilador puede garantizarse que sea tan rpido o ms que cualquier otro cdigo que realiza la misma tarea. CAPTULO 1. INTRODUCCIN En los tiempos modernos, la optimizacin de cdigo que tiene un compilador realiza hecho ms importante y ms complejo. Es ms complejo porque arquitecturas de procesadores han vuelto ms complejas, dando ms oportunidades para mejorar la forma de cdigo se ejecuta. Es ms importante porque masivamente paralelo equipos requieren optimizacin sustancial, o su rendimiento se ve afectado por rdenes de magnitud. Con la posible prevalencia de mltiples ncleos mquinas (ordenadores con chips que tienen un gran nmero de procesadores en ellos), todos los compiladores tendr que enfrentar el problema de tomar ventaja de las mquinas multiprocesador. Es difcil, si no imposible, para construir un compilador robusto de "hacks". Por lo tanto, una teora amplia y til ha sido construido alrededor del problema de la optimizacin de cdigo.

Uno de los ms importantes

Por lo tanto, el ms importante

Tpicamente, la Adems de

Das könnte Ihnen auch gefallen