compilador - wikipedia, la enciclopedia libre

Upload: ulises-gordillo-zapana

Post on 02-Mar-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    1/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    http://es.wikipedia.org/wiki/Compilador 1/10

    Diagrama a bloques de la operacin de un buencompilador.

    CompiladorDe Wikipedia, la enciclopedia libre

    Un compiladores un programa informtico que traduceun programa escrito en un lenguaje de programacin aotro lenguaje deprogramacin, generando un programaequivalente que la mquina ser capaz de interpretar.Usualmente el segundo lenguaje es lenguaje de mquina,pero tambin puede ser un cdigo intermedio(bytecode), o simplemente texto. Este proceso detraduccin se conoce como compilacin.1

    Un compilador es unprograma que permite traducir elcdigo fuente de unprograma en lenguaje de alto nivel,a otro lenguaje de nivel inferior (tpicamente lenguaje demquina). De esta manera un programador puede

    disear unprograma en un lenguaje mucho ms cercanoa como piensa un ser humano, para luego compilarloaun programa ms manejable poruna computadora.

    Como parte importante de este proceso de traduccin,el compilador informa a su usuario de la presencia deerrores en el programa fuente.2

    ndice

    1 Partes de un compilador2 Historia3 Tipos de compiladores4 Proceso de compilacin5 Etapas del proceso

    5.1 Fase de anlisis5.1.1 Anlisis lxico5.1.2 Anlisis sintctico

    5.1.3 Anlisis semntico5.2 Fase de sntesis

    5.2.1 Generacin de cdigointermedio

    5.3 Optimizacin de cdigo6 Estructura de datos principales

    6.1 Componentes lxicos o tokens6.2 rbol sintctico6.3 Tabla de smbolos

    6.4 Tabla de literales6.5 Cdigo intermedio6.6 Archivos temporales

    7 Vase tambin

    http://commons.wikimedia.org/wiki/File:CompilationScheme-Spanish.pnghttp://commons.wikimedia.org/wiki/File:CompilationScheme-Spanish.pnghttp://es.wikipedia.org/wiki/Lenguaje_de_m%C3%A1quinahttp://es.wikipedia.org/wiki/C%C3%B3digo_fuentehttp://es.wikipedia.org/wiki/Proceso_de_traducci%C3%B3n_de_programashttp://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttp://es.wikipedia.org/wiki/Proceso_de_traducci%C3%B3n_de_programashttp://es.wikipedia.org/wiki/Lenguaje_de_m%C3%A1quinahttp://es.wikipedia.org/wiki/Lenguaje_de_alto_nivelhttp://es.wikipedia.org/wiki/C%C3%B3digo_fuentehttp://es.wikipedia.org/wiki/Bytecodehttp://es.wikipedia.org/wiki/Lenguaje_de_m%C3%A1quinahttp://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttp://es.wikipedia.org/wiki/Proceso_de_traducci%C3%B3n_de_programashttp://es.wikipedia.org/wiki/Programa_inform%C3%A1ticohttp://commons.wikimedia.org/wiki/File:CompilationScheme-Spanish.png
  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    2/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    http://es.wikipedia.org/wiki/Compilador 2/10

    8 Referencias9 Enlaces externos

    Partes de un compilador

    La construccin de un compilador involucra la divisin del proceso en una serie de fases que variar con sucomplejidad. Generalmente estas fases se agrupan en dos tareas: el anlisis del programa fuente y la sntesis delprograma objeto.

    Anlisis: Se trata de la comprobacin de la correccin del programa fuente, e incluye las fasescorrespondientes al Anlisis lxico (que consiste en la descomposicin del programa fuente encomponentes lxicos), Anlisis sintctico (agrupacin de los componentes lxicos en frases gramaticales )y Anlisis semntico (comprobacin de la validez semntica de las sentencias aceptadas en la fase deAnlisis Sintctico).Sntesis: Su objetivo es la generacin de la salida expresada en el lenguaje objeto y suele estar formado

    por una o varias combinaciones de fases de Generacin de Cdigo (normalmente se trata de cdigointermedio o de cdigo objeto) y de Optimizacin de Cdigo (en las que se busca obtener un cdigo loms eficiente posible).

    Alternativamente, las fases descritas para las tareas de anlisis y sntesis se pueden agrupar en Front-end yBack-end:

    Front-end: es la parte que analiza el cdigo fuente, comprueba su validez, genera el rbol de derivaciny rellena los valores de la tabla de smbolos. Esta parte suele ser independiente de la plataforma o sistemapara el cual se vaya a compilar, y est compuesta por las fases comprendidas entre el Anlisis Lxico y la

    Generacin de Cdigo Intermedio.Back-end: es la parte que genera el cdigo mquina, especfico de una plataforma, a partir de losresultados de la fase de anlisis, realizada por elFront End.

    Esta divisin permite que el mismoBack Endse utilice para generar el cdigo mquina de varios lenguajes deprogramacin distintos y que el mismoFront Endque sirve para analizar el cdigo fuente de un lenguaje deprogramacin concreto sirva para generar cdigo mquina en varias plataformas distintas. Suele incluir lageneracin y optimizacin del cdigo dependiente de la mquina.

    El cdigo que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser

    enlazado por un programa enlazador (linker)

    Historia

    En 1946 se desarroll la primera computadora digital. En un principio, estas mquinas ejecutaban instruccionesconsistentes en cdigos numricos que sealaban a los circuitos de la mquina los estados correspondientes acada operacin, lo que se denomin lenguaje mquina.

    Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus programas mediante

    claves ms fciles de recordar que esos cdigos; al final, todas esas claves juntas se traducan manualmente alenguaje mquina. Estas claves constituyen los llamados lenguajes ensambladores.

    http://es.wikipedia.org/wiki/Lenguaje_m%C3%A1quinahttp://es.wikipedia.org/wiki/Enlazadorhttp://es.wikipedia.org/wiki/C%C3%B3digo_m%C3%A1quinahttp://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttp://es.wikipedia.org/wiki/Lenguajes_de_programaci%C3%B3nhttp://es.wikipedia.org/wiki/C%C3%B3digo_m%C3%A1quinahttp://es.wikipedia.org/wiki/Back-endhttp://es.wikipedia.org/w/index.php?title=An%C3%A1lisis_L%C3%A9xico&action=edit&redlink=1http://es.wikipedia.org/wiki/Tabla_de_s%C3%ADmbolos_(compilador)http://es.wikipedia.org/w/index.php?title=%C3%81rbol_de_derivaci%C3%B3n&action=edit&redlink=1http://es.wikipedia.org/wiki/C%C3%B3digo_fuentehttp://es.wikipedia.org/wiki/Front-endhttp://es.wikipedia.org/w/index.php?title=Lenguaje_objeto&action=edit&redlink=1http://es.wikipedia.org/wiki/S%C3%ADntesishttp://es.wikipedia.org/w/index.php?title=An%C3%A1lisis_sem%C3%A1ntico&action=edit&redlink=1http://es.wikipedia.org/wiki/Analizador_sint%C3%A1cticohttp://es.wikipedia.org/wiki/Analizador_l%C3%A9xicohttp://es.wikipedia.org/wiki/An%C3%A1lisis_de_algoritmos
  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    3/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    http://es.wikipedia.org/wiki/Compilador 3/10

    Pese a todo, el lenguaje ensamblador segua siendo el de una mquina, pero ms fcil de manejar. Los trabajosde investigacin se orientaron hacia la creacin de un lenguaje que expresara las distintas acciones a realizar deuna manera lo ms sencilla posible para una persona. El primer compilador fue escrito por Grace Hopper, en1952 para el lenguaje de programacin A-0. En 1950 John Backus dirigi una investigacin en IBM sobre unlenguaje algebraico. En 1954 se empez a desarrollar un lenguaje que permita escribir frmulas matemticas demanera traducible por un ordenador; le llamaron FORTRAN (FORmulae TRANslator). Fue el primer lenguajede alto nivel y se introdujo en 1957 para el uso de la computadora IBM modelo 704.

    Surgi as por primera vez el concepto de un traductor como un programa que traduca un lenguaje a otrolenguaje. En el caso particular de que el lenguaje a traducir es un lenguaje de alto nivel y el lenguaje traducidode bajo nivel, se emplea el trmino compilador.

    La tarea de realizar un compilador no fue fcil. El primer compilador de FORTRAN tard 18 aos-persona enrealizarse y era muy sencillo. Este desarrollo de FORTRAN estaba muy influenciado por la mquina objeto enla que iba a ser implementado. Como un ejemplo de ello tenemos el hecho de que los espacios en blanco fuesenignorados, debido a que el perifrico que se utilizaba como entrada de programas (una lectora de tarjetasperforadas) no contaba correctamente los espacios en blanco.

    El primer compilador autocontenido, es decir, capaz de compilar su propio cdigo fuente fue el creado paraLisp por Hart y Levin en el MIT en 1962. Desde 1970 se ha convertido en una prctica comn escribir elcompilador en el mismo lenguaje que este compila, aunque Pascal y C han sido alternativas muy usadas.

    Crear un compilador autocontenido genera un problema llamado bootstrapping, es decir el primer compiladorcreado para un lenguaje tiene que o bien ser compilado por un compilador escrito en otro lenguaje o biencompilado al ejecutar el compilador en un intrprete.

    Tipos de compiladores

    Esta taxonoma de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que seadscriban a varias categoras:

    Compiladores cruzados: generan cdigo para un sistema distinto del que estn funcionando.Compiladores optimizadores: realizan cambios en el cdigo para mejorar su eficiencia, peromanteniendo la funcionalidad del programa original.Compiladores de una sola pasada: generan el cdigo mquina a partir de una nica lectura del cdigofuente.Compiladores de varias pasadas: necesitan leer el cdigo fuente varias veces antes de poder producirel cdigo mquina.Compiladores JIT(Just In Time): forman parte de un intrprete y compilan partes del cdigo segn senecesitan.

    Pauta de creacin de un compilador: En las primeras pocas de la informtica, el software de los compiladoresera considerado como uno de los ms complejos existentes.

    Los primeros compiladores se realizaron programndolos directamente en lenguaje mquina o en ensamblador.Una vez que se dispone de un compilador, se pueden escribir nuevas versiones del compilador (u otroscompiladores distintos) en el lenguaje que compila ese compilador.

    Actualmente existen herramientas que facilitan la tarea de escribir compiladores intrpretes informticos. Estasherramientas permiten generar el esqueleto del analizador sintctico a partir de una definicin formal dellenguaje de partida, especificada normalmente mediante una gramtica formal y barata, dejando nicamente al

    http://es.wikipedia.org/wiki/Gram%C3%A1tica_formalhttp://es.wikipedia.org/wiki/Analizador_sint%C3%A1cticohttp://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)http://es.wikipedia.org/wiki/Ensambladorhttp://es.wikipedia.org/wiki/Lenguaje_m%C3%A1quinahttp://es.wikipedia.org/wiki/Softwarehttp://es.wikipedia.org/wiki/Inform%C3%A1ticahttp://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)http://es.wikipedia.org/wiki/JIThttp://es.wikipedia.org/wiki/Compilador_optimizadorhttp://es.wikipedia.org/wiki/Compilador_cruzadohttp://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)http://es.wikipedia.org/wiki/FORTRANhttp://es.wikipedia.org/wiki/John_Backushttp://es.wikipedia.org/wiki/Grace_Hopperhttp://es.wikipedia.org/wiki/Lenguaje_ensamblador
  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    4/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    http://es.wikipedia.org/wiki/Compilador 4/10

    programador del compilador la tarea de programar las acciones semnticas asociadas.

    Proceso de compilacin

    Es el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de programacin alenguaje mquina. Adems de un traductor, se pueden necesitar otros programas para crear un programaobjeto ejecutable. Un programa fuente se puede dividir en mdulos almacenados en archivos distintos. La tarea

    de reunir el programa fuente a menudo se confa a un programa distinto, llamado preprocesador. Elpreprocesador tambin puede expandir abreviaturas, llamadas a macros, a proposiciones del lenguaje fuente.

    Normalmente la creacin de un programa ejecutable (un tpico.exe para Microsoft Windows o DOS) conllevados pasos. El primer paso se llama compilacin (propiamente dicho) y traduce el cdigo fuente escrito en unlenguaje de programacin almacenado en un archivo a cdigo en bajo nivel (normalmente en cdigo objeto, nodirectamente a lenguaje mquina). El segundo paso se llama enlazadoen el cual se enlaza el cdigo de bajonivel generado de todos los ficheros y subprogramas que se han mandado compilar y se aade el cdigo de lasfunciones que hay en las bibliotecas del compilador para que el ejecutable pueda comunicarse directamente conel sistema operativo, traduciendo as finalmente el cdigo objeto a cdigo mquina, y generando un mdulo

    ejecutable.

    Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de compilacin en archivosobjetos (un tpico.obj para Microsoft Windows, DOS o para Unix); para enlazarlos en fases posteriores, ocrear directamente el ejecutable; con lo que la fase de compilacin se almacena slo temporalmente. Unprograma podra tener partes escritas en varios lenguajes (por ejemplo C, C++ y Asm), que se podrancompilar de forma independiente y luego enlazar juntas para formar un nico mdulo ejecutable.

    Etapas del proceso

    El proceso de traduccin se compone internamente de varias etapas o fases, que realizan distintas operacioneslgicas. Es til pensar en estas fases como en piezas separadas dentro del traductor, y pueden en realidadescribirse como operaciones codificadas separadamente aunque en la prctica a menudo se integren juntas.

    Fase de anlisis

    Anlisis lxico

    El anlisis lxico constituye la primera fase, aqu se lee el programa fuente de izquierda a derecha y se agrupa encomponentes lxicos(tokens), que son secuencias de caracteres que tienen un significado. Adems, todos losespacios en blanco, lneas en blanco, comentarios y dems informacin innecesaria se elimina del programafuente. Tambin se comprueba que los smbolos del lenguaje (palabras clave, operadores, etc.) se han escritocorrectamente.

    Como la tarea que realiza el analizador lxico es un caso especial de coincidencia de patrones, se necesitan losmtodos de especificacin y reconocimiento de patrones, se usan principalmente los autmatas finitos queacepten expresiones regulares. Sin embargo, un analizador lxico tambin es la parte del traductor que manejala entrada del cdigo fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el

    analizador lxico debe funcionar de manera tan eficiente como sea posible.

    Anlisis sintctico

    http://es.wikipedia.org/wiki/Expresi%C3%B3n_regularhttp://es.wikipedia.org/wiki/Aut%C3%B3mata_finitohttp://es.wikipedia.org/wiki/Operadorhttp://es.wikipedia.org/wiki/Palabra_clavehttp://es.wikipedia.org/wiki/Token_(programaci%C3%B3n)http://es.wikipedia.org/wiki/Ejecutablehttp://es.wikipedia.org/wiki/Asmhttp://es.wikipedia.org/wiki/C%2B%2Bhttp://es.wikipedia.org/wiki/Chttp://es.wikipedia.org/wiki/Unixhttp://es.wikipedia.org/wiki/C%C3%B3digo_m%C3%A1quinahttp://es.wikipedia.org/wiki/C%C3%B3digo_objetohttp://es.wikipedia.org/wiki/Enlazadorhttp://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttp://es.wikipedia.org/wiki/DOShttp://es.wikipedia.org/wiki/Microsoft_Windowshttp://es.wikipedia.org/wiki/Ejecutablehttp://es.wikipedia.org/wiki/Preprocesador
  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    5/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    http://es.wikipedia.org/wiki/Compilador 5/10

    En esta fase los caracteres o componentes lxicos se agrupan jerrquicamente en frases gramaticales que elcompilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintcticamentecorrecto (obedece a la gramtica del lenguaje). Por lo general, las frases gramaticales del programa fuente serepresentan mediante un rbol de anlisis sintctico.

    La estructura jerrquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, sepueden dar las siguientes reglas como parte de la definicin de expresiones:

    1. Cualquier identificadores una expresin.2. Cualquier nmeroes una expresin.3. Si expresin1y expresin2son expresiones, entonces tambin lo son:

    expresin1+ expresin2expresin1* expresin2( expresin1)

    Las reglas 1 y 2 son reglas bsicas (no recursivas), en tanto que la regla 3 define expresiones en funcin deoperadores aplicados a otras expresiones.

    La divisin entre anlisis lxico y anlisis sintctico es algo arbitraria. Un factor para determinar la divisin es siuna construccin del lenguaje fuente es inherentemente recursiva o no. Las construcciones lxicas no requierenrecursin, mientras que las construcciones sintcticas suelen requerirla. No se requiere recursin para reconocerlos identificadores, que suelen ser cadenas de letras y dgitos que comienzan con una letra. Normalmente, sereconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carcterque no sea ni letra ni dgito, y agrupando despus todas las letras y dgitos encontrados hasta ese punto en uncomponente lxico llamado identificador. Por otra parte, esta clase de anlisis no es suficientemente poderosopara analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar de manera apropiada losparntesis de las expresiones, o las palabras begin y end en proposiciones sin imponer alguna clase de

    estructura jerrquica o de anidamiento a la entrada.

    Anlisis semntico

    La fase de anlisis semntico revisa el programa fuente para tratar de encontrar errores semnticos y rene lainformacin sobre los tipos para la fase posterior de generacin de cdigo. En ella se utiliza la estructuraerrquica determinada por la fase de anlisis sintctico para identificar los operadores y operandos deexpresiones y proposiciones.

    Un componente importante del anlisis semntico es la verificacin de tipos. Aqu, el compilador verifica si cadaoperador tiene operandos permitidos por la especificacin del lenguaje fuente. Por ejemplo, las definiciones demuchos lenguajes de programacin requieren que el compilador indique un error cada vez que se use un nmeroreal como ndice de una matriz. Sin embargo, la especificacin del lenguaje puede imponer restricciones a losoperandos, por ejemplo, cuando un operador aritmtico binario se aplica a un nmero entero y a un nmeroreal.2Revisa que los arreglos tengan definido el tamao correcto.

    Fase de sntesis

    Consiste en generar el cdigo objeto equivalente al programa fuente. Slo se genera cdigo objeto cuando el

    programa fuente est libre de errores de anlisis, lo cual no quiere decir que el programa se ejecutecorrectamente, ya que un programa puede tener errores de concepto o expresiones mal calculadas. Por logeneral el cdigo objeto es cdigo de mquina relocalizable o cdigo ensamblador. Las posiciones de memoria

    http://es.wikipedia.org/wiki/C%C3%B3digo_objetohttp://es.wikipedia.org/wiki/Matriz_(programaci%C3%B3n)http://es.wikipedia.org/wiki/N%C3%BAmero_realhttp://es.wikipedia.org/wiki/Identificadorhttp://es.wikipedia.org/wiki/Recursividad
  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    6/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    http://es.wikipedia.org/wiki/Compilador 6/10

    se seleccionan para cada una de las variables usadas por el programa. Despus, cada una de las instruccionesintermedias se traduce a una secuencia de instrucciones de mquina que ejecuta la misma tarea. Un aspectodecisivo es la asignacin de variables a registros.

    Generacin de cdigo intermedio

    Despus de los anlisis sintctico y semntico, algunos compiladores generan una representacin intermedia

    explcita del programa fuente. Se puede considerar esta representacin intermedia como un programa para unamquina abstracta. Esta representacin intermedia debe tener dos propiedades importantes; debe ser fcil deproducir y fcil de traducir al programa objeto.

    La representacin intermedia puede tener diversas formas. Existe una forma intermedia llamada cdigo de tresdirecciones que es como el lenguaje ensamblador de una mquina en la que cada posicin de memoria puedeactuar como un registro. El cdigo de tres direcciones consiste en una secuencia de instrucciones, cada una delas cuales tiene como mximo tres operandos. Esta representacin intermedia tiene varias propiedades:

    Primera.- Cada instruccin de tres direcciones tiene a lo sumo un operador, adems de la asignacin, por

    tanto, cuando se generan estas instrucciones, el traductor tiene que decidir el orden en que debenefectuarse las operaciones.Segunda.- El traductor debe generar un nombre temporal para guardar los valores calculados por cadainstruccin.Tercera.- Algunas instrucciones de tres direcciones tienen menos de tres operandos, por ejemplo, laasignacin.

    Optimizacin de cdigo

    La fase de optimizacin de cdigo consiste en mejorar el cdigo intermedio, de modo que resulte un cdigomquina ms rpido de ejecutar. Esta fase de la etapa de sntesis es posible sobre todo si el traductor es uncompilador (difcilmente un intrprete puede optimizar el cdigo objeto). Hay mucha variacin en la cantidad deoptimizacin de cdigo que ejecutan los distintos compiladores. En los que hacen mucha optimizacin, llamadoscompiladores optimizadores, una parte significativa del tiempo del compilador se ocupa en esta fase. Sinembargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecucin del programa objetosin retardar demasiado la compilacin.2

    Estructura de datos principales

    La interaccin entre los algoritmos utilizados por las fases del compilador y las estructuras de datos quesoportan estas fases es, naturalmente, muy fuerte. El escritor del compilador se esfuerza por implementar estosalgoritmos de una manera tan eficaz como sea posible, sin aumentar demasiado la complejidad. De maneraideal, un compilador debera poder compilar un programa en un tiempo proporcional al tamao del mismo.

    Componentes lxicos o tokens

    Cuando un analizador lxico rene los caracteres en un token, generalmente representa el token de manerasimblica, es decir, como un valor de un tipo de datos enumerado que representa el conjunto de tokens del

    lenguaje fuente. En ocasiones tambin es necesario mantener la cadena de caracteres misma u otra informacinderivada de ella, tal como el nombre asociado con un token identificador o el valor de un token de nmero.

    http://es.wikipedia.org/wiki/Cadena_de_caractereshttp://es.wikipedia.org/wiki/Tokenhttp://es.wikipedia.org/wiki/Algoritmohttp://es.wikipedia.org/wiki/Estructura_de_datoshttp://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)http://es.wikipedia.org/wiki/Registro_(hardware)http://es.wikipedia.org/wiki/Lenguaje_ensambladorhttp://es.wikipedia.org/wiki/C%C3%B3digo_de_tres_direccioneshttp://es.wikipedia.org/wiki/M%C3%A1quina_abstractahttp://es.wikipedia.org/wiki/Registro_(hardware)
  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    7/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    http://es.wikipedia.org/wiki/Compilador 7/10

    En la mayora de los lenguajes el analizador lxico slo necesita generar un token a la vez. En este caso sepuede utilizar una variable global simple para mantener la informacin del token. En otros casos (cuyo ejemploms notable es FORTRAN), puede ser necesario un arreglo (o vector) de tokens.

    rbol sintctico

    Si el analizador sintctico genera un rbol sintctico, por lo regular se construye como una estructura estndar

    basada en un puntero que se asigna de manera dinmica a medida que se efecta el anlisis sintctico. El rbolentero puede entonces conservarse como una variable simple que apunta al nodo raz. Cada nodo en laestructura es un registro cuyos campos representan la informacin recolectada tanto por el analizador sintcticocomo, posteriormente, por el analizador semntico. Por ejemplo, el tipo de datos de una expresin puedeconservarse como un campo en el nodo del rbol sintctico para la expresin.

    En ocasiones, para ahorrar espacio, estos campos se asignan de manera dinmica, o se almacenan en otrasestructuras de datos, tales como la tabla de smbolos, que permiten una asignacin y desasignacin selectivas.En realidad, cada nodo del rbol sintctico por s mismo puede requerir de atributos diferentes para seralmacenado, de acuerdo con la clase de estructura del lenguaje que represente. En este caso, cada nodo en el

    rbol sintctico puede estar representado por un registro variable, con cada clase de nodo conteniendosolamente la informacin necesaria para ese caso.

    Tabla de smbolos

    Esta estructura de datos mantiene la informacin asociada con los identificadores: funciones, variables,constantes y tipos de datos. La tabla de smbolos interacta con casi todas las fases del compilador: elanalizador lxico, el analizador sintctico o el analizador semntico pueden introducir identificadores dentro dela tabla; el analizador semntico agregar tipos de datos y otra informacin; y las fases de optimizacin ygeneracin de cdigo utilizarn la informacin proporcionada por la tabla de smbolos para efectuar selecciones

    apropiadas de cdigo objeto.

    Puesto que la tabla de smbolos tendr solicitudes de acceso con tanta frecuencia, las operaciones de insercin,eliminacin y acceso necesitan ser eficientes, preferiblemente operaciones de tiempo constante. Una estructurade datos estndar para este propsito es la tabla de dispersin o de clculo de direccin, aunque tambin sepueden utilizar diversas estructuras de rbol. En ocasiones se utilizan varias tablas y se mantienen en una lista opila.

    Tabla de literales

    La bsqueda y la insercin rpida son esenciales tambin para la tabla de literales, la cual almacena constantes ycadenas utilizadas en el programa. Sin embargo, una tabla de literales necesita impedir las eliminaciones porquesus datos se aplican globalmente al programa y una constante o cadena aparecer slo una vez en esta tabla. Latabla de literales es importante en la reduccin del tamao de un programa en la memoria al permitir lareutilizacin de constantes y cadenas. Tambin es necesaria para que el generador de cdigo construyadirecciones simblicas para las literales y para introducir definiciones de datos en el archivo de cdigo objeto.

    Cdigo intermedio

    De acuerdo con la clase de cdigo intermedio (por ejemplo, cdigo de tres direcciones o cdigo P) y de lasclases de optimizaciones realizadas, este cdigo puede conservarse como un arreglo de cadenas de texto, unarchivo de texto temporal o bien una lista de estructuras ligadas. En los compiladores que realizanoptimizaciones complejas debe ponerse particular atencin a la seleccin de representaciones que permitan unafcil reorganizacin.

    http://es.wikipedia.org/wiki/Generador_de_c%C3%B3digohttp://es.wikipedia.org/wiki/Pila_(estructura_de_datos)http://es.wikipedia.org/wiki/Lista_(estructura_de_datos)http://es.wikipedia.org/wiki/Tipo_de_datohttp://es.wikipedia.org/wiki/Constante_(programaci%C3%B3n)http://es.wikipedia.org/wiki/Variable_(programaci%C3%B3n)http://es.wikipedia.org/wiki/Funci%C3%B3n_(programaci%C3%B3n)http://es.wikipedia.org/wiki/Nodo_(inform%C3%A1tica)http://es.wikipedia.org/wiki/Puntero_(programaci%C3%B3n)http://es.wikipedia.org/wiki/Vector_(programaci%C3%B3n)http://es.wikipedia.org/wiki/FORTRAN
  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    8/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    http://es.wikipedia.org/wiki/Compilador 8/10

    Generacin de cdigo intermedio

    Despus de los anlisis sintctico y semntico, algunos compiladores generan una representacin intermediaexplcita del programa fuente. Se puede considerar esta representacin intermedia como un programa para unamquina abstracta. Esta representacin intermedia debe tener dos propiedades importantes; debe ser fcil deproducir y fcil de traducir al programa objeto.

    La representacin intermedia puede tener diversas formas. Existe una forma intermedia llamada cdigo de tresdirecciones, que es como el lenguaje ensamblador para una mquina en la que cada posicin de memoriapuede actuar como un registro. El cdigo de tres direcciones consiste en una secuencia de instrucciones, cadauna de las cuales tiene como mximo tres operandos. El programa fuente de (1) puede aparecer en cdigo detres direcciones como

    temp1 := entreal(60)

    temp2 := id3 * temp1 ===> (2)

    temp3 := id2 + temp2

    id1 := temp3

    Esta representacin intermedia tiene varias propiedades. Primera, cada instruccin de tres direcciones tiene a losumo un operador, adems de la asignacin. Por tanto, cuando se generan esas instrucciones el compiladortiene que decidir el orden en que deben efectuarse, las operaciones; la multiplicacin precede a la adicin alprograma fuente de. Segunda, el compilador debe generar un nombre temporal para guardar los valorescalculados por cada instruccin. Tercera, algunas instrucciones de tres direcciones tienen menos de tresoperadores, por ejemplo la primera y la ltima instrucciones de asignacin.

    Optimizacin de Cdigo

    La fase de optimizacin de cdigo trata de mejorar el cdigo intermedio de modo que resulte un cdigo demquina ms rpido de ejecutar. Algunas optimizaciones son triviales. Por ejemplo, un algoritmo natural generael cdigo intermedio (2) utilizando una instruccin para cada operador de la representacin del rbol despusdel anlisis semntico, aunque hay una forma mejor de realizar los mismos clculos usando las dos instrucciones

    temp1 := id3 * 60.0 ===> (3)

    id1 := id2 + temp1

    Este sencillo algoritmo no tiene nada de malo, puesto que el problema se puede solucionar en la fase deoptimizacin de cdigo. Esto es, el compilador puede deducir que la conversin de 60 de entero a real se

    puede hacer de una vez por todas en el momento de la compilacin, de modo que la operacin "entreal( )" sepuede eliminar. Adems, temp3 se usa slo una vez, para transmitir su valor a id1. Entonces resulta segurosustituir a id1 por temp3, a partir de lo cual la ltima proposicin de (2) no se necesita y se obtiene el cdigo de(3).

    Hay muchas variaciones en la cantidad de optimizacin de cdigo que ejecutan los distintos compiladores. En loque hacen mucha optimizacin llamados compiladores optimizadores, una parte significativa del tiempo delcompilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente eltiempo de ejecucin del programa objeto sin retardar demasiado la compilacin.

    Archivos temporales

  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    9/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    http://es.wikipedia.org/wiki/Compilador 9/10

    Al principiolas computadoras no tenan la suficiente memoria para guardar un programa completo durante lacompilacin.Este problema se resolvi mediante el uso de archivos temporales para mantener los productos delos pasos intermedios durante la traduccin o bien al compilar al vuelo, es decir, manteniendo slo lainformacinsuficiente de las partes anteriores del programa fuente que permita proceder a la traduccin.

    Las limitaciones de memoria son ahora un problema mucho menor, y es posible requerir que una unidad decompilacin entera se mantenga en memoria, en especial si se dispone de la compilacin por separado en ellenguaje. Con todo, los compiladores ocasionalmente encuentran til generar archivos intermedios durantealguna de las etapas del procesamiento. Algo tpico de stos es la necesidad de direcciones de correccinhacia atrsdurante la generacin de cdigo.

    Vasetambin

    Lenguaje de programacinProceso de traduccin de programasLenguaje ensambladorEnsambladorDesensambladorDecompiladorIntrpreteDepuradorLenguaje de alto nivelLenguaje de bajo nivelLenguaje de mquinaHistoria de la construccin de los compiladores

    Libros Principles of Compiler Design, Compilers: Principles, Techniques, and Tools

    Referencias

    1. Laborda, Javier; Josep Galimany, Rosa Mara Pena, Antoni Gual (1985). Software.Biblioteca prctica dela computacin. Barcelona: Ediciones Ocano-xito, S.A.

    2. abcAho, Alfred V.; Ravi Sethi, Jeffrey D. Ullman (2008). Introduccin a la Compilacin. Compiladores:Principios, tcnicas y prcticas. Mxico: Addison Wesley.

    EnlacesexternosWikcionario tiene definiciones y otra informacin sobre compilador.

    Let's Build a Compiler (http://compilers.iecc.com/crenshaw/). Tutorial de Jack W. Crenshaw sobre cmohacerun compiladorJava a tope: Traductores y Compiladores con Lex/Yacc, JFlex/Cup y JavaCC.(http://www.lcc.uma.es/~galvez/Compiladores.html) Libro bsico sobre compiladores

    Obtenido dehttp://es.wikipedia.org/w/index.php?title=Compilador&oldid=77377395

    Categoras: Compiladores Programas de cdigo objeto

    Estapgina fue modificada por ltima vez el 5 oct 2014 a las 23:31.

    http://es.wikipedia.org/wiki/Especial:Categor%C3%ADashttp://es.wikipedia.org/w/index.php?title=Compilador&oldid=77377395http://www.lcc.uma.es/~galvez/Compiladores.htmlhttp://es.wikipedia.org/w/index.php?title=Jack_W._Crenshaw&action=edit&redlink=1http://compilers.iecc.com/crenshaw/http://es.wiktionary.org/wiki/compiladorhttp://es.wikipedia.org/wiki/Wikcionariohttp://es.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Toolshttp://es.wikipedia.org/wiki/Principles_of_Compiler_Designhttp://es.wikipedia.org/wiki/Historia_de_la_construcci%C3%B3n_de_los_compiladoreshttp://es.wikipedia.org/wiki/Lenguaje_de_m%C3%A1quinahttp://es.wikipedia.org/wiki/Lenguaje_de_bajo_nivelhttp://es.wikipedia.org/wiki/Lenguaje_de_alto_nivelhttp://es.wikipedia.org/wiki/Depuradorhttp://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)http://es.wikipedia.org/wiki/Decompiladorhttp://es.wikipedia.org/wiki/Desensambladorhttp://es.wikipedia.org/wiki/Ensambladorhttp://es.wikipedia.org/wiki/Lenguaje_ensambladorhttp://es.wikipedia.org/wiki/Proceso_de_traducci%C3%B3n_de_programashttp://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttp://es.wikipedia.org/wiki/Categor%C3%ADa:Programas_de_c%C3%B3digo_objetohttp://es.wikipedia.org/wiki/Categor%C3%ADa:Compiladores
  • 7/26/2019 Compilador - Wikipedia, La Enciclopedia Libre

    10/10

    31/10/2014 Compilador - Wikipedia, la enciclopedia libre

    h // iki di / iki/C il d 10/10

    El texto est disponible bajo la Licencia Creative Commons Atribucin Compartir Igual 3.0; podran seraplicables clusulas adicionales. Lanse los trminos de uso para ms informacin.Wikipedia es una marca registrada de la Fundacin Wikimedia, Inc., una organizacin sin nimo delucro.

    http://www.wikimediafoundation.org/http://wikimediafoundation.org/wiki/T%C3%A9rminos_de_Usohttp://es.wikipedia.org/wiki/Wikipedia:Texto_de_la_Licencia_Creative_Commons_Atribuci%C3%B3n-CompartirIgual_3.0_Unported