Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Reingeniería de Un Compilador Educativo
Reingeniería de Un Compilador Educativo
CGPI 20070913
Autores:
Isaac Andrés Canales Martínez
[email protected]
Michel Ruiz Tejeida
[email protected]
Coautores:
MC Sergio Fuenlabrada Velázquez
[email protected]
Como estudiantes dentro del área de informática una correcto funcionamiento, considerando los requisitos
de las características que se nos atribuye es la del problema, y evitar la inestabilidad. Todas estas
solución de problemas mediante el uso de recursos metodologías y procesos que se deben de seguir, es
computacionales; sin embargo la creación de una lo que se conoce como Ingeniería de Software.
solución con las características mencionadas
requiere de cierto grado de conocimiento y habilidad Formalmente la Ingeniería de Software se define
que, finalmente nos indicará la eficiencia de la como “la aplicación de un enfoque sistemático,
disciplinado y cuantificable hacia el desarrollo,
solución propuesta.
operación y mantenimiento del software.”
¿Cómo sabemos si nuestra solución es
Lo anterior se refiere al proceso de creación del
eficiente?
sistema computacional modelando y adaptándolo a
Para aquellos que desarrollan sistemas que utilicen las necesidades del usuario, siguiendo estándares
un equipo de cómputo1, es un gran reto identificar si de calidad que permitirán la mejor solución posible.
finalmente la solución es la deseada por el usuario y
si ésta cumple las características adecuadas para ¿Qué pasa si el sistema está terminado y no
ser un buen sistema. seguimos los procedimientos adecuados?
Como se sabe, el proceso de creación lleva consigo Al crear aplicaciones para solucionar problemas
una serie de pasos sistematizados y metodológicos; específicos, en ocasiones, se omiten algunos pasos
sin embargo, en la aplicación diaria se pasan por alto al seguir cierta metodología, lo que trae consigo
tareas y actividades que son consideradas inútiles o problemáticas comunes, dentro de las más
innecesarias, que posteriormente se verá reflejado destacadas encontramos: crear características del
en la productividad del mismo. sistema que no resuelven el problema principal,
agregar funciones extras para mejorar la aplicación y
Por todo lo anterior, el desarrollo de un sistema debe hacerla más robusta pero que finalmente no son
seguir normas y metodologías, para asegurar el necesarias, entre otras.
1
Conocido también como Sistema Computacional
1
La solución para determinar si el sistema cumple su La escritura de compiladores comprende los
función la podemos encontrar dentro de la lenguajes de programación, la arquitectura de
Reingeniería de Software, ya que ésta es el proceso computadoras, la teoría de lenguajes, los algoritmos
de revisión de aplicaciones de software con el y la ingeniería de software. Es importante aclarar
propósito de reutilizar el sistema actual. algunas definiciones primordiales antes de
mencionar las herramientas utilizadas; dichas
La Reingeniería de Software utiliza las mismas definiciones se muestran en los siguientes párrafos.
técnicas y principios de la Ingeniería de Software,
con la diferencia de que ahora será un proceso Expresión Regular. Es una expresión que describe
comparativo entre lo que se debió haber hecho y lo un conjunto de cadenas sin enumerar sus
que existe actualmente, para con ello identificar las elementos. Las expresiones regulares son
fallas y puntos débiles del sistema, que permitirá simplemente fórmulas cuyo propósito es representar
posteriormente corregir la aplicación y evitar iniciar cada una de ellas un lenguaje. Así, el lenguaje de
un nuevo proyecto, lo que ahorrará tiempo y reducirá una expresión regular es simplemente el lenguaje
costos. que ella representa.
Podríamos explicar detalladamente cada una de Autómata Finito. Un autómata finito se puede
estas metodologías, sin embargo, nuestro propósito representar diagramáticamente mediante un grafo
se centra en la aplicación de lo que se ha venido dirigido etiquetado, llamado grafo de transiciones, en
explicando a un sistema terminado. el que los nodos son los estados y las aristas
etiquetadas representan la función de transición, ver
Los autores, siendo estudiantes de la carrera de la figura 2.
Ingeniería en Informática de la UPIICSA, llevaron a
cabo el desarrollo de un compilador, para la materia
de Compiladores que se cursa en el 4º semestre de
dicha carrera; es necesario mencionar que el
producto fue realizado sin la aplicación de una
metodología de Ingeniería de Software.
2
JFlex. Es un generador de analizadores léxicos para
Java, escrito en Java. JFlex fue diseñado para
trabajar en conjunto con CUP (generador de
Analizadores Sintácticos LALR). Para su
construcción requieres de la definición del lenguaje
por medio de expresiones regulares, que
posteriormente son convertidas de forma automática
a autómatas, para la generación de los lexemas que
serán utilizados por el analizador sintáctico.
3
Analizador Sintáctico LALR. Es la parte del
compilador que agrupa los componentes léxicos de
un programa fuente, en frases que el compilador
utiliza para sintetizar la salida. Este tipo de
analizadores utiliza funciones y algoritmos para la
generación de tablas de análisis sintáctico, que
posteriormente determinan si una entrada pertenece
o no a una gramática. El resultado del análisis
sintáctico se muestra en la figura 6.
4
Figura 9. Utilizando únicamente los registros 1 y 2, la
traducción del código optimizado puede convertirse en
un código ensamblador eficiente.
Optimización de código. Esta fase tiene el propósito Como en toda metodología de creación de sistemas
de mejorar el código intermedio, de modo que resulte es de vital importancia identificar la factibilidad y así
un código máquina más rápido de ejecutar. saber si continuamos con el siguiente paso o
debemos cambiar de estrategia de solución, de igual
forma en la reingeniería de software debemos estar
seguros al aplicar el proceso o si debemos realizar
un plan de acción alternativo.
Figura 8. La optimización de código mejora la forma
de realizar los cálculos reduciendo el mismo código a Inicialmente lo más conveniente es comprobar que el
solo dos direcciones. sistema actual requiere del proceso de reingeniería,
lo cual se lleva a cabo identificando si el software
Generación de código. La fase final de un compilador
cumple adecuadamente los requerimientos para los
es la generación de código objeto, que por lo general
que fue creado. El siguiente paso es el de
consiste en código ensamblador (ver figura 9). Las
asegurarse que el sistema requiere necesariamente
posiciones de memoria se seleccionan para cada
ser modificado, con lo que obtenemos los puntos
una de las variables usadas por el programa.
débiles y zonas críticas. Resulta conveniente
Después, cada una de las instrucciones intermedias
basarse en la documentación del sistema para
se traduce a una secuencia de instrucciones de
entender su funcionamiento y poder realizar una
máquina que ejecuta la misma tarea. Finalmente
evaluación adecuada de los cambios que deberán
hemos concluido con todas las fases que forman un
realizarse.
compilador, sin embargo existe un procedimiento
que se realiza de forma implícito durante todo el Una vez que se ha determinado que el sistema
proceso de compilación que es la detección y realmente requiere de una reingeniería, se debe
manejo de errores. tener en cuenta que el trabajo de ésta será menor al
5
de la creación de uno nuevo, pero que finalmente el Implementación del analizador semántico y verificación
de tipos de acuerdo a los resultados del analizador
precio será alto.
sintáctico.
Generación de código.
Al realizar la reingeniería del compilador se basó el
desarrollo en un modelo que describe Tabla 1. Requerimientos del compilador
detalladamente lo mencionado; en donde cada
actividad realiza una mejora progresiva y que de Tomando en cuenta los requerimientos es necesario
acuerdo al diagrama presentado a continuación, analizar las funciones que fueron establecidas para
cada una de éstas puede repetirse en otras cumplirlos y así verificar que solo existan funciones
ocasiones con la particularidad de que el ciclo puede dedicadas a dicho propósito, esta actividad recibe el
terminar después de cualquiera de estas actividades. nombre de Ingeniería Inversa, la cual será tratada
El proceso de reingeniería se muestra gráficamente más adelante.
en la figura 10. Reestructuración de documentos.
6
El proceso elegido, al aplicarlo al compilador, dio Reestructuración de código.
como resultado la obtención de documentos que
indican las funciones de cada clase, variables, La lógica de programación es diferente dependiendo
funciones y procedimientos, todo lo anterior aplicado del programador, ya que se puede llegar a la misma
al código; en lo referente a la parte del análisis, se solución de diferentes formas, pero esto no significa
definieron y documentaron los requerimientos, que todas sean las mejores, por eso se recomienda
diseño, palabras reservadas, operadores y establecer estándares en el código, ya sea que las
variables comiencen siempre de alguna forma, que
componentes del lenguaje.
las funciones o procedimientos tenga nombres
Ingeniería Inversa. coherentes de acuerdo a lo que hacen, u otros
patrones.
Cuando existe un sistema informático al cual se le
aplica un proceso de reingeniería, es necesario Si no se han fijado lineamentos o estándares en el
regresar a la etapa de diseño incluso si no hay código, el proceso de mantenimiento será algo
documentación, esto es para analizar posibles realmente complicado, por consecuente, la
errores de análisis y posteriormente hacer las reingeniería debe tocar este importante punto y
debidas correcciones; la ingeniería inversa permite hacer algo al respecto.
realizar lo anterior.
La reestructuración de código tiene como objetivo
La realización de una ingeniería inversa, consiste en identificar partes del código fuente que violen el
“desmembrar” el sistema existente y posteriormente funcionamiento natural de las estructuras de control
estudiar y analizar detalladamente cada uno de esos o que no cumplan con lo establecido por la
miembros o partes resultantes, para saber cómo se programación estructurada u orientada a objetos,
obtiene el resultado, cómo se realiza el proceso o para posteriormente corregir esos errores, poner a
simplemente para saber porque el código está prueba el nuevo código, y finalmente documentar los
estructurado de cierta forma. cambios realizados.
7
ejecución, también existen variaciones en las lleva a cabo de forma satisfactoria la re-compilación
estructuras y tipos de datos utilizados para llegar a del nuevo código.
esa solución.
Ingeniería Directa.
La utilización de ciertos tipos de datos y la definición
y/o implementación de estructuras de control, es de La ingeniería de software tiene la finalidad de crear
vital importancia para el óptimo desempeño y sistemas computacionales de calidad, cubriendo
utilización de recursos de un programa, ya que se estándares y facilitando el análisis de los procesos y
puede desperdiciar memoria si se utiliza un tipo de resultados que debe arrojar.
dato en vez de otro o se puede complicar la La ingeniería directa se refiere a la aplicación de las
resolución del problema al no utilizar una estructura técnicas de ingeniería de software, pero en una
de datos correcta. forma menos compleja, es decir, aplicar un proceso
Si se detectan problemas de definición de datos, es de análisis y diseño a lo que se obtuvo en las etapas
necesario analizar el porqué no es buena esa anteriores de reingeniería, tomando en cuenta sólo
implementación y seleccionar otro tipo o estructura aquellas partes donde existieron cambios.
de dato, y al igual que el proceso de reingeniería Al aplicar la ingeniería directa, se pretende añadir
anterior “Reestructuración de código”, poner a funciones que sirvan para la mejora del sistema en
prueba el nuevo código, y finalmente documentar los forma modular e incluso en forma global.
cambios realizados.
El compilador aquí descrito pasó por esta etapa de
Java fue el lenguaje de programación utilizado para reingeniería, y los resultados obtenidos fueron muy
desarrollar el compilador, por consecuente se utilizó notorios.
la orientación a objetos, y es por ello que casi todo
dentro del desarrollo de esta herramienta informática Primeramente, el proceso de ingeniería directa
está declarado en clases. permitió establecer un diseño de interfaz gráfica, ya
que la primera versión del compilador se ejecutaba
Las estructuras de datos que se utilizaron en el en línea de comandos, lo que puede ser difícil de
código fuente son muy básicas, arreglos y listas utilizar para algunas personas.
enlazadas por mencionar algunas, y los tipos de
datos también son tipos básicos, como String2, Una vez que se tenía el diseño de la interfaz,
enteros y caracteres. también se tomó la decisión de que el compilador
debería integrar un editor de código, ya que como se
Es importante mencionar que la reestructuración de mencionó antes, al ser la interfaz línea de comandos,
datos brinda el soporte para que la aplicación tenga sólo se podían compilar archivos que ya estuvieran
un largo plazo de vida, esto se debe al avance que previamente capturados en otro editor de texto.
van teniendo los lenguajes de programación, porque
en algunos desaparecen ciertos tipos de datos, no Al principio de este escrito se abordaron las
dan soporte a algunas funciones como en el caso consideraciones teóricas del compilador, como son,
que ocurre entre los compiladores de C estándar y tabla de símbolos, análisis léxico, análisis sintáctico,
los desarrollados por Borland o Microsoft, y en Java entre otros; todas estas etapas de compilación
el hecho de que desaparecen funciones conforme se generan un resultado, y al aplicar la ingeniería
actualiza la versión de su máquina virtual o directa, se decidió mostrar de forma gráfica al
simplemente al dar mantenimiento al código no se usuario todos los resultados de cada uno de los
procesos de compilación, ya que la primera versión
2
Cadena de caracteres
8
solo mostraba el producto final, que es el código de 3 El proceso de reingeniería se puede aplicar tanto a
direcciones, como el mostrado en la figura 7. grandes o pequeños, simples o complejos sistemas
informáticos.
Finalmente, el usuario del compilador es capaz de
modificar, crear y abrir sus códigos en el entorno
gráfico, y compilar dichos archivos fuente con sólo
dar clic en un botón.
Referencias.