viernes, 3 de febrero de 2023

Las palabras clave en los fuentes de PSeInt

Siguiendo con los cambios internos en PSeInt, me embarqué en uno de los más trabajosos, que tiene que ver con la posibilidad de variar las palabras claves del pseudocódigo. Veamos el problema, la parte resuelta, la parte que falta, y las ventajas que traerá cuando se complete.


 1. El Problema

El código original de PSeInt estaba pensado para interpretar una única e indiscutible versión del pseudocódigo (reglas y palabras clave), que era la que me enseñaban en la cátedra donde empecé este proyecto. Entonces, por ej, "ESCRIBIR" como constante aparece muchas veces en los fuentes (en varios módulos, y en algunos casos muchas veces en cada uno). Y también con pequeñas variaciones (ej "ESCRIBIR ", con un espacio al final). Si quiero cambiar esa palabra clave, es un problema.

Pero hay más. No alcanza con buscar todos los lugares con dice ESCRIBIR y analizar si es la constante, si agrega espacio o algo, etc. También aparecen en el código otras constantes como 8 representando la "longitud de Escribir", o 9 representado lo mismo más un carácter adicional (como un espacio o un punto y coma). Imaginar y buscar las constantes numéricas es demasiado trabajo.

https://xkcd.com/221/

Hay tanto de esto en el código original de PSeInt.

Cuando empecé a permitir algunas variaciones (como Mostrar en lugar de Escribir, o Algoritmo en lugar de Proceso), fueron todos casos excepcionales, agregados con ifs ad-hoc, normalmente en la etapa de normalización, donde se detecta la palabra alternativa y se reemplaza por la original. Esto complica un poco más el código porque agrega las alternativas como casos particulares. Y no siempre son tan simples como agregar un or a la condición de un if (palabra=="ESCRIBIR" or palabra=="MOSTRAR"), porque hay veces en que una palabra clave se forma en realidad con más de una palabra (Hasta Que, Fin Algoritmo, Para Cada, etc). Estos casos suelen tener más código raro, y no siempre se resuelven de la misma forma.

Con todo esto, permitir modificar un poco más las palabras clave, o incluso agregar alguna nueva, es un dolor de cabeza.


2. La primera mejora

Lo que comenté que había hecho para que todos los módulos puedan reaprovechar el primer parseo que hace el módulo principal (pseint), que consistía entre otras cosas en reemplazar el formato de salida intermedio (el pseudocódigo normalizado) por una estructura de datos mucho más específica, sirvió para que las palabras clave ya no se repitan tanto en todos los módulos. En la nueva estructura de datos, cada instrucción ya viene con su tipo identificado, y sus partes cortadas, por lo que los módulos que consumen esta estructura ya no necesitan de las palabras claves.

Este cambio, que ya está listo hace unas semanas, eliminó la repetición y los números mágicos de módulos como psexport, o psdraw, que eran los más complicados en este sentido. Resta trabajar también sobre wxPSeInt, que como esos cambios no rompían su compilación, no me vi obligado a actualizar todavía. Sacando esto, el problema queda bastante acotado al módulo principal, pseint.

 

3. El trabajo actual

Actualmente estoy en el módulo principal. Los cambios del punto 2 ya lo mejoraron un poco, pero falta bastante. En estos días armé una estructura de datos para representar una palabra clave, para luego hacer que todo análisis de código que busque esa palabra dependa solo de esa estructura. Y ahí se gestiona de forma bastante transparente para el código cliente la posibilidad de palabras alternativas: el cliente compara un string contra el objeto que representa la palabra clave, y la función de comparación se encarga de ver todas las alternativas que guarde el objeto. Y esta función considera también los casos especiales como palabras compuestas por más de una palabra, o cuando una palabra clave es igual al comienzo de otra (ej: Para y Para Cada), y esconde esa complejidad también.

Con todo esto, el código cliente se simplifica mucho en varios casos. Ya lo implementé en la parte de detectar una instrucción (la primer palabra clave), pero por lo mal que está hecho el resto del análisis, no es tan simple hacerlo para las demás (las que van en medio o al final, como Hacer, Hasta, Con Paso, Sin Saltar, etc). Y en eso estoy ahora.


4. Las ventajas a futuro

Cuando esto termine, ya no me costará casi nada personalizar las palabras claves o agregar alternativas. Con tanta libertad que se va sumando, voy a tener que reformatear el cuadro de personalización del lenguaje, y el formato del archivo de perfil, pero finalmente cada docente podrá elegir sus palabras, u ordenar las que ya tenemos de forma que el intérprete priorice la de su preferencia (por ej, al generar código en la GUI o desde el editor de diagramas; o hasta en los mensajes de error y en las ayudas).

Y finalmente esto da pie para empezar a pensar en traducciones a otros lenguajes (pseudocódigo en portugués, francés, o klingon). Este no es un objetivo mio, pero sí me lo han consultado algunos usuarios alguna vez. Si se logra de rebote, bienvenido sea. Faltaría, eso sí, la posibilidad de traducir la GUI además del pseudocódigo, y eso no está implementado ni planeado de momento. Pero si hay suficientes interesados, supongo que en algún punto podría tomar el mecanismo que uso en ZinjaI y adaptarlo.

