Anda di halaman 1dari 7

Instituto Tecnolgico de Chihuahua II

Ingeniera en Sistemas Computacionales

LENGUAJES Y AUTOMATAS II

Compilador de java

Java funciona de la siguiente manera: El compilador de Java deja el programa en un


Pseudo-cdigo (no es cdigo maquinal) y luego el intrprete de Java ejecuta el programa
(lo que se conoce como el "Java Virtual Machine"). Por eso Java es multiplataforma,
existe un intrprete para cada mquina diferente. Nota: El cdigo maquinal es el cdigo
binario que la computadora entiende y puede ejecutar.
Para entender bien cmo funciona un applet de Java vean el siguiente ejemplo:
Existe un cdigo de Java en un servidor de Web. (Los cdigos de Java se caracterizan
por tener la extensin*.class).
Una persona en Internet, con un browser compatible con Java, realiza una conexin al
servidor.
El servidor enva el documento HTML y el cdigo en Java (*.class).
En la computadora del usuario remoto llegan ambos, y la Mquina Virtual de Java, que
est en el browser, transforma el cdigo Java en un cdigo que entienda la mquina local
y se ejecuta el programa dentro de la pgina de Web. Si el usuario realiza otra conexin a
otro URL o se sale del browser, el programa se deja de ejecutar y en la computadora no
queda rastro de l. Est compuesto por:

ANALIZADOR LEXICO
Esta fase del compilador es la nica que est en contacto con el programa fuente. Su
funcin es leer las instrucciones del programa y generar una serie de elementos bsicos
(componentes lxicos) utilizados para su construccin. Esta fase se encarga de verificar si
todas las cadenas pertenecen o no al lenguaje. Es decir realiza un anlisis smbolo por
smbolo indicando el token por cada uno de los elementos reconocidos o el error en caso de
no reconocer. Este anlisis no logra detectar muchos errores por su caracterstica.
Para el analizador lxico, la instruccin leda es una simple cadena de caracteres sin una
estructura en particular. Mediante el uso de tcnicas adecuadas descompondr esta
cadena en una serie de elementos fundamentales del lenguaje utilizado para su escritura.
Estos elementos bsicos, en el contexto de los lenguajes de programacin, sern
nombres de variables, palabras reservadas del lenguaje (while, for, switch, etc.),
constantes literales, diversos operadores aritmticos, relacionales y lgicos, etc.
El analizador lxico trabaja a solicitud del analizador sintctico. Este ltimo se encarga de
verificar que las diferentes instrucciones estn bien escritas verificando un conjunto de
reglas de escrituras dictadas por una gramtica.
Estas reglas se enuncian de manera general haciendo uso de diferentes componentes
elementales conocidos como componentes lxicos. Por ejemplo, una regla de escritura

sera algo similar a: exp-aritm := variable exp-aritm op-aritm exp-aritm const-numrica


que se lee una expresin aritmtica es una variable o una constante numrica o una
expresin aritmtica seguida por un operador aritmtico y otra expresin aritmtica.
Independientemente de la complejidad de la regla anterior, ntese como se hace alusin a
elementos como variable, const-numrica, etc. y no a cosas como x, suma, 34, etc.
Cuando el analizador sintctico encuentra el elemento denominado variable, llamar al
analizador lxico para comprobar que efectivamente el programador escribi una cadena
que se identifique como ejemplo de variable. El analizador lxico realiza su trabajo
procesando la cadena leda (cadena de entrada) de izquierda a derecha y carcter por
carcter. Cuando anuncie un reconocimiento dejar un indicador en la cadena de entrada
para reiniciar el proceso cuando sea solicitado de nuevo por el analizador sintctico. El
analizador lxico, al estar en contacto con la cadena de entrada puede realizar algunas
tareas adicionales como: Compactar la cadena eliminando espacios, tabuladores, etc.
Ignorar los comentarios. Expandir macros. Estas funciones pudieran requerir que el
analizador lxico procese dos veces la cadena de entrada. En una primera pasada se
pueden ignorar espacios y expandir macros, y en la segunda realizar el trabajo de
reconocimiento de los componentes lxicos. Otra funcin importante del analizador lxico
est relacionada con los mensajes de error que generan tanto el analizador sintctico
como el semntico. El analizador lxico conoce cuantas lneas y cuantos caracteres se
han procesado. Por lo tanto, un mensaje de error sintctico puede sealar la lnea y la
posicin dentro de la lnea donde se detect el error. Son pocos los errores que se
pueden detectar durante el anlisis lxico dado que tiene una visin muy restringida del
lenguaje que se compila.

ANALIZADOR SINTACTICO
El anlisis sintctico convierte el texto de entrada en otras estructuras (comnmente rboles),
que son ms tiles para el posterior anlisis y capturan la jerarqua implcita de la entrada.
Un analizador lxico crea tokens de una secuencia de caracteres de entrada y son
estos tokens los que son procesados por el analizador sintctico para construir la estructura
de datos, por ejemplo un rbol de anlisis o rboles de sintaxis abstracta.
El anlisis sintctico tambin es un estado inicial del anlisis de frases de lenguaje natural. Es
usado para generar diagramas de lenguajes que usan flexin gramatical, como los idiomas
romances o el latn. Los lenguajes habitualmente reconocidos por los analizadores sintcticos
son los lenguajes libres de contexto. Cabe notar que existe una justificacin formal que
establece que los lenguajes libres de contexto son aquellos reconocibles por un autmata de
pila, de modo que todo analizador sintctico que reconozca un lenguaje libre de contexto es
equivalente en capacidad computacional a un autmata de pila.

