domingo, 4 de marzo de 2012

¿Quién es quién? Hoy: PSeInt

Antes de poder escribir sobre tópicos o problemas específicos de alguno de mis tres proyectos, por prolijidad debería escribir artículos presentándolos. Debería contar para qué sirven, como nacieron, en qué estado están, hacia a donde van, qué tienen de interesante, etc. Por eso, este artículo inaugura una trilogía de posts llamada ¿quién es quién? donde trataré de hacer las debidas presentaciones. Según el orden cronológico, de los tres proyectos que se considerarán centrales por ahora en este blog (no quiere decir que no haya tenido otros más chicos dando vueltas, o que no aparezca uno nuevo en el futuro), el primero en cobrar vida fue PSeInt; y su historia comienza así:

Tuve la suerte de aprender a programar (o algo similar, porque era un cavernícola, pero me las rebuscaba) mucho antes de entrar en la universidad. Aprendí de muy chico con Logo y Basic, y seguí con este último y sus derivados durante largos años, tal vez más de lo aconsejable. Probé desde el primer Basic para DOS hasta los modernosos Visual Basics de la época, pasando por apbasic, zbasic, qbasic, quickbasic, etc. Aunque podría resumirlo en Quick Basic y Visual Basic, los demás son solo leves variaciones. Programar siempre fue un hobbie, casi un arte, como tocar la guitarra, o escribir cuentos, algo divertido, así que hice mucha mucha práctica. El punto es que llegué a la universidad sin saber lo que era una clase o un puntero, pero con un dominio casi absoluto sobre los ifs anidados, los fors, los whiles, y las expresiones matemáticas que uno usa habitualmente al programar.

En la universidad, antes de hacernos programar en un lenguaje real (que iba a ser C++), nos trataban de enseñar los conceptos básicos (características de un algoritmo, constantes, expresiones, estructuras de control, arreglos, etc.) utilizando un pseudolenguaje. Es decir, un lenguaje bien simple, en español, inexistente en la vida real, pensado solo con fines didácticos (que resultó ser por razones históricas casi una traducción literal de Pascal). A mí y a Chivo (un amigo, que fue a estudiar conmigo, y con quien compartimos algunos proyectos en VB y muchas horas frente al teclado), habiendo jugado con Basic tantos años, nos resultó muy fácil. Solo tuvimos que cambiar un poquito la sintaxis, pero los conceptos, sin saberlo, ya estaban en nuestras cabezas. Pero veía que a la gran mayoría de mis compañeros, les sonaba a chino básico. Y en esto, el pseudocódigo parecía un arma de doble filo: si bien era mucho más simple que un lenguaje real, no había posibilidad de correrlo, ya que era sólo una idea. Entonces, la única forma que tenía un alumno para saber si su programa estaba bien, era la consulta al profesor. Con más de 200 ingresantes, apenas 3 profesores, y mil formas distintas pero igualmente válidas de resolver los ejercicios, la duda era eterna. Cuando al final del año nos dijeron que debíamos presentar un proyecto final para aprobar el curso, no lo dudé: iba a escribir un intérprete de pseudocódigo, para que cualquiera pueda probar su algoritmo y ver si daba lo que tenía que dar.

La primer presentación oficial de PSeInt fué en la mesa de examen del 29 de diciembre de 2003. El intérprete estaba lleno de bugs (aunque yo no lo sabía, y con los ejemplos que usé al presentarlo nadie lo notó), la interfaz estaba hecha con Borland Builder 4, y el código era sencillamente horrible. Como dije antes, dominaba a la perfección el arte de anidar condicionales y estructuras de control, pero no tenía idea de las buenas prácticas, los análisis de complejidad, las estructuras de datos más interesantes que permitían generar los misteriosos punteros, etc. En conclusión, el código del interprete era una chorrada de ifs que reproducían literalmente lo que pasaba por mi cabeza cuando leía un pseudocódigo. Aprobé la materia, me llevé una buena nota, y el proyecto quedó durmiendo en algún cajón por un par de años.

