lunes, 10 de agosto de 2015

Preguntas frecuentes sobre PSeInt

Hay tres preguntas acerca de las funcionalidades o el futuro de PSeInt que recibo periódicamente una y otra vez, ya sea en los foros, en mi correo, o a veces hasta en persona. Básicamente, sobre PSeInt para Android, sobre PSeInt en otros lenguajes, y sobre el uso de registros/structs en el pseudolenguaje. Les adelanto que son tres cosas que actualmente no están disponibles en PSeInt, pero si siguen leyendo les cuento mejor por qué no, y qué podemos puede hacer al respecto.


1) ¿Donde consigo PSeInt para Android/Windows-Phone/IOS/lo-que-sea-móvil?

Por el momento PSeInt solo está disponible solo para PCs con alguno de los tres sistemas operativos "principales" (Windows, GNU/Linux y Max OS). Para Android no existe, no es algo que se pueda hacer en corto plazo, y tampoco que esté en mis planes por el momento. No es que no me gustaría una versión para móviles, pero hay un par de limitaciones importantes por las cuales se requiere muchísimo trabajo para lograrlo.


La primera es wxWidgets, biblioteca en la que se basa toda la interfaz de PSeInt, y algunas cosas más que la interfaz también. Esta biblioteca es la que me permite programar en GNU/Linux y compilarlo luego en Windows o Mac OS. Pero por el momento no está disponible para Android. Aunque creo que sí hay gente que ha empezado a trabajar en eso (el port de wx a Android), hasta donde yo se está todavía muy lejos de ser una realidad. Y no veo de momento otra biblioteca alternativa que sí lo soporte y que haga que se justifique migrar tooodo el código que ya tengo a esa otra. Muchos pensarán en QT, yo también lo pensé antes de optar por wx, fue la alternativa más tentadora por lejos, pero sigo pensando que me conviene quedarme con wx.

La segunda razón es todavía más simple: no tengo casi ni idea de programación para smartphones (nunca hice nada para Android ni similares) y tampoco tengo tiempo para investigar tanto al respecto (hay tantas otras cosas que quiero aprender antes...). Por lo poco que se, el lenguaje predilecto sería Java y nada de PSeInt está hecho en Java. Hay algunas formas de compilar código C++ con algo llamado NDK, pero no es suficiente para wx. Tal vez sí lo sería para el intérprete puro (la lógica, sin interfaz, que es actualmente un simple programa de consola), y entonces habría que hacerle alguna interfaz nativa a la ejecución, pero podría ser una interfaz muy muy simple, creo que sería posible.

Tal vez lo más razonable de portar a nivel de interfaz sea el editor de diagramas de flujo, ya que lo imprescindible ahí es OpenGL y no wx. Ese componente de PSeInt en particular sí sería relativamente simple de llevar a otros toolkits, porque inicialmente se pensó para freeglut, y no hay nada más simple que eso. El único problema es que el OpenGL del editor de diagramas (GL 1.x/2.x) no es el mismo OpenGL (ES) que quiere Android. Otra vez, pasar de uno a otro sería bastante trabajo, pero esta vez podría justificarse ya que gran parte de este trabajo también podría ser útil para las versiones para PC.

En conclusión, no quiero agregar otro proyecto más que mantener. Actualmente, una versión para Android sería como otro proyecto nuevo, y no un extensión del actual, ya que sería más lo diferente que lo compartido. Sin embargo, si alguien con más experiencia que yo tiene alguna mejor idea, lo invito a proponerla o a experimentar. Lo importante sería entonces no migrar lo importante. Es decir, no pasar el corazón del intérprete a Java, sino solo la cáscara. Si algún interesado me pregunta a mí por dónde empezar, a priori yo diría que trate de compilar el intérprete con el NDK, y envolverlo con un interfaz bien simple que reemplace la terminal. Luego, que vea cómo envolver el núcleo OpenGL del editor de diagramas también con algo nativo (o sea reemplazar la partecita basada en wx de ese editor), para que entre los dos veamos después cómo cambiar la versión de OpenGL. Con eso tendríamos al menos una base para editar y probar diagramas de flujo, que creo que sería lo más útil para una tablet o smartphone, ya que me parece bastante incómodo querer escribir código con un teclado en pantalla.


