COMPILADORES
Un compilador es un programa informático que traduce un programa que ha sido escrito en un lenguaje de programación a un lenguaje común, usualmente lenguaje de máquina, aunque también puede ser traducido a un código intermedio (bytecode) o a texto. Este proceso de traducción se conoce como compilación.
Véase COMO APLICACIÓN INFORMÁTICA. En informática, una aplicación es un programa informático diseñado como herramienta para permitir a un usuario realizar uno o diversos tipos de tareas. Esto lo diferencia principalmente de otros tipos de programas, como los sistemas operativos (que hacen funcionar la computadora), las utilidades (que realizan tareas de mantenimiento o de uso general), y las herramientas de desarrollo de software (para crear programas informáticos).
" La programación de computadoras es el proceso iterativo de escribir o editar código fuente. Dicha edición implica probar, analizar y perfeccionar, y, a veces, coordinar con otros programadores, en el caso de un programa desarrollado en conjunto. Una persona que practica esta técnica se le conoce como programador de computadoras, desarrollador de software, o codificador. El proceso, a veces a largo plazo, de programación de computadoras normalmente se lo conoce como desarrollo de software. El término ingeniería de software se está convirtiendo en muy popular, ya que esta actividad es vista como una disciplina de ingeniería"
Básicamente para la compilación de los sistemas fuentes se establecen los que son unos parámetros establecido por medio de unas fase que por lo general se agrupan en actividades compartidas de dos maneras:
- Analisis . Se trata de la comprobación de la corrección del programa fuente, e incluye las fases correspondientes al Análisis léxico (que consiste en la descomposición del programa fuente en componentes léxicos), análisis sintáctico (agrupación de los componentes léxicos en frases gramaticales ) y análisis semántico (comprobación de la validez semántica de las sentencias aceptadas en la fase de análisis sintáctico).
- Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele estar formado por una o varias combinaciones de fases de generación de código (normalmente se trata de código intermedio o de código objeto) y de optimización de código (en las que se busca obtener un código lo más eficiente posible).
- Front-end: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar, y está compuesta por las fases comprendidas entre el análisis Léxico y la generación de código intermedio.
Tipos de compiladores
Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscriban a varias categorías:- Compiladores cruzados: generan código para un sistema distinto del que están funcionando.
- Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original.
- Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente.
- Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina.
- Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.
Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador. Una vez que se dispone de un compilador, se pueden escribir nuevas versiones del compilador (u otros compiladores distintos) en el lenguaje que compila ese compilador.
Actualmente existen herramientas que facilitan la tarea de escribir compiladores ó intérpretes informáticos. Estas herramientas permiten generar el esqueleto del analizador sintáctico a partir de una definición formal del lenguaje de partida, especificada normalmente mediante una gramática formal y barata, dejando únicamente al programador del compilador la tarea de programar las acciones semánticas asociadas.
Etapas del proceso
El proceso de traducción se compone internamente de varias etapas o
fases, que realizan distintas operaciones lógicas. Es útil pensar en
estas fases como en piezas separadas dentro del traductor, y pueden en
realidad escribirse como operaciones codificadas separadamente aunque en
la práctica a menudo se integren juntas.
Fase de análisis
Análisis léxico
El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens),
que son secuencias de caracteres que tienen un significado. Además,
todos los espacios en blanco, líneas en blanco, comentarios y demás
información innecesaria se elimina del programa fuente. También se
comprueba que los símbolos del lenguaje (palabras clave, operadores, etc.) se han escrito correctamente.
Como la tarea que realiza el analizador léxico es un caso especial de
coincidencia de patrones, se necesitan los métodos de especificación y
reconocimiento de patrones, se usan principalmente los autómatas finitos que acepten expresiones regulares.
Sin embargo, un analizador léxico también es la parte del traductor que
maneja la entrada del código fuente, y puesto que esta entrada a menudo
involucra un importante gasto de tiempo, el analizador léxico debe
funcionar de manera tan eficiente como sea posible.
Análisis sintáctico
En esta fase los caracteres o componentes léxicos se agrupan
jerárquicamente en frases gramaticales que el compilador utiliza para
sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es
sintácticamente correcto (obedece a la gramática del lenguaje). Por lo
general, las frases gramaticales del programa fuente se representan
mediante un árbol de análisis sintáctico.
La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definición de expresiones:
- Cualquier identificador es una expresión.
- Cualquier número es una expresión.
- Si expresión1 y expresión2 son expresiones, entonces también lo son:
- expresión1 + expresión2
- expresión1 * expresión2
- ( expresión1 )
Las reglas 1 y 2 son reglas básicas (no recursivas), en tanto que la
regla 3 define expresiones en función de operadores aplicados a otras
expresiones.
Análisis semántico
La fase de análisis semántico revisa el programa fuente para tratar
de encontrar errores semánticos y reúne la información sobre los tipos
para la fase posterior de generación de código. En ella se utiliza la
estructura jerárquica determinada por la fase de análisis sintáctico
para identificar los operadores y operandos de expresiones y
proposiciones.
Fase de síntesis
Consiste en generar el código objeto
equivalente al programa fuente. Solo se genera código objeto cuando el
programa fuente está libre de errores de análisis, lo cual no quiere
decir que el programa se ejecute correctamente, ya que un programa puede
tener errores de concepto o expresiones mal calculadas. Por lo general
el código objeto es código de máquina relocalizable o código
ensamblador. Las posiciones de memoria se seleccionan para cada una de
las variables usadas por el programa.
Generación de código intermedio
Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto.Optimización de código
La fase de optimización de código consiste en mejorar el código
intermedio, de modo que resulte un código máquina más rápido de
ejecutar. Esta fase de la etapa de síntesis es posible sobre todo si el
traductor es un compilador (difícilmente un intérprete puede optimizar el código objeto).
Estructura de datos principales
La interacción entre los algoritmos utilizados por las fases del compilador y las estructuras de datos que soportan estas fases es, naturalmente, muy fuerte. El escritor del compilador se esfuerza por implementar estos algoritmos
de una manera tan eficaz como sea posible, sin aumentar demasiado la
complejidad. De manera ideal, un compilador debería poder compilar un
programa en un tiempo proporcional al tamaño del mismo.
Componentes léxicos o tokens
Cuando un analizador léxico reúne los caracteres en un token,
generalmente representa el token de manera simbólica, es decir, como un
valor de un tipo de datos enumerado que representa el conjunto de
tokens del lenguaje fuente. En ocasiones también es necesario mantener
la cadena de caracteres
misma u otra información derivada de ella, tal como el nombre asociado
con un token identificador o el valor de un token de número.
Árbol sintáctico
Si el analizador sintáctico genera un árbol sintáctico, por lo regular se construye como una estructura estándar basada en un puntero que se asigna de manera dinámica a medida que se efectúa el análisis sintáctico. El árbol entero puede entonces conservarse como una variable simple que apunta al nodo raíz. Cada nodo en la estructura es un registro cuyos campos representan la información recolectada tanto por el analizador sintáctico como, posteriormente, por el analizador semántico. Por ejemplo, el tipo de datos de una expresión puede conservarse como un campo en el nodo del árbol sintáctico para la expresión.Tabla de símbolos
Esta estructura de datos mantiene la información asociada con los identificadores: funciones, variables, constantes y tipos de datos.
La tabla de símbolos interactúa con casi todas las fases del
compilador: el analizador léxico, el analizador sintáctico o el
analizador semántico pueden introducir identificadores dentro de la
tabla; el analizador semántico agregará tipos de datos y otra
información; y las fases de optimización y generación de código
utilizarán la información proporcionada por la tabla de símbolos para
efectuar selecciones apropiadas de código objeto.
Tabla de literales
La búsqueda y la inserción rápida son esenciales también para la
tabla de literales, la cual almacena constantes y cadenas utilizadas en
el programa. Sin embargo, una tabla de literales necesita impedir las
eliminaciones porque sus datos se aplican globalmente al programa y una
constante o cadena aparecerá solo una vez en esta tabla. La tabla de
literales es importante en la reducción del tamaño de un programa en la
memoria al permitir la reutilización de constantes y cadenas.
- Optimización de Código
La fase de optimización de código trata de mejorar el código
intermedio de modo que resulte un código de máquina más rápido de
ejecutar. Algunas optimizaciones son triviales. Por ejemplo, un
algoritmo natural genera el código intermedio (2) utilizando una
instrucción para cada operador de la representación del árbol después
del análisis semántico, aunque hay una forma mejor de realizar los
mismos cálculos usando las dos instrucciones
Código intermedio
De acuerdo con la clase de código intermedio (por ejemplo, código de
tres direcciones o código P) y de las clases de optimizaciones
realizadas, este código puede conservarse como un arreglo de cadenas de
texto, un archivo de texto temporal o bien una lista de estructuras
ligadas.
Referencias:
https://es.wikipedia.org/wiki/Programa_inform%C3%A1ticohttps://es.wikipedia.org/wiki/Herramienta_de_desarrollo_de_software
Página principal
Comentarios
Publicar un comentario