Mientras tanto, empecé a meterme cada vez más de lleno en el mundo del soft libre, hasta que un día, en una lista de correos encontré una invitación abierta a participar de un proyecto que buscaba recopilar soft libre para que el ministerio de educación lo distribuyera de forma gratuita en las escuelas. Sin muchas expectativas ofrecí mi programita, y resultó que uno de los participantes más involucrados era un profesor de programación, al que le gustó mucho la idea, y eso me llevó a trabajar otra vez en PSeInt, corrigiendo errores, y empezando a pensar en una versión para GNU/Linux. Gracias a él, Roman Gelbort, PSeInt volvió a la vida, y terminé unos meses después yendo al acto de presentación del CD con gente excelente de Solar y GLeducar (como Adrián Stafolani que fue quien me invitó), y hasta escuché que nombraran mi software en la presentación, porque una de las "testers" del proyecto, Patricia Chechele, también enseñaba programación y le había gustado. Con toda esta motivación, escribí una interfaz para GNU/Linux, registré el proyecto en sourceforge, y allí empezó todo otra vez.

Con el tiempo resultó que el titular de aquella materia de primer año me ofreció probar el soft en las clases, luego me convertí en ayudante de cátedra, y ahora estoy como uno de los jefes de trabajos prácticos del grupo docente, que ha crecido bastante. En medio de todo, además encuadramos a PSeInt como parte de un proyecto de investigación (del que hablaré más en detalle cuando presente a ZinjaI), y me dio la posibilidad de dedicarle más tiempo para pulir la interfaz y agregar algunas funcionalidades. Además, poder ver cómo los alumnos interactúan en el aula con el programa acelera muchísimo el desarrollo. Una vez que todo estuvo en marcha, la tarea fue corregir bugs y pensar hacia donde ir en el futuro. Había dos puntos importantes a analizar: 1) el código heredado desde las primeras versiones no tenía ni pies ni cabeza; y 2) el pseudocódigo que utilizaba se encasillaba mucho en lo que un par de docentes de una cátedra pensó en unas circunstancias determinadas. 

Un cuatrimestre después de terminar la primer versión, después de cursar la materia Algoritmos y Estructuras de Datos con el grandísimo Mario Storti, entendí mejor lo mal que estaba el diseño inicial, y la cantidad de herramientas que no conocía antes y que podría haber aprovechado (esa materia sí que me abrió la cabeza). El código era impresentable desde todo punto de vista, y eso me impidió otras cosas, como por ejemplo agregar la posibilidad de definir funciones/subprocesos (y también impidió lamentablemente que otros usuarios que demostraron interés lo hicieran). Durante 2009 me dediqué a reescribir una buena parte, la más esencial para el mantenimiento, que es la que se encarga de evaluar expresiones, determinar tipos de variables, etc. Aún permanece horrible la parte que se encarga de verificar la sintaxis, pero esto es un poquito menos crítico a la hora de extender el "lenguaje".

El otro punto interesante, y en el que me centro más actualmente, es el que analiza cómo debería ser el pseudocódigo, hasta donde debería llegar, cuanto de pseudo y cuanto de código debería tener, cómo se debería usar en el aula, etc. Por el momento empecé por hacer mucho más flexible el lenguaje aunque manteniendo las misma estructura y componentes básicos (agregar mucha azúcar sintáctica). Esto también me permite llegar a más usuarios, así que todos deberíamos estar un poquito más contentos. Pero queda mucho por hacer, y tengo miles de cuestiones que discutir con Dijkstra, pero las voy a dejar para otro post.

En conclusión, PSeInt es un intérprete de pseudocódigo. El pseudocódigo debería servir para enseñar los conceptos, la lógica básica, la abstracción necesaria para empezar a programar, sin tener que preocuparse por un lenguaje y sus particularidades. PSeInt ofrece un editor con coloreado de sintaxis, autocompletado, ayuda rápida en pantalla, la posibilidad de visualizar el algoritmo como diagrama de flujo, de convertirlo luego a código C++, etc, y lo más importante: la posibilidad de que la computadora interprete y ejecute el algoritmo en caso de ser válido, o señale los errores en caso contrario. Hay que decir que lo segundo es mucho más difícil e interesante según mi criterio que lo primero. Si todo sigue bien, el futuro le depara más de pseudo y menos de código, tal vez el uso de funciones, la posibilidad de editar los diagramas de flujo, quién sabe qué más.