2) ¿Donde descargar PSeInt en otros Ingles/Portugués/Jerigonza/etc?

Esto, dado el código actual del intérprete, es bastante difícil de lograr, pero aún así factible. Empecemos por algo aparentemente simple como lo sería solo poder cambiar las palabras clave. No es solo buscar y reemplazar en los fuentes "Escribir" por "Especripibirpi" para tener PSeInt en jerigonza. Hay, por dar un ejemplo, miles de lugares donde aparecen constantes como 8 o 9, que significan "el largo de la palabra Escribir", o "ese largo más uno", y que también habría que reemplazar, pero que llevaría mucho trabajo identificar. Y aunque identifique los cientos de cambios necesarios para variar unas pocas palabras, tampoco sería correcto simplemente aplicarlos, sino que habría que hacer algún refactory en el código para que estos cambios pasen a ser algo simple de realizar.

Ahora bien, supongamos que luego de mucho trabajo esto pasa a ser algo más o menos simple (como tocar unos cuantos #defines en un .h, por dar un ejemplo). Todavía queda el tema de la gramática. Dado que el pseudolenguaje busca ser algo bastante coloquial, su sintaxis está atada a la gramática del idioma. Entonces, pasar a otro idioma podría no ser simplemente intercambiar palabras clave, ¿podría requerir también variar la sintaxis?


El único otro idioma que puedo decir que conozco es el Inglés. Definitivamente no tiene sentido pasar PSeInt a Inglés, ya hay miles de lenguajes interpretados simples con palabras claves en Inglés. Sí me gustaría, por ejemplo, una versión en portugués, pero la verdad es que no hablo ni media palabra de portugués, así que no puedo hacer mucho al respecto. Pero, si algún docente bilingüe (castellano-portugués) quiere proponer las traducciones, estoy dispuesto a evaluarlas e implementarlas si no resultan ser tan diferentes. Un buen primer paso sería hacer la traducción de los mismos 10 ejemplos que uso para las traducciones a otros lenguajes de programación. Esos cubren con poco código casi todas las funcionalidades actuales del lenguaje, y servirían de base para analizar si hay cambios gramaticales importantes, o si es solo cambiar palabras claves. Si caemos en el segundo caso, entonces podría empezar a avanzar con ese refactory del que hablaba para cambiar las palabras clave.


3) ¿Cómo usar registros/structs en pseudocódigo?

PSeInt actualmente no soporta la definición de structs/registros ni nada parecido. Esto es algo que sí me gustaría mucho incorporar, pero que nuevamente es algo que requeriría mucho mucho trabajo. Quiero mantener el lenguaje simple y la sintaxis coloquial, entonces hay que pensar muy bien cómo meterlo en el lenguaje (en términos de cual sería la sintaxis, qué limitaciones tendría, etc). Ya hubo un intento al respecto de parte de un usuario, que se animó a meter mano en el intérprete y cambiar algunas cosas que no le gustaban y lo compartió en los foros (lo lindo del software libre, los créditos van para el usuario mncarbone). Las primeras versiones no me convencieron del todo, y a las siguientes (que creo que estaban mucho mejor) no llegué a analizarlas en detalle por falta de tiempo en su momento, y el código quedó algo desactualizado. En cualquier caso es un gran punto de partida, y una buena forma de experimentar al respecto. Tarde o temprano esos aportes directa o indirectamente ayudarán a desarrollar esta funcionalidad. Pero estos cambios llevan realmente mucho trabajo y tiempo.

Tomen como ejemplo el caso del soporte para funciones/subproceso. Cuando empecé con este blog, PSeInt no tenía esta funcionalidad, y todas las semanas alguien me escribía para pedirla. Había mucho trabajo que hacer antes para preparar el terreno para la implementación de algo así. Pero como era una funcionalidad que me interesaba cada vez más, con el tiempo (mucho, digamos que dos años) se fue preparando, un buen día estuvo listo (el terreno), y luego con poco tiempo más se logró. Confío en que con los registros pase algo similar, así que les pido paciencia al respecto.


