lunes, 11 de abril de 2016

Novedades en PSeInt

Las últimas versiones de PSeInt tienen muchas novedades, que podríamos dividir en dos grupos. Por un lado hay mejoras en la interfaz; por el otro algunos cambios internos en el código. A los primeros, el usuario los puede ver y aprovechar, aunque no son cosas que hagan grandes diferencias, sino en su mayoría detalles. Los segundos, más interesantes a largo plazo, por ahora no generan ningún impacto que pueda percibir directamente el usuario final, pero me sirven a mí como desarrollador del proyecto para ir preparándole el camino a otros cambios mucho más grandes y visibles.

Voy a ir intercalando en el post capturas de las cosas que se ven. Pero lo cambios internos son los interesantes.

Ahora hay coloreado de sintaxis también en el diagrama, y una flecha de verdad para la asignación.

Veamos un ejemplo. Hasta hace pocas versiones, internamente el intérprete guardaba todas las instrucciones como strings en todo momento. Durante el análisis sintáctico, previo a la ejecución, se normalizaban los strings. Cambios como eliminar comentarios y espacios en blanco adicionales, pasar todo a mayúsculas, etc. Luego, la ejecución tenía que volver a analizar cada instrucción para saber qué hacer, pero esta segunda pasada era bastante más simple gracias a la normalización previa. Aún así, es trabajo repetido que se puede evitar. Y no solo para ganar en eficiencia (eso se nota poco), sino para simplificar el código, y evitar tener que implementar cada cambio o cada nueva instrucción dos veces.

Entonces asocié a cada instrucción un valor de un enum que indica de qué tipo es, de forma que el análisis sintáctico setee esa etiqueta para que luego la ejecución no tenga que volver a procesar el string. Más aún, en el camino, mientras hacía esa modificación, que implicó cambiar cientos de líneas, aproveché para pulir otros detallecitos relacionados al mismo código. Todas estas cosas son pequeños pasos rumbo a un rediseño que probablemente debería hacer de cero, pero por falta de tiempo lo haré de a poco (y tardaré más). El problema es que cada uno es una nueva fuente potencial de bugs.


 Ya se pueden hacer operaciones con varias entidades al mismo tiempo (selección múltiple)

En cualquier caso, son cosas que harán más simple el trabajo de agregar nuevas funcionalidades, como por ejemplo el manejo de registros. Se necesitan muchísimos de esos pasos para una implementación decente de esta funcionalidad. Pero varios ya se han dado, y otros están cerca. Tal vez en unos pocos meses pueda presentar una primera versión con soporte para registros.

Como este, hay otros cambios interesantes para hacer. Siempre, sin perder de vista que quiero un lenguaje simple y con fines 100% didácticos. Entonces debo aclarar que de todos los cientos de cambios que puedan imaginar, la definición de registros es la única cosa realmente nueva que sí me interesa. Además de eso, los otros cambios que tienen prioridad son los tendientes a perfeccionar o solucionar problemas de las funcionalidades ya presentes, como arreglos y funciones. Detalles como por ejemplo que los arreglos no se copian, y solo se pasan a funciones por referencia, obedecen más a las limitaciones de un lenguaje real o a una cuestión de implementación, que al verdadero sentido de un pseudocódigo.

Se pueden renombrar y definir variables con click derecho.

En fin, aunque no dispongo de mucho tiempo, en esta etapa sí dispongo de mucho entusiasmo como para trabajar en estas novedades. Así que tengo la esperanza de que 2016 sea un gran año para la evolución del intérprete. Veremos.