18 comentarios:

  1. Hola, soy un estudiante de informatica de Peru y estoy interesado en el proyecto que realizaste, podrias decirme por favor como compilar el codigo que publicaste en pseint.sourceforge.net, para tener idea de como hacer un software de esa magnitud. Gracias.

    ResponderEliminar
    Respuestas
    1. El código fuente se baja desde el mismo lugar que el ejecutable, pero seleccionando la versión src en lugar de l64,w32,etc (o clonando el repositorio git). Adentro del zip hay una carpeta por cada "modulo"(ejecutable) del proyecto y archivos txt con las explicaciones necesarias para compilar (empezando por fuentes.txt). También están los makefiles que uso para cada plataforma (ej: Makefile.lnx para Linux, Makefile.w32 para Windows), y los proyectos para ZinjaI; cualquiera de las dos formas te va a permitir compilar rápidamente todo si tenes las dependencias (opengl, glut, y wxWidgets 2.8 ansi). En Linux/Mac los makefiles estan listos para usar, en Windows hay que retocarlos según donde se instaló MinGW así que puede que sea más fácil con ZinjaI (que además instala todas las dependencias). Todo lo compilado va a parar a una carpeta bin que tiene el resto de los archivos (ayuda, imagenes, ejemplos, etc).

      Eliminar
    2. Hola, si lo tengo todo... esta iniciando con el makefile para windows.
      Pero cuando compila no se genera el archivo 'icon.o' porque parece que no hay 'icon.cpp'... y por lo tanto no se ejecuta la aplicación mostrando error de archivo 'icon.o' no encontrado. Por favor indiqueme si falta alguna libreria por descargar o digame como puedo compilarlo. Gracias

      Eliminar
    3. icon.o se compila con windres a partir de icon.rc. La regla está en el makefile, pero si te da error puede ser porque le falta el ${MINGW_DIR}\\ antes de windres cuando defino la variable WINDRES arriba de todo en el makefile (es decir, no va a funcionar si tu ${MINGW_BIN}\\bin no esta en el path. Podés agregarla, o bajar el Makefile nuevamente del repositorio git. Si seguís con dudas lo mejor sería discutir estos asuntos en el foro así quedan ahí para otros que puedan tener el mismo problema.

      Eliminar
  2. Como podria contactarme con Ud. me podria brindar algun correo electronico, Gracias.

    ResponderEliminar
  3. Hola, me gustaría saber si conoces algún libro que enseñe los fundamentos de la programación utilizando PSeInt. Gracias...

    ResponderEliminar
  4. que bien que ayudas a los demas a comprender ciertas dudas y facilitas mucho elprograma

    ResponderEliminar
  5. Hola: Soy profesor en México de la Escuela Superior de Cómputo del IPN, y me da un gran gusto que existan personas como tú que apoyan a los niveles más básicos de la programación sin despreciar su importancia. Me gustaría mucho trabajar con proyectos de este estilo, por el momento yo me enfoco en una plataforma de evaluación de programas automática para C, C++ y Java. La idea es que los profesores e instituciones tengan plataformas al estilo de las que se usan en ACM-ICPC para evaluar las clases y no solo concursos de programación. Ojala y pudiéramos unir fuerzas y compartir para trabajar en proyectos similares. Por el momento solo tengo una observación para PSeint, ya que el código que genera es para C++, y al alumno debe de quedarle claro la diferencia entre decir C++ y C, y PSeint es para aprender programación estructurada, por lo que lo ideal es que la salida sea un programa .C, que respete ANSI C. Mi correo es: edgardo_franco@msn.com , ojala pudiéramos cooperar.

    ResponderEliminar
    Respuestas
    1. Gracias por los comentarios. La elección de C++ fue inicialmente porque es el lenguaje que usamos en mi facultad despues del pseudocódigo. Por otro lado la conversión es más directa gracias a la sobrecarga de operadores en iostream y string. Para pasar a c tendría que reemplazar operadores por funciones lo cual no siempre es tan directo y definir cosas que no se deducen del pseudcódigo (como el largo de las cadenas por ejemplo, tipos de variables, etc). En realidad en algún momento me gustaría poder ofrecer más lenguajes como c, c++, java y python por nombrar algunos, pero antes tengo que hacer un poco más flexible el código base del traductor, y escribir alguna documentación para que puedan colaborar otros agregando los lenguajes que prefieran.

      Eliminar
    2. POR QUE EL NOMBRE DE PSEINT

      Eliminar
    3. Por PSEudo INTérprete, PSE de PSEudocódigo e INT de INTérprete. Aunque PSeudo también se puede escribir Seudo, y la P podía ser de PIPEH, que el nombre de la "empresa" ficticia con que englobaba mis desarrollas hace mil años. Por ese doble sentido las dos iniciales (PS) las escribía con mayúsculas, y así quedó. Pongo entre comillas lo de "empresa" porque nunca existió formalmente, pero si hubiese existido ese era el nombre. Aunque ahora ya no me gusta mucho, por eso no lo uso más, hasta que tenga algo mejor (como CR Software(?), el par de cucarachas me parece un lindo logo para identificar mis desarrollos).

      Eliminar
  6. Una de mis metas a largo plazo es crear un programa al estilo pseint donde uno pueda crear sus algoritmos y todo eso, pero aun no tengo los conocimientos necesarios para hacerlo, ojala se cumpla ese sueno ya que desde que estaba en la universidad me rondaba esa idea en la cabeza y aun lo hace... Felicitaciones por tu software es la herramienta que utilizan en mi u para adentrarnos en el mundo de la programacion.

    ResponderEliminar
  7. soy profesor de programación en Ecuador me parece sumamente interesante y de gran ayuda el programa pseint sobre todo por ser multi plataforma gracias por desarrollarlo.

    ResponderEliminar
  8. hola, soy profesor en México, me gustaría colaborar en la parte de la traducción del pseudocódigo al lenguaje java, mi duda es si me pueden proporcionar la grámatica con la que funciona el pseudoocódigo de pseint

    ResponderEliminar
  9. La gramática está en la ayuda. De todas formas, está el módulo que traduce a C++ para usar de referencia (de hecho en muchas cosas será muy parecido), pero está desactualizado.

    Mi idea es corregir ese módulo para soportar las instrucciones que le faltan y la definición de funciones; y en el proceso organizarlo y documentarlo un poco, de modo que se pueda tomar como partida para otros lenguajes, y que las funciones en común se escriban una sola vez.

    Así que sugiero empezar por analizar ese módulo, aunque si no tiene tanto apuro, podría esperar a la próxima versión, ya que es un punto donde va a haber varios cambios.

    ResponderEliminar
    Respuestas
    1. En el repositorio git ya hay una versión mejor organizada del módulo que exporta, donde todo lo que depende del lenguaje de salida (c++ por ahora) está en un archivo separado, y hay una infraestructura básica para agregar otros lenguajes.

      Eliminar
  10. Hola,

    Llevo muy poco tiempo con Pseint y reconozco que como herramienta educativa es perfecta, vale para adultos y noños y francamente la recomendaria en las escuelas y universidades de España.Pero un punto apreguntar;¿EN la ultima versión ya no existe la funcion Variable?
    Porque en algunos tutoriales de la red se presenta esa opcion pero Pseint no a encuentro y me extraña que en pseudocodigo no se intenten declara por Variable.

    Un saludo
    Marco

    ResponderEliminar
  11. Hola, gracias por los comentarios, pero nunca existió una "función Variable"... No sé a qué te referís, variable es una cosa, función es otra, y no me doy cuenta a dónde apunta la pregunta. ¿Tenes algún ejemplo de algo que antes andaba y ahora no? Sería bueno seguir este tema en el foro.

    ResponderEliminar