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.

3 comentarios:

Anónimo dijo...

Muy interesante, estoy interesado en empezar a construir un pequeño compilador con java, quizás me tengas por aquí con algunas consultas cuando las cosas estén difíciles.

Saludos

_-_-Luiz-_-_ dijo...

oye me interesaria contactarte soi programador y me gustaria crear un compilador pero necesito ayuda me podrias orientar mira mi msn es kriptos_17@hotmail.com espero contactarte!!! saludos!!!

Omar López Cruz dijo...

Que tal amigo, interesante el blog, mira pues ya desarrolle un compilador para pascal en java, aun tiene muchas fallas, pero almenos programas sencillos los compila, pero ahora estoy modificando el codigo para almenos hacer el analisis lexico y sintactico para Java, espero tambien poder generar los bytecodes, pero creo es un poco complejo, bueno ahora me estoy topando que en la fase del analisis lexico, quisiera entrar a los paquetes .jar para de ahi poder describir los componentes, por ejemplo, si hago una declaracion del tipo "String cadena = new String("Hola mundo");"
el compilador javac busca si la clase String esta dentro de alguno de los paquetes en este caso se encuentra en "rt.jar" (esto lo encontre buscando en toda la api de JAVA), ahora la clase la encuentro en java.lang.String, y de ahi ya puedo ver todos los metodo a los que tengo acceso, bueno esto lo puedo hacer desde Netbeans, pero ahora yo quiero hacer algo similar para asi poder ur definiendo mis componentes del Analisis Lexico y de la misma manera el sintáctico, me podrias apoyar de alguna manera por favor, o proporcionarme alguna bibliografía para este fin, gracias de antemano