martes, 10 de enero de 2023

Más avances en la reconstrucción de PSeInt

Durante las últimas dos semanas pude invertir una buena cantidad de horas en PSeInt, y seguir con la tan postergada reestructuración interna. De a poquito empieza a tomar forma y a verse una luz al final del túnel.

Recordemos que hay varios ejecutables, que llamo módulos. El que realmente analiza y ejecuta el pseudocódigo es "pseint". Otros le piden a "pseint" que haga solo la verificación de errores y la normalización del pseudocódigo, y parten de esa salida, como el que exporta a otros lenguajes ("psexport"), o el editor de diagramas ("psdraw"). A estos pedidos los orquesta la GUI ("wxPSeInt"). Por ej, para ver un diagrama, la GUI guarda el pseudocódigo en un temporal, le pide a "pseint" que haga su parte y deje la versión normalizada en otro temporal, y luego a "psdraw" que dibuje lo que hay en ese otro temporal.

https://www.monkeyuser.com/2017/refactor-man

Comenté en los últimos posts que había estado trabajando exclusivamente en el módulo pseint. La idea a futuro es que la mayoría de lo que hace pase a ser parte de una biblioteca compartida por todos los módulos, y los datos de salida sean suficientemente completos y específicos para que no se necesite reparsear nada (es decir, mucho más "predigerido" que un simple pseudocódigo normalizado). Así elimino código y pasos innecesarios.

 

Los cambios internos en "pseint" que hice el año pasado rompieron la comunicación con entre los módulos. Si bien lo ideal sería empezar a usar la nueva "biblioteca", todavía no existe porque faltan más arreglos para que sea posible. Peero... los datos luego de ese 1er análisis sí tienen ya la forma adecuada. Entonces lo que hice fue implementar una serialización temporal muy simple de esos datos, para que los demás módulos partan desde ahí (reemplazar el pseudocódigo normalizado intermedio).

Esto me llevó a modificar mucho "psexport" y "psdraw". Ahora se cumple con el objetivo de simplificar el código (la entrada tiene información que antes había que reconstruir) y evitar múltiples implementaciones del mismo parseo (todos usan una misma función para leer esa entrada). Y los deja bastante más listos para cuando ese primer paso esté finalmente en una biblioteca.

Entre una cosa y otra, se me fueron 2 semanas. Lo peor fue adaptar psexport, porque cambió la interfaz base de la clase que exporta y eso modificó (simplificó, pero requirió reescribir buena parte) a todas las herencias, las clases que se encargan específicamente de cada lenguaje de salida. Y ya que estaba, en el proceso pude corregir algunos errores en las traducciones.

https://www.monkeyuser.com/2019/cleanup

Algo clave, que hizo posible todo este proceso, es contar con tests automatizados. Cada 5 minutos rompo algo sin darme cuenta; pero por suerte tengo un script que corre cientos de algoritmos en pseint y verifica si sus salidas o errores cambian. Algo similar también tengo para probar exportar 10 ejemplos clave con psexport a cada posible lenguaje. Y ahora agregué también casos de prueba para psdraw: un script que toma una lista de ejemplos, genera con psdrawE las imágenes de los diagramas, y las compara con imágenes de referencia para detectar cambios.

Entonces, luego de todo este trabajo, pseint va tomando forma, psdraw y psexport empiezan a reaprovechar más código y simplificarse un poco, y los tests automatizados abarcan cada vez más, generando más confianza como para pensar en pasar este código a la rama principal y pronto empezar a publicar versiones con estos cambios.

4 comentarios:

  1. Después del triunfo de la selección argentina los ánimos se subieron =).

    Como el próximo lanzamiento tiene un 'nuevo' kernel, pienso que se debe dejar la versión actual y lanzar una nueva como 2.0ß mientras se refina el código, porque ya estamos próximos a iniciar un nuevo semestre con los chicos de secundaria y primeros niveles de ingeniería

    ResponderEliminar
  2. Saludos,

    No ha pensado en la idea de hacer una versión "productiva" que tenga las siguiente características:

    Pueda genera un ".exe" directamente.
    Agregar función de manipulación de archivos "file".
    Pueda crear algoritmo simulando "objeto" (P.O.O.)

    Hace más de 10 años le escribí un correo donde le sugería que le agregara funciones de subrutinas, usted respondió que esa no era la función del pseint ya que era solo para aprender lo básico de los algoritmo, pero algunos años después, satisfactoriamente usted le agregó la funcionalidad de subrutinas. Obvio que para haber hecho esto usted tuvo que haber recibido muchas más peticiones sobre este tema de muchas personas que lo hicieron convencer.

    ResponderEliminar
  3. podría traducirlo a varios idiomas o hacerlo como una plantilla personalizada

    ResponderEliminar