jueves, 19 de febrero de 2009

Analisis Lexico

Analizador léxico

La palabra Léxico viene del griego lexis, que significa ``palabra''. El analisis Lexico constituye la primera fase, donde se lee el programa fuente de izquierda a derecha, los cuales sirven para una posterior etapa del proceso de traduccion. Ademas, un analizador léxico también es la parte del traductor que maneja ta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera eficiente.

Token

También llamado componente léxico: es una cadena de caracteres que tiene un significado coherente en cierto lenguaje de programación. Ejemplos de tokens, podrían ser palabras clave como: if, while, int, identificadores, números, signos, o un operador de varios caracteres, (por ejemplo, :=).

Un token hace referencia a las unidades mas simples que tiene significado. Habitualmente un token o lexema queda descrito por una expresión regular.En la mayoría de los lenguajes el analizador léxico sólo necesita generar un token a la vez.

Lexema: cadena de caracteres que concuerda con un patron que describe un componente lexico. Un componente lexico puede tener uno o infinitos lexemas. Por ejemplo: palabras reservadas tienen un unico lexema. Los numeros y los identifcadores tienen infinitos lexemas.

Patron: es una regla que genera la secuencia de caracteres que puede representar a un determinado componente lexico (una ex-presion regular).







martes, 17 de febrero de 2009

¿ Qué es un compilador?

Los Compiladores son programas o herramientas encargadas de compilar. Un compilador toma un texto (codigo fuente) escrito en un lenguaje de alto nivel y lo traduce a un lenguaje comprensible por las computadoras (codigo objeto). Básicamente, existen dos grandes formas de ejecutar programas: programas compilados (previamente pasados por un compilador) y programas interpretados (necesitan pasar por un intérprete para ejecutarse en tiempo real).


Características de un compilador:

Generalmente un compilador se divide en dos partes:

* Front End: 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. Parte que suele ser independiente de la plataforma o sistema operativo para el que funcionará.

* Back End: parte en donde se genera el código máquina exclusivo para una plataforma a partir de lo analizado en el front end.Por lo general el resultado del back end no puede ser ejecutado directamente, se necesita pasar por un proceso de enlazado (linker).

Existen varios tipos de compiladores:

Compiladores cruzados, Compiladores optimizadores, Compiladores de una sola pasada, Compiladores de varias pasadas, Compiladores JIT (Just In Time).

Intérpretes vs compiladores:

Cualquier lenguaje puede ser ejecutado tanto vía intérprete o vía compilador, pero algunos lenguajes suelen asociarse más a una vía que a la otra, y por esto son llamados "lenguajes interpretados" o "lenguajes compilados" respectivamente.También puede darse que un programa contenga partes que son implementadas vía intérprete y otras vía compilador.También existen intérpretes que incluyen cierta "compilación" en el medio. Son aquellos que compilan a un código intermedio llamado bytecode, que es más eficiente de ejecutar que hacerlo directamente desde el código fuente.En general, la principal desventaja de los intérpretes, es que cuando un programa es interpretado, suele ejecutarse más lento que si el mismo programa estuviese compilado. Esto se debe a que el intérprete debe analizar cada sentencia en el programa en cada ejecución (un análisis en tiempo real). También el acceso a variables es más lento en un intérprete, porque mapear los identificadores para almacenar las localizaciones debe hacerse repetidas veces en tiempo real.


Las fases de un compilador son:

Análisis Léxico: Esta fase se encarga de verificar si todas las cadenas pertenecen o no al lenguaje. Es decir realiza un análisis símbolo por símbolo indicando el token por cada uno de los elementos reconocidos o el error en caso de no reconocer. Este análisis no logra detectar muchos errores por su característica.

Análisis Sintáctico: En esta fase se analiza la estructura de las expresiones en base a gramáticas. Aqui ya se puede determinar si una extructura por ejemplo una expresión matemática esta mal formada. El análisis que se realiza es jerarquico es decir en base a àrboles de derivación que se obtienen de las mismas gramáticas.

Análisis Semántico: Este análisis es más dificil de formalizar, determina el tipo de los resultados intermedios, comprobar que los argumentos que tienen un operador pertenecen al conjunto de operadores posible, y si son compatibles entre sì.

Generación de Código Intemedio: El código intermedio es una representación en base a elementos de 3 y 4 direcciones. Lo que nos permite llegar a la fase de optimizaciòn de código.
Optimización de Código: Consiste en realizar uuna mejora en el código intermedio, para reducir el número de líneas y hacer que la ejecución sea más rápida.

Generación de Codigo: Llegamos a la generación de código ensamblador o código máquina del procesador que nos interese.