Subprocesos y el Futuro de PSeInt
Escribo estas aclaraciones debido a la gran cantidad de mensajes que recibí durante el último año preguntando acerca de la posibilidad de definir subprocesos/funciones en pseudocódigo. Paso a explicar a continuación algunas cuestiones históricas, prácticas y filosóficas relacionadas al futuro de este software y la posible inclusión de esta característica.
En primer lugar hay que considerar el contexto en el cual nace este proyecto. Concebido inicialmente como un proyecto final de una materia del primer cuatrimestre de la carrera, presenta un diseño interno deficiente y poco flexible. En aquel momento, el objetivo era interpretar el pseudocódigo tal cual lo presentaban en mi carrera y nada más. Jamás pensé que llegaría a tener la cantidad y variedad de usuarios que tiene actualmente. Además, la falta de experiencia con el lenguaje de programación utilizado, el casi nulo conocimiento acerca de estructuras de datos dinámicas, y las muchas otras falencias en cuestiones algorítmicas más avanzadas, tambien condujeron a un diseño inicial pobre. Por esto resulta actualmente muy dificil agregar nuevas características y aún mantener las existentes. Sería deseable que el parseo modelase un autómata de estados finitos, que las expresiones se representasen como árboles ordenados orientados, que la estructura del árbol se aprovechase para realizar una determinación de tipos más minuciosa, que al autómata resultara flexible frente a potenciales extensiones, etc, etc, etc.
6 años después, el código actual del intérprete me produce cierta vergüenza, y viendo que el proyecto sigue vivo, que el número de usuarios crece día a día, y que como programador creo haber alcanzado la maduréz y experiencia suficiente para reescribirlo correctamente, me propongo comenzar la tan postergada reestructuración interna. Por un buen período de tiempo, los cambios se irán introduciendo sin alterar las funcionalidades, por lo que el usuario final podrá no observar grandes diferencias. Sin embargo, quiero que la comunidad de usuarios docentes sepa que se está realizando un trabajo importante para que las futuras versiones estén a la altura de las circunstancias. Sin embargo, por ser éste un software libre desarrollado y mantenido sólo por el placer de programar y ver como la creación de pronto se torna útil para un número relativamente importante de personas e instituciones, no puedo dedicarle más que parte de mi tiempo de ocio, razón por la cual los avances se irán incorporando con cierta lentitud.
Finalmente, volviendo al tema original, creo que el desarrollo de un software de estas características debe guiarse tanto por mis apreciaciones personales acerca de qué debe ser y qué no, como por la retroalimentación de la comunidad de usuarios. Algunas sugerencias recurrentes (como la inclusión del operador Mod, la definición explícita de tipos de variables, funcionalidades básicas de "depuración", etc.) han sido implementada de acuerdo a las posibilidades. Sin embargo, para poder desarrollar la característica más solicitada (subprocesos), debo primero llevar a cabo estas reestructuraciones que he mencionado. En conclusión, mi intención es desarrollar esta funcionalidad, y estoy lentamente trabajando para ello, pero antes deben aplicarse reformas de base, cambios mayores al diseño, que llevarán algo de tiempo y que será necesario probar y estabilizar previo al siguiente paso.
Desde ya cuento con su paciencia y buena voluntad para saber entender y reportar de la mejor manera posible los errores que se produzcan en el camino, esperando completar esta tarea en el transcurso de 2009
Bosquejo de los pasos a seguir:
- Reescribir la evaluación de expresiones: Parcialmente completado. El nuevo sistema arma un árbol implícitamente a travez de funciones recursivas, que se recorren en ambos sentidos para determinar correctamente los tipos de las variables y expresiones antes de realizar cualquier reemplazo. Esto mejora la interpretación y principalmente la exportación a código C++. Con el nuevo esquema, será más fácil introducir nuevas operaciones (como la concatenación de candes con +) o funciones adicionales.
- Reescribir el gestor de memoria: Parcialmente completado. Debe realizarse casi al mismo tiempo que la evaluación de expresiones. Su interfaz es muy similar al sistema anterior, pero más efeciente y flexible internamente.
- Reescribir el parseo de tokens del lenguaje: Esta parte del código, el análisis sintáctico, si bien no tiene un buen diseño, podría no ser de momento un gran problema a la hora de extender la funcionalidades para incorporar subprocesos. Sí lo es si se busca flexibilizar más el lenguaje, por ejemplo, permientiendo al docente elegir las palabras claves para cada acción.
- Facilitar la personalización del lenguaje para cada docente: Probablemente se saquen del menú de configuración todas las opciones referidas al lenguaje y se integren junto con otras por desarrollar y algunas actualmente ocultas en cuadro de diálogo especial, donde el alumno pueda simplemente elegir algo así como un "perfil" que configure todo de una sola vez. Es probable que deba hacer al momento de agregar esto un relevamiento acerca de cuales son las configuraciones que prefiere cada docente/institución. Sin dudas, la configuración por defecto, será la más flexible posible, para que el pseudocódigo incial tenga más de pseudo y menos de código, buscando no apartarse del fin original, ni enojar a Dijkstra.
- Depuración: En este punto no tengo idea de cual será el camino a seguir. No quiero introducir la depuración como tal en un pseudocódigo (quiero evitar contaminar la interaz y parecerme tanto a un lenguaje real, si no usemos pascal y ya), sino mantener un nivel bien básico y sencillo como lo es la ejecución paso a paso automática con un mínimo de inspección, pero el manejo de ámbitos de valides de variables para el uso de subprocesos complica un poco las cosas... Por otro lado, una representación adecuada de la pila de llamadas podría ser súmamente útil en muchos casos (por ejemplo, para entender recursividad).
- Documentación: La documentación debe crecer en todos los niveles: código fuente, ayuda del entorno, ayuda del lenguaje, tutoriales, ejemplos, etc. Tal vez se lleve a cabo en paralelo con las demás modificaciones.