14 comentarios:

  1. Hola

    Al normalizar una línea de código, implica tiempo de ejecución extra, propongo esta idea

    Funciones de edición que realice una normalización básica al igual como lo hacen otros IDEs, normalización básica que se puede aprovechar para que cuando se ejecute las transformaciones internas de interpretación, estas sean menores, ganando velocidad de ejecución (microsegundos) pero en n líneas pueden significar n segundos.

    Por favor mirar en NOTEPAD++ v6.9.1 en español, en el menú EDITAR las funciones OPERACIONES DE LIMPIEZA


    1: QUITAR ESPACIOS AL FINAL o después de una línea de código, en el proceso de edición (copiar, pegar) involuntariamente se agregan caracteres de espacio que son invisibles, por esta razón también es importante otras funciones en PSEInt para hacer visibles símbolos especiales de edición, en NOTEPAD++ están en el menú VISTA, submenú MOSTRAR SIMBOLOS: Mostrar Carácter de Espacio, Mostrar Carácter de Tabulación, Mostar Carácter de salto de línea, Mostrar Carácter de ajuste de línea, etc.

    Mostrar Carácter de Espacio activo, durante el proceso de edición, permite manualmente ver, que espacios sobran, en especial los finales, por que otros, aunque sobren le dan legibilidad al código

    Unos editores (me incluyo) prefieren espacios extras en las sentencias como
    Algoritmo prueba_de_velocidad_de_ejecucion
    Dimensión a[ 20 ], d[ 2, 3 ];
    a[ 10 ] <- (3 + 5) / 2; d[ 1, 2 ] <- a[ 10 ];
    Escribir a[ 10 ], " " , -d[ 1, 2 ]*6;
    DIMENSIÓN A1[ 20 ], D2[ 1 ];
    Fin Algoritmo

    Y a otros editores no les agrada espacios extras
    Algoritmo prueba_de_velocidad_de_ejecucion
    Dimensión a[ 20],d[2,3];
    a[10]<-(3+5)/2; d[1,2]<-a[10];
    Escribir a[10]," ",-d[ 1, 2 ]*6;
    FinAlgoritmo


    Otra función importante puede ser como lo llama NOTEPAD++ ELIMINAR ESPACIOS SOBRANTES Ó INNECESARIOS
    Dimensión a[ 20 ], d[ 2, 3 ]; => Dimensión a[ 20],d[2,3];
    a[ 10 ] <- (3 + 5) / 2; d[ 1, 2 ] <- a[ 10 ]; => a[10]<-(3+5)/2; d[1,2]<-a[10];
    Escribir a[ 10 ], " " , -d[ 1, 2 ] * 6; => Escribir a[10]," ",-d[ 1, 2 ]*6;

    Para ganar un poco más de tiempo, si se convierte las tabulaciones a espacios, solo se requiere verificar un solo tipo de código ESPACIO (ASCII#39) y no (#9, 10, 12) NOTEPAD++ lo llama TABs a ESPACIO(s)

    Y para saber si hay ganancia de tiempo por favor mostrar en la salida el tiempo invertido

    *** Ejecución Iniciada. ***
    4 -24
    *** Ejecución Finalizada en 1.381516 segundos ***

    ResponderEliminar
  2. Sería una muy buena noticia que PSeInt soportara registros

    ResponderEliminar
  3. También estoy de acuerdo con la inclusion o soporte de registros, pero que opinas Alejandro de mi primer comentario

    Gracias

    ResponderEliminar
    Respuestas
    1. Lo de eliminar espacios son exquisiteces del programador. Se pueden incluir o no.

      Eliminar
  4. Saludos,
    La implementación de Registros (register en pascal) me parece genial, y desde hace tiempo lo esperaba. Ademas, con esta implementación se puede comenzar a pensar en la implmentación de FILE para maninpular archivos (secuenciales), lo que daría UNA COMPLETA SUPER UTILIDAD AL ENSEÑAR.

    Gracias por su Software.

    ResponderEliminar
  5. Hola, a partir de este año utilizo PSeInt para enseñar. Es un gran programa y una gran herramienta. Agradezco tu gran aporte.
    Algo que veo sería muy productivo de implementar sería la inicialización de los arreglos en una sola línea.

    Ejemplo: En vez de asignar los valores así:

    diaSemana[0] <- "Lunes"
    diaSemana[1] <- "Martes"
    diaSemana[2] <- "Miércoles"
    diaSemana[3] <- "Jueves"
    diaSemana[4] <- "Viernes"
    diaSemana[5] <- "Sábado"
    diaSemana[6] <- "Domingo"

    Que se pudiera hacer así de manera más práctica:

    diaSemana <- ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

    Esto se vuelve mucho más práctico a medida que el número de elementos es mayor. Igualmente, en el caso de matrices poder inicializar una matriz 3x3 en una línea. Ej:

    identidad <- [1,0,0; 0,1,0; 0,0,1]

    Si se pudiera estaría feliz de contribuir. Hace mucho no trabajo con c++ pero depronto una guía hacia cuáles funciones serian las claves para editar, y con gusto lo haría para contribuir al desarrollo de esta gran herramienta.

    Saludos

    ResponderEliminar
    Respuestas
    1. Hacer esto diaSemana <- ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"] sería crear una enumeración y no asignarles valores a un arreglo. Además la expresión diaSemana[0] <- "Lunes" no tiene sentido pues [0] no indica la posición sino la cantidad de espacio del arreglo.

      Eliminar
  6. +1

    Hay una versión paralela de PSEINT llamada PSEINT REBEL, que se desarrollo solo por 1 año, que inicio a agregar nuevas características al "lenguaje" de seudocodigo pero el autor abandono la idea =[

    https://sourceforge.net/projects/pseintrebel/?source=directory

    También es muy necesario implementar la definicion y declaración de arreglos en una sola linea como forma alternativa y como lo hace QBASIC64, es decir poder elegir el rango o intervalo de los elemntos

    DEFINIR VECTOR(1 HASTA 3) COMO REAL
    DEFINIR MATRIZ(1 HASTA 3, 1 HASTA 8) COMO REAL

    Ó

    DEFINIR VECTOR(0 HASTA 2) COMO REAL
    DEFINIR MATRIZ(0 HASTA 2, 0 HASTA 7) COMO REAL

    ¿Estan de acuerdo?

    ResponderEliminar
    Respuestas
    1. Sí, la verdad es muy práctico en una sola línea. Depronto lo preferiría siguiendo la misma sintaxis:

      Definir matriz[3,4] como Cadena

      Con seguridad que veremos todas estas mejoras implementadas poco a poco.
      Saludos!!

      Eliminar
  7. +1

    Hay una versión paralela de PSEINT llamada PSEINT REBEL, que se desarrollo solo por 1 año, que inicio a agregar nuevas características al "lenguaje" de seudocodigo pero el autor abandono la idea =[

    https://sourceforge.net/projects/pseintrebel/?source=directory

    También es muy necesario implementar la definicion y declaración de arreglos en una sola linea como forma alternativa y como lo hace QBASIC64, es decir poder elegir el rango o intervalo de los elemntos

    DEFINIR VECTOR(1 HASTA 3) COMO REAL
    DEFINIR MATRIZ(1 HASTA 3, 1 HASTA 8) COMO REAL

    Ó

    DEFINIR VECTOR(0 HASTA 2) COMO REAL
    DEFINIR MATRIZ(0 HASTA 2, 0 HASTA 7) COMO REAL

    ¿Estan de acuerdo?

    ResponderEliminar
  8. Hace mucho 2 años que no uso PSint :(
    Me gusto cuando lo maneje Felicidades a quien lo creo , hizo o hicieron un GRAN TRABAJO :D :D . Aunque me agradaria que fuese un poco mas parecido a un lenguaje de programacion :D :D por que asi los estudiantes pudieran hacer programas potentes con una sencilles al estilo BASIC pero en español :D
    y por eso me agradaria que hubieran las siguientes cosas:
    -> Poder hacer blibiotecas ya saben estilo C donde desde un programa principal pueda llamar a subrutinas o funciones dentro de otro archivo , creo que le daria un plus por que asi algunos programadores pudiera hacer bliotecas que ayuden a extender las capacidades de PSeint
    -> Manejo de fecha y hora ya saben funciones para saber dia , mes , año , hora , minuto , segundo.
    -> Manejo de listas ya saben lo que sigue de un vector :D
    -> Manejo basico de archivos :
    * Poder escribir en un archivo basicamente linea por linea.
    * Poder leer en un archivo igual linea por linea.
    -> Poder saber con una funcion si se presiono una tecla o no .
    -> limpiar pantalla con una funcion:
    * Limpiar pantalla de la ventana donde se esta ejecutando el codigo cuando yo lo hacia lo tenia que hacer un un para y escribir q se repetia como 20 veces :(
    * Ubicar en pantalla ya saben tipo gotoxy o locate.
    * Estaria bien que pudieran ligarlo a un compilador libre que con 1 solo boton se convirtiera el codigo a un lenguaje de programacion y luego se compile y ya tener un ejecutable , estarian bien con FREE PASCAL ya que es libre y multiplataforma :D pero yo no decido eso :(

    Se que solo soy un loco con sus ideas pero pienso que estas ideas aun que suenen un poco exageradas como estudiante que soy me hubiera gustado hacer todo eso en PSeint para poder aprender mejor y mas facil ya que creo que de eso se trata PSeint de ayudar a los estudiantes y personas que quieren programar a comprender , analizar y crear psuedocódigo de una forma sencilla y practica a tal modo que lo puedan aplicar a un lenguaje de programacion sin dificultad.

    Gracias por su atencion , sigan trabajando asi en PSeint un estudiante se los agradece :D :D

    ResponderEliminar
  9. Como veo te gustan las narraciones con historia, va la mía, la que incluye una pregunta para vos.
    Soy profesor de matemática, trabajo en un Profesorado de Educación Secundaria en Matemática, y suelo ocupar algunos algoritmos para abordar algunos conceptos, un poco porque me gustan (puro hobbie, nada más) y también porque veo positiva la relación entre la Ciencia y la lógica implicada al pensar y escribir los mismos. Bueno, anteriormente trabajé con DFD pero en el receso estuve leyendo algunos artículos sobre aplicaciones didácticas y encontré uno que hablaba de PseInt, lo descargué, probé, y me gustó; y aunque no soy experto en el tema, te felicito por tu trabajo.
    Pero, ahora me encuentro ante un problema particular, en el que me gustaría me ayudes, la cuestión es que estaba evaluando si un número es superimpar (también encontré el enunciado navegando) es decir, que todas sus cifras sean impar, y al escribir el algoritmo y probarlo me encuentro ante un error muy particular, que resumo con la siguiente captura de pantalla:

    https://goo.gl/N55X7Z

    Donde el resultado debería ser 0.2 y esta diferencia hace que el proceso falle. Ahora bien, como te comenté es particular, porque probando con otros valores no pasa.
    Bien, hasta acá llega mi saber y espero me ayudes en esto.
    Deseo tus proyectos progresen y sigas en pos de 10 años más.

    ResponderEliminar
  10. Disculpá, la imagen es: https://goo.gl/photos/1x8SoafLNGcSz1i98
    De antemano gracias por considerar el caso.
    Saludos.

    ResponderEliminar
    Respuestas
    1. No pude reproducir el problema. ¿Sigue pasando con la última versión? En caso afirmativo lo mejor sería iniciar un hilo en el foro de reporte de errores.

      Eliminar