Los analizadores sintcticos fueron extensivamente estudiados durante los aos 70 del siglo
XX, detectndose numerosos patrones de funcionamiento en ellos, cosa que permiti la
creacin de programas generadores de analizadores sintticos a partir de
una especificacin de la sintaxis del lenguaje en forma Backus-Naur.

El trabajo del analizador sobre una cadena de gramtica particular.


El anlisis consiste de:
* Una bfer de entrada, una cadena de gramtica
* Una pila sobre la cual se almacenan los smbolos terminales y no-terminales de la
gramtica an sin analizar
* Una tabla de anlisis
Proceso de anlisis sintctico LL.
Una tcnica para traducir gramticas independientes del contexto a autmatas de pila es
seguir el proceso de construccin que produce un autmata de pila que analiza su cadena
de entrada marcando antes el fondo de la pila e insertando en la pila el smbolo inicial de
la gramtica. Luego se aplica:
1. Si la cima de la pila contiene un no terminal de la gramtica se reemplaza de acuerdo
con una de las reglas de reescritura de la gramtica.
2. Si la cima de la pila contiene un terminal, se elimina de la pila si es el que se lee en la
entrada. Si no se declara cadena ilegal.
3. Si aparece la marca de fondo de pila, se elimina y se acepta la porcin de la cadena de
entrada procesada hasta el momento.
Este proceso analiza la sintaxis de la cadena de entrada produciendo una derivacin por
la izquierda, conforma lee de izquierda a derecha. Por lo que acta como un programa
obtenido de la traduccin directa del autmata. Los analizadores sintcticos desarrollados
de esta manera se conocen como analizadores sintcticos LL.
La primera L denota que lee su entrada de izquierda a derecha; la segunda indica que el
objetivo del analizador sintctico es producir una derivacin por la izquierda.
Estos analizadores tienen el problema del no determinismo cuando tienen que elegir entre
dos posibles formas de reescribir el mismo no terminal y cuentan slo con una
informacin. Estas opciones se dan en las gramticas que deben generar lenguajes que
contienen ms de una cadena (una gramtica independiente del contexto que slo ofrece
una manera de reescribir un no terminal slo puede generar una cadena). Por ello la
actividad bsica de los analizadores sintcticos LL es predecir cul de las distintas reglas
de escritura se debe usar para procesar los smbolos de entrada restantes, por ello, a
estos analizadores se les llama analizadores sintcticos predictivos.
Aplicando el principio de preanlisis, se pueden resolver muchos de los problemas que se
presentan en los analizadores sintcticos predictivos. Existe una jerarqua para los
analizadores sintcticos LL cuya caracterstica distintiva es el nmero de smbolos de
entrada que comprende su sistema de preanlisis. Estos se llaman analizadores
sintcticos LL(k), donde k es un entero que indica el nmero de smbolos pre analizados.
ANALIZADOR SEMANTICO

Verifica si tiene sentido el programa fuente, es en esta fase en donde se hace la


verificacin de tipos, algunos analizadores semnticos convierten el dato de menor
precisin al de mayor precisin con el que se est realizando alguna operacin, otros
marcan conflicto de tipos. Pero todos deben marcar error si se utiliza un flotante como
exponente de un arreglo.
Todo lenguaje de programacin tiene reglas que describen la estructura sintctica de
programas bien formados. En Pascal, por ejemplo, un programa se compone de bloques,
un bloque de proposiciones, una proposicin de expresiones, una expresin de
componentes lxicos, y as sucesivamente. Se puede describir la sintaxis de las
construcciones de los lenguajes de programacin por medio de gramticas de contexto
libre o notacin BNF (Backus-Naur Form).
Las gramticas ofrecen ventajas significativas a los diseadores de lenguajes y a los
desarrolladores de compiladores.
Las gramticas son especificaciones sintcticas y precisas de lenguajes de programacin.
A partir de una gramtica se puede generar automticamente un analizador sintctico.
El proceso de construccin puede llevar a descubrir ambigedades.
Una gramtica proporciona una estructura a un lenguaje de programacin, siendo ms
fcil generar cdigo y detectar errores.
Es ms fcil ampliar/modificar el lenguaje si est descrito con una gramtica.
La mayor parte de este tema est dedicada a los mtodos de anlisis sintctico de uso
tpico en compiladores. Primero se introducen los conceptos bsicos, despus las
tcnicas adecuadas para la aplicacin manual. Adems como los programas pueden
contener errores sintcticos, los mtodos de anlisis sintctico se pueden ampliar para
que se recuperen de los errores sintcticos ms frecuentes.

GENERADOR DE CODIGO INTERMEDIO