5 comentarios:

  1. Interesante esto de personalizar la lectura de código con referencia a la o las palabras clave.
    Pregunta: cuando normalizas el código como haces para que apunte al código original, si este es por así decirlo un texto diferente.

    ResponderEliminar
    Respuestas
    1. No, no lo hace y es un problema en algunos casos. La versión de pseint que estaba reescribiendo de cero sí contemplaba esto; pero la actual no, es un cambio demasiado grande por el momento. Sí se contemplan en la actual algunos paliativos. Por ej, saber cuál es la versión preferida de una palabra clave (sin normalizar) para usar al generar código; o a veces saber qué versión de la palabra se detectó en el código para informar en un mensaje de error. Porque ahora el análisis directamente elimina las palabras clave (ya no las reemplaza por sus equivalentes normalizadas), y solo se queda con las expresiones (estas sí estarán normalizadas y se pierde la referencia a las originales).

      Eliminar
    2. Hola, primero que todo quiero agradecerte en nombre de la extensa comunidad de usuarios, PSeInt es una herramienta de gran ayuda para aquellos que apenas se inician en el mundo de la programación e incluso sirve de traductor para los que sufren por el inglés; yo soy docente en una institución educativa pública y enseño en bachiller y lo que más les asusta de la programación es el inglés, con PSeInt les hago la iniciación a la lógica para que cuando lleguen al inglés no se traumaticen por el idioma pues solo reutilizan la lógica aprendida. Les enseño Python con Jupyter y les evalúo en Moodle, donde puedo utilizar un tipo de pregunta llamada "CodeRunner", la cual les permite probar todas las veces que necesiten su código durante el examen y el mismo programa les muestra las diferencias con respecto al resultado esperado y si tiene errores también le retorna el error que es devuelto por una plataforma en línea que hace la ejecución del código y devuelve en el examen de Moodle el resultado, si los casos propuestos (funcionamiento esperado con diferentes entradas) como respuesta coinciden perfectamente con lo que arroja la ejecución del código del estudiante, entonces allí se marca color verde y el estudiante ya tiene la seguridad de que aprobó esa pregunta del examen y por lo tanto antes de entregar el examen ya sabe exactamente la nota que va a obtener.

      Te cuento todo esto porque he querido (aunque no tengo ni idea de cómo hacerlo) crear un tipo de pregunta en Moodle específico para PSeInt aprovechando el ejecutable pseint.exe que permite la prueba de .psc por línea de comandos, quisiera saber si has llegado a pensar en hacer algo así, ya que este tipo de evaluación ayuda a que los estudiantes desarrollen capacidad de hacer debugging y también el desarrollo de aplicaciones que cumplan con los requerimientos dados; el único limitante (creo) es que al ser un .exe supongo que solo funcionaría en Moodle que corra sobre Windows (o no?).

      Te agradezco cualquier respuesta o contacto que puedas establecer conmigo por si te animas.

      Nuevamente mil gracias por todo el tiempo dedicado a un proyecto tan útil y de tanto impacto en los estudiantes principalmente de habla hispana, que a futuro serán muchos más a medida que los países le metan más esfuerzo a la capacitación en programación desde los colegios.

      Eliminar
    3. El hecho de que el módulo principal sea un ejecutable independiente del resto de la gui justamente permite pensar en estas cosas. El ejecutable también está en la versión para GNU/Linux (se llama "pseint", sin el .exe), todos los módulos ahí están por ahora en una carpeta "bin" dentro de la instalación de PSeInt.

      Supongo que para integrarlo al plugin de moodle primero habrá que ver cómo se configura un nuevo lenguaje en ese plugin, pero al final desde el lado de pseint todo se debe reducir a una invocación al módulo principal con los parámetros adecuados. No tengo tiempo de ver yo la parte de moodle, pero sí puedo ayudar a armar la linea de comandos de pseint con los argumentos adecuados.

      Eliminar
  2. Relacionado con las palabras clave del lenguaje, surge una duda, si PSEINT es un intérprete de pseudocódigo con sentencias y estructuras de programación que se codifican en texto lineal aproximándose a la escritura en seudocódigo, además de la capacidad de programación en forma gráfica con diagramas de flujo y sentencias de texto dentro de sus formas gráficas, entonces ¿esta ultima forma de codificación requiere del apoyo de un archivo texto o es un motor independiente de interpretación?
    Si es así seria magnifico que esta app no solo pudiera iniciar una sesión de codificación en formato texto sino en formato gráfico, es decir
    En el menú archivo mostrar
    Archivo nuevo código fuente texto, donde abre el panel de edición de código en formato texto
    Archivo nuevo código fuente gráfico, donde abre el panel de edición de código en formato grafico
    Claro está que se generaría dos archivos uno .pscx y otro .gpsc, donde la edición puede iniciar en cualquiera de los dos y no solo en formato texto, esto estimularía el uso y la codificación por medio de diagramas de flujo
    Espero se pueda llevar a cabo esta mejora
    Muchas gracias

    ResponderEliminar