En conclusión, de las tres cosas que nombré, la última debe ser la que más me interesa, la del medio es bastante factible pero no depende solo de mi, y la primera creo que es definitivamente la más lejana. Para las traducciones, si se demuestra interés y hay quien se tome el trabajo de colaborar (tanto del lenguaje primero, como de los textos de la interfaz luego), es algo en lo que podríamos trabajar. Respecto a Android, si algún tercero más experimentado en esas tierras quiere aventurarse, no le auguro un trabajo fácil, sino todo lo contrario, pero puede contar con mi apoyo. Y la última espero completarla, tal vez ya estén hechas las contribuciones que necesito, pero tampoco es tarea fácil. Y ese fue el resumen del panorama y los posibles futuros para PSeInt en relación a estas tres cosas que tan frecuentemente se consultan. Mucha paciencia y nuevas sugerencias al respecto serán bienvenidas.

13 comentarios:

  1. Hola Pablo, soy el seguidor mas fanático de PSEINT, ahora estoy estudiando JAVA por la portabilidad entre procesadores y por que ahora hay un juguetico llamado RASPBERRYPI que usa JAVA, pero consulto todo tipo de lenguajes para ver como trabajan y hacer comparaciones, por ejemplo QBASIC usa prefijos para declarar variables según un tipo de dato, creo que ningún lenguaje heredó esta característica que simplifica la codificación.


    los dos primeros puntos serian a largo plazo y el tercero lo mas pronto posible

    Una forma para hacer posible PSEINT en ANDROID o IOS o similares es buscar entusiastas, por ejemplo se me ocurre proponer en una facultad de ingeniería como trabajo de grado que se porte PSEINT a JAVA, separando por motores uno PARSER o INTERPRETE, otro el EDITOR de texto, otro el EDITOR DE DIAGRAMAS DE FLUJO, pienso que así se motivaría y encontraría personal para realizarlo.

    2: NO se portugués, pero me comprometo a escribir los códigos ejemplo en portugués, ya lo estoy haciendo con la ayuda de GOOGLE TRANSLATOR, luego busco amigos de Brasil que comprueben la traducción, y según veo el portugués conserva casi la misma ¨por hablar asi conformación de palabras¨, así que las cadenas no varían mucho, lo que no sucede con el idioma ingles.

    3: lo de registros ya esta en PSEINTREBEL y funciona bien ya lo probé, pienso que seria agregar esta característica en PSEINT, estamos en una época donde todo se basa en programación enfocada a objetos y los registros es la base para entenderlos, limitarse hasta manipular funciones seria un curso muy básico o incompleto.

    agrego un 4to punto

    En el foro he agregado ideas de cosas muy simples como

    4.1 soporte de variables globales, según los libros de programación que leo como c++, java, y similares dicen que le uso de las variables globales se deben hacer en programas cortos, se desaconseja en proyectos largos, pero otros lenguajes profesionales como MATLAB que se usa en casi todas las ramas de la ingeniería, usar variables globales es fundamental par registrar y monitorear variables en simulación y experimentación

    4.2 algunas palabras clave que mejoran la seudocodifcacion como ASIGNAR EJECUTAR ALGORITMO-FINALGORITMO ALIAS DE PROCESO-FINPROCESO, FUNCION- FINFUNCION ALIAS DE PROCESO-FINPROCESO CON VARIABLE, esta ultima requiere obligatoriamente retornar una salida, para asemejarse a una FUNCION MATEMATICA

    4.3 permitir retornar una variable tipo arreglo para una función

    4.4 Instrucción para salir de un bucle





    1: Para lograr el punto 1

    ResponderEliminar
    Respuestas
    1. Gracias por los comentarios... pero tengo algunos peros...

      1. justamente lo que no quiero es que alguien se ponga a hacer todo otra vez en java... La idea es que la parte importante siga siendo la misma. Por "la misma" entiéndase común a ambas plataformas (PC y smartphone en este caso), *exactamente el mismo código en el mismo lenguaje*, seguramente compilado diferente, pero nunca una reescritura de los mismos algoritmos y estructuras de datos en otro lenguaje.

      2. No me parece lógico basar esto en google translate... tendría que participar directamente algún docente que hable muy bien portugués, preferentemente alguien que imparta sus clases de programación en en portugués.

      3. PSeInt es justamente para un curso básico... no aspiro a cubrir todo porque no creo que tenga sentido, y ya comenté en otros posts que la orientación a objetos definitivamente queda afuera... quiero implementar lo de los registros, pero quiero dejar claro que eso no sería para acercar pseint a la orientación a objetos, para mi pasa por otro lado.

      4. de todas esas cosas ya respondí en los foros, algunas son discutibles, otras las comparto y también terminarán apareciendo en pseint.

      0. QB no usa prefijos segun tipos ¿?

      Eliminar
  2. Pablo:
    Muchas gracias por la mención.
    Lamentablemente no dispongo del tiempo necesario para mantener actualizado el fork con las buenas novedades de PseInt. Es una pena porque se han incorporado buenas herramientas.
    Sin embargo, en mis años de experiencia como docente de programacón, sigo utilizando la "rebel-edition" en mis clases por varios motivos:

    - La posibilidad de definir al proceso principal con "INICIO/FIN" en lugar de "Proceso sin_titulo/FinProceso", permite ahorrarme varias confusiones y explicaciones, que simplente entender que un algoritmo tiene un inicio y un fin.

    - La sintaxis "mas normal" para definir funciones: "Funcion nombre_de_funcion(arg1, argn)/FinFuncion" acarrea muchas menos confusiones y dolores de cabeza que "SubProceso variable_retorno<-nombre_de_funcion(arg1, argn)/FinSubProceso". Sobre todo a la hora de aplicar esta idea en otros lenguajes, no conozco ninguno que utilice esta "extraña" sintaxis. Faltaría incorporar la forma de definir los tipos de los argumentos

    - La posibilidad de definir Registros para mi es completamente imprescindible, aún en los cursos muy básicos. Además, aunque no consideres la idea de acercar pseint a la orientación a objetos, en particular en mis clases tomo los registros como "un puente" entre la programación estructurada y la ide de Objeto de la POO. Pero eso es independiente de PseInt y de cualquier teoría, es una herramienta personal que generalmente me funciona.

    - El resto de las herramientas, aunque en menor medida, son realmente útiles, como la posibilidad de definir tipos, la de "importar" archivos con funciones o la de manipular archivos. Tal vez tarde o temprano PseInt debería pensar en tenerlas, pero primero lo primero.

    Vuelvo a mencionarte mi voluntad de ayudar a incorporar funcionalidades a PseInt.

    Tanto la idea de una versión Android como "la Portuguesa" en mi opinón no son imprescindibles para el objetivo central de Pseint, que es la enseñanza de la programación en castellano, sobre todo con las funcionalidades que aún faltan. Creo que no merecen "gastar" nuestro tiempo ni si quiera en un post del blog. Tal vez deberíamos gastarlo en pensar en cómo encarar una forma de trabajo "colabrativa" de desarrollo de PseInt (a la Linux tal vez).

    Aparte una "crítica constructiva": Nunca me quedó claro por qué tanto tiempo y cuidado para "pensar muy bien" cómo meter la sintaxis de los registros en el lenguaje, cuando la sintaxis con la que se incorporaron las funciones es tan "confusa" (al menos debes reconocer que es muy extraña). Es mi opinión, por supuesto.

    Saludos, felicitaciones y muchas gracias por esta gran herramienta!

    ResponderEliminar
    Respuestas
    1. Hola, que bueno que sigas en contacto...

      - Lo de "inicio" y "fin" ni lo había visto, eso lo puedo agregar sin problemas, de hecho pensaba hacer opcionales (según perfil) al Proceso y FinProceso, sobre todo cuando no hay subprocesos.
      - Lo de usar "funcion" de lugar de "subproceso" es algo que ya se puede, está casi desde el principio.... usé por defecto "subprocesos" por la inercia de haber usado "proceso" por años, pero en pseint las dos palabras funcionan...
      Estas 2 cosas las podría tener listas para la próxima.

      - Otros detalles de la sintaxis del prototipo sí hay que pulirlos, pero qué es claro y qué no varía mucho según en qué lenguaje real se está inspirando cada uno... es tema abierto a la discusión. Lo de ponerle otro nombre a la variable de retorno y escribirla como tu ejemplo también podría ser opcional para la próxima.

      - Lo de los registros es algo que definitivamente quiero, más allá del uso que después le de cada uno. Pero, como ya sabrás de primera mano, requiere un trabajo importante. De la sintaxis de registros no me gustaba lo de basarse en funciones, pero las siguientes propuestas creo que van muy bien. Existe una pequeña posibilidad de que mi tiempo dedicado a PSeInt se incremente bastante en un futuro cercano, y ese sería uno de los primeros objetivos en ese caso.

      Como siempre se agradecen tus comentarios, y más cuando te animaste a probar tus propuestas.

      Eliminar
  3. Pablo: gracias por tu respuesta.
    No sé si quedó clara la diferencia de sintaxis de las funciones. No hablaba de la palabra "Funcion" vs "SubProceso" (ya sé que ambas son válidas en PseInt, aunque "SubProceso" vapor defecto) sino de la forma completa de definir una función (o un subproceso/subprograma/subrutina que retorna un resultado). Por ejemplo:

    - En PseInt-Rebel es así (aún me faltaría poder definir el tipo de los argumentos):

    Funcion Sumar(a, b) como Entero
    Retornar a + b
    FinFuncion

    - En PseInt-Original:

    Funcion variable_retorno <- Sumar(a, b)
    Definir variable_retorno como Entero
    variable_retorno <- a + b
    FinFuncion

    - En C (y derivados):

    int Sumar(int a, int b) {
    return a + b;
    }

    - En Basic (¿la más parecida a PseInt tal vez?):

    Function Sumar(ByVal a As Integer, ByVal b As Integer) As Integer
    Return a + b
    End Function

    - En Pascal (la alternativa de usar el nombre de la función como "variable de retorno", que también es válida en Basic):

    Function Sumar(a:Integer; b:Integer) : Integer;
    Begin
    Sumar := a + b;
    End;

    - En Python (que es casi un "pseudocódigo" en inglés):

    def Sumar(a, b):
    return a + b

    Nunca me quedó claro de dónde surge la idea de "variable de retorno"

    En cuanto a los registros, la sintaxis que hoy funciona en PseInt-Rebel es esta (es completamente discutible, no soporta "multilinea" y aún no hace la validación de tipos de campos):

    Registro nombre_de_registro { campo1 como Caracter, campo2 como Entero }
    nombre_de_registro.campo1 <- 'Hola mundo'
    nombre_de_registro.campo2 <- 25

    Es cierto que la forma interna de implementarlo es usando funciones, que es la solución que encontré en su momento.

    Una opinión muy personal, porque conozco un poco el código, creo que tal vez deberías plantearte una reescritura del interprete (pseint) para simplificarlo, con POO, para facilitar la incorporación de nuevas estructuras.

    Saludos!!

    ResponderEliminar
    Respuestas
    1. Ok con lo de las funciones, me confundí yo. Respecto a lo de los registros, lo primero era que las funciones no se vean, y eso ya lo tenés. Y de reescribir, siempre lo dije, hace falta, hay código que lleva 10 años, pero si me pongo a rehacerlo bien de cero van a pasar 3 años sin mejoras hasta que vuelva a tener lo mismo... lo iré haciendo de a poco y localmente, aunque lleve más tiempo por lo menos no corta el avance del proyecto.

      Eliminar
  4. Con respecto a la primera, una versión para android, algún IDE que maneje C++ para crear aplicaciones en Android.

    ResponderEliminar
  5. Con respecto a la segunda de pasar las palabras claves al portugués:
    Nunca estuve muy de acuerdo con pasar las palabras claves a otro idioma, porque la idea es programar en nuestro idioma, el español, con UNA HERRAMENTA DIDÁCTICA QUE AUXILIE AL ESTUDIANTE y le haga la vida más fácil y no en otro idioma que no sea el nuestro y más teniendo en cuenta que las carreras de técnicos en informática no tiene nada que ver ni con el portugués ni con Brasil.
    Pero para dejar contentos a los que quieren PSeInt en portugués, por ejemplo, es que sugiero una sintaxis, o mejor una "mega sintaxis" que se configure desde Configurar -> Opciones de Lenguaje (perfiles) una opción se me ocurre "Usar todos los perfiles en portugués" con un option button debajo del botón Personalizar… .
    Así el usuario tiene la posibilidad de programar tanto en un pseudocódigo tanto en español como en portugués, así no se pierden las palabras en español. Insisto en NO PERDER EL PSEUDOCÓDIGO EN ESPAÑOL.
    Con respecto a la traducción al portugués:
    En sourceforge hay un proyecto de pseudocódigo en portugués llamado VISUALG 3.0 (https://sourceforge.net/projects/visualg30/) que maneja pseudocódigo en portugués pues lo hizo alguien de Brasil. La idea sería que estudies la sintaxis, la analices, veas como es y a partir de ahí entiendas como traducir las palabras claves, de última como ejemplo las traduzco yo en base a los ejemplos de exportación y te las mando. En eso no te hagás problema.

    ResponderEliminar
    Respuestas
    1. Claro que para nosotros el pseudocódigo va a seguir en español. Las consultas por otro idioma vienen de parte de gente que tiene ese otro idioma por lengua materna. Es decir, lo ideal es que cada uno use un pseudocódigo en "su" idioma. Entonces, ofrecer una alternativa en portugués (no un reemplazo, una alternativa), por ejemplo, permitiría extender el uso de pseint a escuelas y universidades de brasil. Pero no sería para los que hablamos español, de ninguna manera la idea sería perder el pseudocódigo en español.

      Eliminar
    2. Vicha tu correo que te puse los ejemplos traducidos al portugués.

      Eliminar
  6. Mira este video en YouTube https://www.youtube.com/watch?v=-2G-qBnMlyM para programar en C++ en Andrid

    ResponderEliminar
  7. Hola, acabo de publicar una versión similar pero para Android (aún le faltan muchas cosas).
    https://play.google.com/store/apps/details?id=pe.diegoveloper.pseudocode

    ResponderEliminar
  8. Como va 1ero te quería felicitar por el programa,la verdad a mis alumnos les gusto mucho (secundaria electrónica).
    Por otro lado estoy tratando de compilar el git de pseint pero tengo este error:
    make[2]: se entra en el directorio '/home/vibrion/Downloads/pseint-code/wxPSeInt'
    mkdir -p ../temp/wx_lnx_rls
    g++ -O2 -DFOR_WXPSEINT `wx-config --cppflags --unicode=no --version=2.8` -c DebugManager.cpp -o ../temp/wx_lnx_rls/DebugManager.o

    Warning: No config found to match: /usr/lib64/wx/config/gtk2-unicode-release-2.8 --cppflags --unicode=no --version=2.8
    in /usr/lib64/wx/config
    If you require this configuration, please install the desired
    library build. If this is part of an automated configuration
    test and no other errors occur, you may safely ignore it.
    You may use wx-config --list to see all configs available in
    the default prefix.

    In file included from DebugManager.cpp:1:0:
    DebugManager.h:3:23: error fatal: wx/string.h: No existe el fichero o el directorio
    #include
    ^
    compilación terminada.
    make[2]: *** [Makefile.common:4: ../temp/wx_lnx_rls/DebugManager.o] Error 1
    make[2]: se sale del directorio '/home/vibrion/Downloads/pseint-code/wxPSeInt'
    make[1]: *** [Makefile.lnx:5: all] Error 2
    make[1]: se sale del directorio '/home/vibrion/Downloads/pseint-code'
    make: *** [Makefile:10: linux] Error 2

    Mi distro es sabayon (deja supuestamente seleccionar entre wx3 y 2.8) pero no hay caso, incluso haciendo symlink del include del 2.8 tira error pero en setup.h (no existe en los include)

    ResponderEliminar