El generador de cdigo intermedio transforma la salida del anlisis semntico, en
una representacin cercana a un lenguaje intermedio cercano al cdigo objeto.
Esta representacin intermedia debe tener dos propiedades importantes;
debe ser fcil de producir y fcil de traducir al programa objeto. Existen varias formas de
representar el cdigo intermedio, notacin polaca y cdigo p.

Cdigo de tres direcciones.


El cdigo de tres direcciones consiste en una secuencia de instrucciones, cada
una de las cuales tiene como mximo tres operandos
Es un tipo de cdigo que lo podemos representar en su forma general como la
siguiente preposicin:
x: =y op z
Donde x, y y z pueden ser nombres, constantes o variables temporales y

op representa cualquier tipo de operador.


Por lo general se siguen tres reglas bsicas para este mtodo, las cuales son:
Primera.- Cada instruccin de tres direcciones contiene por lo menos un operador,
adems de la asignacin, por tanto, cuando se generan estas instrucciones,
el traductor tiene que decidir el orden en que deben efectuarse las operaciones.
Segunda.- El traductor debe generar un nombre temporal para guardar los valores
calculados por cada instruccin.
Tercera.- Algunas instrucciones de "tres direcciones" tienen menos de tres
operandos, por ejemplo, la asignacin.
Arboles sintcticas
Construccin de rboles sintcticos: El uso de rboles de anlisis sintctico como
representacin intermedia permite que la traduccin se separe del anlisis sintctico. Las
rutinas de traduccin invocadas durante el anlisis sintctico deben activarse con dos
clases de limitaciones. La primera, una gramtica que resulte adecuada para el anlisis
sintctico puede no reflejar la estructura jerrquica natural de las construcciones del
lenguaje. La segunda, el mtodo de anlisis sintctico restringe el orden en que se
consideran los nodos de un rbol de anlisis sintctico. Pues este orden puede no
coincidir con el orden en que se va disponiendo de la informacin sobre una construccin.

OPTIMIZADOR DE CODIGO
En esta etapa como su nombre lo dice es de hacer ms pequeo el cdigo y reducir el
uso de memoria de la CPU a continuacin unos consejos para optimizar el cdigo.
1. Variables: No declares variables que no se vayan a usar ya que ocupan memoria.
Utiliza constantes para aquellos valores que sern fijos a lo largo de la ejecucin.
A la hora de declarar variables siempre es preferible usar variables estticas.
Intenta evitar el uso de variables globales.
2. Unset: Aunque PHP dispone de un Garbage Collector (liberador de memoria) no
est de ms usar la funcin unset para eliminar variables y aumentar la memoria
disponible, sobre todo cuando se usan arrays o variables extensas en servidores
limitados.
3. Comparaciones: Los switch / case usan ms ciclos de procesador que los if /
else, por lo tanto usa estos ltimos siempre que puedas.
4. Bucles: Un bucle for es ms lento que un while, que a su vez es ms lento que
un do..while. Debes evitar que la condicin de parada de tus bucles sea una
funcin, mejor una variable donde se guarde el valor de la funcin previamente.
Revisa tus bucles y elimina aquellos que realmente no son necesarios.
5. Inclusiones: Aunque las funciones include_once() y require_once() son muy
tiles para evitar cargar el mismo script repetidas veces, su costo es muy alto.
Revisa tu cdigo e intenta usar include() y require() en su lugar.
6. Utiliza HTML antes que PHP: Cuando tengas que escribir cdigo HTML evita
usar funciones PHP, como echo o print, salvo en casos en que sea indispensable.

7. Comillas en PHP: Usa siempre que puedas las comillas simples ya que a
diferencia de las dobles, que interpolan los valores de las variables, estas solo
interpretan literales, con la consiguiente mejora de procesamiento. Adems debes
evitar el uso del smbolo del dolar sin escapar (\$) entre comillas dobles ya que
ralentiza el cdigo enormemente.
8. Comprobar existencia de variables: Cuando se necesite verificar la existencia de
variables usaremos isset() antes que empty() o is_array(), ya que la primera es la
ms eficiente.
9. Operador ===: Cuando compares dos variables del mismo tipo intenta evitar el
operador ===, ya que a diferencia de == que solo compara valores, este adems
compara el tipo de variable.
10. Reporte de errores: Para usar el mximo nivel de error en tu log del debug usa
E_STRICT como nivel de error.
11. Memoria y velocidad: Para comprobar la velocidad y la memoria que consume
tu cdigo te sern tiles las funciones memory_get_usage() y microtime().
GENERADOR DE CODIGO
Es una de las fases mediante el cual el compilador convierte el programa sintcticamente
correcto en una serie de instrucciones a ser interpretadas por una mquina. La entrada en
esta fase viene representada, tpicamente, por un rbol Sintctico, un rbol de Sintaxis
Abstracta, o una Representacin Intermedia.
BIBLIOGRAFIA

Aho (2006), et. al. Compiladores: Principios y Tcnicas. Segunda Edicin.


Lenguajes y autmatas
dean kelley
Compiladores principios ,tecnicas y herramientas
Alfred V. Aho, ravi sethi, jeffrey D. Ullman

Anda mungkin juga menyukai