viernes, 27 de abril de 2007

Compilador en Java

Bueno, mis estimados. Veo los problemas que algunas personas enfrentan a la hora que les dejan de tarea crear un compilador. La Wikipedia ofrece un paro suficiente en muchos temas, y lo que ponga aquí, hace referencia a esa página y a mi experiencia creando un compilador. Explicaré de qué se trata la creación de un compilador. Supondré que ya existen nociones de Java en éste rollo como son las clases y los métodos.

Cuando nosotros queremos programar, nuestro programa el cual cumplirá un objetivo previamente estudiado bajo algoritmos y aplicación de la Ingeniería en Sistemas, está sujeto a las instrucciones que el procesador tenga integradas.

El compilador es un programa que se encarga de leer un archivo de determinado lenguaje de programación y "traducirlo" al lenguaje máquina que es el conjunto de instrucciones (en el caso de las computadoras, el lenguaje binario) que la computadora soporte o "interpreta".


Al leerse nuestro código fuente, el compilador comienza 3 procesos de análisis:
  • Léxico
  • Sintácico
  • Semántico
A continuación explico con ejemplos lo que realizará cada uno de éstos análisis:
  1. Análisis Léxico. Supongamos que mi sistema o programa es para automatizar la ventilación de una habitación; algo sencillo. Las acciones del ducto de ventilación son: abrir y cerrar. No se puede decir sólo abrir o cerrar ya que la ventilación (en éste caso) incluye un aire acondicionado (dejémoslo en ventilador) que debe encenderse o apagarse inependientemente de si nuestra ventilación está abierta o cerrada. Nuestras "palabras reservadas", que son únicamente las palabras que entiende nuestro compilador serán: abrir, cerrar, encender, apagar, ventilador y ventilación. El análisis léxico buscará entonces que esas palabras estén dentro de nuestro "código fuente". Si queremos crear una estructura para el código fuente, como en HTML o cualquier lenguaje, el programa debe determinar si la estructura se cumple. En caso contrario, no compilará.
  2. Análisis Semántico. Tenemos entonces dos variables a resaltar: una acción y un accionado. El accionado es la parte de la acción sobre la que ésta se encuentra realizando sus operaciones; es el que realiza la operación por así llamarlo. Viendolo desde éste punto, nos encontramos que las acciones son: encender, apagar, abrir, cerrar. Y los accionados serán: ventilador y ventilación. Nuestro análisis semántico deberá determinar si se cumple la condición Acción - Accionado, en caso contrario, el programa no compilará.
  3. Análisis Sintáctico. Aún cuando la lógica de Acción - Accionado haya sido satisfactoria, no hay como la lógica de lo que se puede y lo que no. Éste análisis revisa que las palabras cumplan con una lógica de si se puede o no. Un ventilador puede encenderse y apagarse pero no abrirse ni cerrarse. Las ventilaciones no pueden apagarse ni prenderse, sólo abrirse y cerrarse. Simplemente, buscamos que haya ésta lógica dentro del programa.
¿Ansiosos por un código fuente? En realidad el código fuente es muy personal y francamente siempre hay problemas para analizarlo, sin embargo, puedo poner fragmentos de mi programa y explicarlos con tal de que comprendan lo que se tiene qué hacer y sin quebrarse tanto la cabeza =P
public void extraerPalabras(String archivo){ //Método de extracción de palabras
try{
BufferedReader bfr=new BufferedReader(new FileReader(archivo));
String linea=bfr.readLine();
while(linea!=null){
StringTokenizer cadena=new StringTokenizer(linea);
while(cadena.hasMoreTokens()){
tokens.add(cadena.nextToken());
}
linea=bfr.readLine();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
Éste código sirve para extraer las palabras reservadas de un archivo de texto como nuestro código fuente y guardar cada palabra en un Vector. El Vector actuará como un arreglo, pero de tamaño indefinido excepto por la cantidad de elementos que se introduzcan en él. Para mandar llamar el código fuente el programa se ejecuta en la línea de comandos como java Compilador Sistema.txt o según los nombres que se hayan utilizado:
public static void main(String[] args) throws IOException{
if(args.length!=0){
new Compilador().extraePalabras(args[0]);
} else{
System.out.println("Uso: Java Compilador [nombre_archivo]");
System.exit(0);
}
}
Que desde luego es ejecutado por nuestra clase principal. El procedimiento del análisis requiere de comparar las palabras reservadas o alfabeto elemento por elemento:

for (int i = 0; i < j =" 0;" encontrado="true;" encontrado="=" encontrado="false;">0){
System.out.println("Errores: "+error);
System.exit(0);
} else{
System.out.println("Analisis lexico exitoso.");
Con lo cual lograrán que su análisis Léxico sea exitoso.

Por el momento, les dejo éso. Esperen pronto el análisis semántico y el sintáctico.

PD. No copien y peguen éste código como está, así no servirá. Sólo tiene propósitos de análisis.

sábado, 14 de abril de 2007

Primera Entrada

Tal como dice el título, ésta es la primera entrada que escribo a través de éste espacio, el cual encuentro agradable y flexible.

Aunque no lo crean, me encuentro en el desarrollo de mi propio sitio web, al que llamaré Mefisto Place; lo malo es que aún no puedo implementar Javascript por una sencilla razón... no sé =P.

Sin embargo no los desanimo, todo lo contrario. Espero hacer implementaciones lo más pronto posible para que puedan recibir sorpresas tremendas ;-)

I will come in soon!

_--» ♫♫♫♪♫♪ PDNR "Mefistofeles" ♀