La Historia Del Pseint

  • Uploaded by: Luis Enrique MP
  • 0
  • 0
  • February 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View La Historia Del Pseint as PDF for free.

More details

  • Words: 3,926
  • Pages: 13
Loading documents preview...
La historia del PSeInt Origen y motivación En la Facultad de Ingeniería y Ciencias Hídricas de la Universidad Nacional del Litoral(UNL), se desarrolla la carrera de Ingeniería Informática desde el año 1999. La asignatura Fundamentos de Programación del primer cuatrimestre plantea como contenidos un laboratorio de lenguaje ANSI/ISO C++ para desarrollar los conceptos básicos de algorítmica computacional y programación. Esta materia se complementa con Programación Orientada a Objetos del segundo cuatrimestre. La experiencia recogida luego de varios años de desarrollar la asignatura, los magros resultados de las primeras evaluaciones y la heterogeneidad de cada una de las sucesivas cohortes que ingresaban a la carrera, llevó a pensar en alternativas superadoras del proceso de aprendizaje. Más aún, considerando que en la asignatura se tratan contenidos claves dentro de la disciplina que da sustento a la carrera. Teniendo en cuenta que el uso de lenguaje ANSI/ISO C++ para una materia inicial de la programación presenta notorias dificultades para estudiantes inexpertos que deben aprender varios conceptos relativos al diseño de algoritmos y paralelamente lidiar con cuestiones de implementación de las soluciones propuestas relativas a un lenguaje de programación: sintaxis, compilación, mensajes de errores en inglés, depuración, etc., se propuso la siguiente solución: diseñar un pseudocódigo en español, con reglas sintácticas sencillas y básicas, que permitiera concentrar al alumno en la lógica para la resolución de problemas mediante el diseño y la construcción de algoritmos y facilitara el aprendizaje y uso posterior de un lenguaje de alto nivel. Si bien la utilización del pseudocódigo en el pizarrón a la hora de enseñar los conceptos básicos produjo una avance significativo, existen aún muchos otros factores que afectan el desempeño de los estudiantes y el desarrollo de la asignatura. Partiendo de el hecho de que un problema generalmente puede ser resuelto correctamente de muchas formas distintas y teniendo en cuenta el elevado número de alumnos por comisión y la heterogeneidad de conocimientos de los mismos, se hace imposible en la práctica el seguimiento de todas las soluciones planteadas individualmente por cada alumno. De estas observaciones surge la motivación original de este desarrollo. Primeros Pasos Durante el cursado de la asignatura Fundamentos de Programación pude observar las enormes dificultades que tenían muchos de mis compañeros para desarrollar la solución a un problema en forma de algoritmo computacional. Los que teniamos alguna formación básica al respecto (yo programaba en Basic antes de ingresar a la Universidad ;) simplemente debiamos asociar lo que ya conociamos a las estructuras propuestas por la cátedra por lo que dicha asignatura resultaba relativamente simple. Sin embargo, muchos estudiantes que no tenian base alguna demostraban grandes dificultades para entender la lógica subyacente en las estructuras de datos y de control, lo cual llamó poderosamente mi

atención y, junto con la necesidad de presentar un proyecto final de software para aprobar la asignatura Programación I(ahora Programación Orientada a Objetos) motivó originalmente este proyecto. El software comenzó a desarrollarse en octubre de 2003 utilizando Borland C++ Builder debido a que era esta la herramienta que recomendaba la cátedra (por la facilidad que brinda para el desarrollo de interfaces visuales) y estar presente en los laboratorios de la facultad. Comencé con una prueba de concepto, ya que era el primer proyecto que iba a desarrollar con C++. A esta inexperiencia con el lenguaje le atribuyo algunos errores de diseño y muchas desprolijidades o ineficiencias en la implementación que con el tiempo fuí notando y, cuando se podía, corrigiendo. Al ser este un software para uso exclusivamente didáctico, no se presentan grandes problemas de rendimiento (no se tiene que interpretar algoritmos de miles de lineas sumamente complejos) por los que puedo tomarme ciertas libertades en la implementación. Más aún, se debe tener en cuenta que el objetivo principal del intérprete no es sólo interpretar un buen código, sino también señalar correctamente los errores de uno incorrecto. La versión original, presentado el 29 de diciembre del mismo año, tenía cientos de errores latentes, sólo corría bajo Windows y se limitaba a interpretar el algoritmo o marcar sus errores de sintaxis. El pseudocódigo interpretable era estrictamente el que desarrollaban los apuntes de la asignatura escritos por el Ingeniero Horacio Loyarte y el Doctor Diego Milone. Sugerí en el cuatrimestre siguiente a los responsables de la cátedra ofrecer el software a sus futuros alumnos, pero no obtuve (al menos de parte de los alumnos) la respuesta esperada, por lo que el proyecto pareció terminar allí. El Resurgimiento Casi dos años más tarde, gracias a la lista de correo del Grupo de Usuarios de Linux del Litoral(Lugli) llegó a mi la invitación a participar en la recopilación de software libre educativo para el CD Actividades Educativas con Software Libre de la colección ??? que se distribuiría gratuitamente entre los docentes que lo solicitaran promocionado por el Ministerio de Educación de la Nación y llevado a cabo por los grupos gleducar, solar y educ.ar. Sugerí entonces a travez de una lista de correo creada para tal recopilación la inclusión del PSeInt en dicho CD. Por fortuna y azar, uno de los mayores responsables de la recopilación, el profesor Román Gelbort, resultó ser profesor de programación en un colegio secundario, lo que generó gran entusiasmo y me motivó a retomar el desarrollo. Uno de los primeros pasos fué crear el proyecto en SourceForge y publicar así el software bajo la Licencia Pública General (GPL). El siguiente paso fue comenzar a portarlo al sistema operativo GNU/Linux. El intérprete propiamente dicho estaba escrito mayormente en ANSI/ISO C++ por lo que no presentó mayores dificultades, pero la interfaz gráfica debió desarrollarse desde cero, eligiendose para tal fin la librería GTK+ por estar esta presente en la mayoría de las distribuciones de Linux y tener yo alguna experiencia en la utilización de la misma. Finalmente, el día de la presentación del CD, viajé con algunos de los responsables del mismo a Buenos Aires, y conocí personalmente a Patricia Chechele, una de las testers oficiales de la recopilación y profesora de informática, quien además de demostrar gran simpatía por el intérprete, más tarde aportaría numerosos reportes de bugs y sugerencias de gran utilidad. Luego de esto, sobrevino una etapa de corrección de errores sin grandes avances, hasta

que en mayo de 2006 comencé a desempeñarme como ayudante de cátedra de Fundamentos de Programación y Programación Orientada a Objetos en la UNL, comenzando primero como pasante, y luego, en agosto del mismo año, asumiendo el cargo interino luego de concursar por el mismo. Esta posición me permitió observar a los alumnos utilizando el software, encontrar y corregir errores, y realizar ciertas observaciones que derivaron en la implementación de las características de Ayuda Rápida y Diagrama de Flujo. También en este año, presentamos junto con el Ingeniero Horacio Loyarte el trabajo Desarrollo de un Intérprete de Pseudocódigo para la Enseñanza de Algorítmica Computacional en el I Congreso de Tecnologia en Educación y Educación en Tecnología en La Plata. Allí recibí también algunas sugerencias que llevaron a la incorporación del Menu de Comandos. Finalmente, en octubre de 2006, presenté el trabajo Desarrollo de un Software Intérprete de Pseudocódigo para la Enseñanza de Fundamentos de Programación en el 1er Encuentro de Jovenes Investigadores de Universidades de Santa Fe. Presente y Futuro Algunas gratas sorpresas, como los comentarios recibidos de los usuarios, la mención del software en la revista española PC World o la inclusión en otras recopilaciones como cdlibre.org o uptodown.com, muestran como este pequeño y modesto proyecto, en gran parte gracias a su caracter libre, fue difundiéndose en diversos ámbitos y ganando lentamente popularidad como confirman las estadísticas de descargas o visitas al sitio, lo cual genera una provechosa retroalimentación que conduce al mejoramiento del paquete, el cual lejos aún de ser perfecto, presenta ya un funcionamiento más acabado. Actualmente, estoy a la espera de nuevas sugerencias y a la espectativa de nuevas ideas para continuar mejorando el software.

Ultima actualización: 24/10/2006 ¿Para que sirve PSeInt?

PSeInt está pensado para asistir a los estudiantes que se inician en la construcción de programas o algoritmos computacionales. El pseudocódigo se suele utilizar como primer contacto para introducir conceptos básicos como el uso de estructuras de control, expresiones, variables, etc, sin tener que lidiar con las particularidades de la sintaxis de un lenguaje real. Este software pretende facilitarle al principiante la tarea de escribir algoritmos en este pseudolenguaje presentando un conjunto de ayudas y asistencias, y brindarle ademas algunas herramientas adicionales que le ayuden a encontrar errores y comprender la lógica de los algoritmos.

Caracteristicas y Funcionalidades de PSeInt:



Presenta herramientas de edición básicas para escribir algoritmos en pseudocodigo en español



Permite la edición simultánea de múltiple algoritmos



Presenta ayudas para la escritura o Autocompletado o Ayudas Emergentes o Plantillas de Comandos o Coloreado de Sintaxis o Indentado Inteligente



Puede ejecutar los algoritmos escritos



Permite ejecutar el algoritmo paso a paso controlando la velocidad e inspeccionando expresiones



Puede confeccionar automáticamente la tabla de prueba de escritorio



Determina y marca los errores de sintaxis y en tiempo de ejecucion



Genera diagramas de flujo a partir del algoritmo escrito



Convierte el algoritmo de pseudocodigo a codigo C++



Ofrese un sistema de ayuda integrado acerca del pseudocódigo y el uso del programa (esta última, aún en construcción)



Incluye un conjunto de ejemplos de diferentes niveles de dificultad



Es multiplataforma (probado en Microsoft Windows y GNU/Linux)



Es totalmente libre y gratuito (licencia GPL)

El Pseudo-código

Las características del este pseudolenguaje fueron propuestas en 2001 por el responsable de la asignatura Fundamentos de Programación (Horacio Loyarte) de la carrera de Ingeniería Informática de la FICH-UNL. Las premisas son:  Sintaxis sencilla  Manejo de las estructuras básicas de control  Solo 3 tipos de datos básicos: numérico, caracter /cadenas de caracteres y lógico (verdadero-falso).  Estructuras de datos: arreglos Todo algoritmo en pseudocógido tiene la siguiente estructura general: Proceso SinTitulo accion 1; accion 1; . . . accion n; FinProceso

Comienza con la palabra clave Proceso seguida del nombre del programa, luego le sigue una secuencia de instrucciones y finaliza con la palabra FinProceso. Una secuencia de instrucciones es una lista de una o más instrucciones, cada una terminada en punto y coma. Las acciones incluyen operaciones de entrada y salida, asignaciones de variables, condicionales si-entonces o de selección múltiple y/o lazos mientras, repetir o para. Asignación

La instrucción de asignación permite almacenar una valor en una variable. <- <expresión> ;

Al ejecutarse la asignación, primero se evalúa la expresión de la derecha y luego se asigna el resultado a la variable de la izquierda. El tipo de la variable y el de la expresión deben coincidir. Entradas

La instrucción Leer permite ingresar información desde el ambiente. Leer , , ... , ;

Esta instrucción lee N valores desde el ambiente (en este caso el teclado) y los asigna a las N variables mencionadas. Pueden incluirse una o más variables, por lo tanto el comando leerá uno o más valores. Salidas

La instrucción Escribir permite mostrar valores al ambiente. Escribir <exprl> , <expr2> , ... , <exprN> ;

Esta instrucción imprime al ambiente (en este caso en la pantalla) los valores obtenidos de evaluar N expresiones. Dado que puede incluir una o más expresiones, mostrará uno o más valores. Dimensionamiento La instrucción Dimension permite definir un arreglo, indicando sus dimensiones. Dimesion (<maxl>,...,<maxN>);

Esta instrucción define un arreglo con el nombre indicado en y N dimensiones. Los N parámetros indican la cantidad de dimensiones y el valor máximo de cada una de ellas. La cantidad de dimensiones puede ser una o más, y la máxima cantidad de elementos debe ser una expresión numérica positiva. Se pueden definir más de un arreglo en una misma instrucción, separándolos con una coma (,). Dimension (<max11>,...,<max1N>),..., (<maxM1>,...,<maxMN>)

Es importante notar que es necesario definir un arreglo antes de utilizarlo. Condicional Si-Entonces

La secuencia de instrucciones ejecutadas por la instrucción Si-Entonces-Sino depende del valor de una condición lógica. Si Entonces Sino FinSi

Al ejecutarse esta instrucción, se evalúa la condición y se ejecutan las instrucciones que correspondan: las instrucciones que le siguen al Entonces si la condición es verdadera, o las instrucciones que le siguen al Sino si la condición es falsa. La condición debe ser una expresión lógica, que al ser evaluada retorna Verdadero o Falso. La cláusula Entonces debe aparecer siempre, pero la cláusla Sino puede no estar. En ese caso, si la condición es falsa no se ejecuta ninguna instrucción y la ejecución del programa continúa con la instrucción siguiente. Selección Multiple

La secuencia de instrucciones ejecutada por una instrucción Segun depende del valor de una variable numérica. Segun Hacer : ,: <...> De Otro Modo: FinSegun

Esta instrucción permite ejecutar opcionalmente varias acciones posibles, dependiendo del valor almacenado en una variable de tipo numérico. Al ejecutarse, se evalúa el contenido de la variable y se ejecuta la secuencia de instrucciones asociada con dicho valor.

Cada opción está formada por uno o más números separados por comas, dos puntos y una secuencia de instrucciones. Si una opción incluye varios números, la secuencia de instrucciones asociada se debe ejecutar cuando el valor de la variable es uno de esos números. Opcionalmente, se puede agregar una opción final, denominada De Otro Modo, cuya secuencia de instrucciones asociada se ejecutará sólo si el valor almacenado en la variable no coincide con ninguna de las opciones anteriores. Lazos Mientras

La instrucción Mientras ejecuta una secuencia de instrucciones mientras una condición sea verdadera. Mientras Hacer FinMientras

Al ejecutarse esta instrucción, la condición es evaluada. Si la condición resulta verdadera, se ejecuta una vez la secuencia de instrucciones que forman el cuerpo del ciclo. Al finalizar la ejecución del cuerpo del ciclo se vuelve a evaluar la condición y, si es verdadera, la ejecución se repite. Estos pasos se repiten mientras la condición sea verdadera. Note que las instrucciones del cuerpo del ciclo pueden no ejecutarse nunca, si al evaluar por primera vez la condición resulta ser falsa. Si la condición siempre es verdadera, al ejecutar esta instrucción se produce un ciclo infinito. A fin de evitarlo, las instrucciones del cuerpo del ciclo deben contener alguna instrucción que modifique la o las variables involucradas en la condición, de modo que ésta sea falsificada en algún momento y así finalice la ejecución del ciclo. Lazos Repetir

La instrucción Repetir-Hasta Que ejecuta una secuencia de instrucciones hasta que la condición sea verdadera. Repetir Hasta Que

Al ejecutarse esta instrucción, la secuencia de instrucciones que forma el cuerpo del ciclo se ejecuta una vez y luego se evalúa la condición. Si la condición es falsa, el cuerpo del ciclo se ejecuta nuevamente y se vuelve a evaluar la condición. Esto se repite hasta que la condición sea verdadera. Note que, dado que la condición se evalúa al final, las instrucciones del cuerpo del ciclo serán ejecutadas al menos una vez. Además, a fin de evitar ciclos infinitos, el cuerpo del ciclo debe contener alguna instrucción que modifique la o las variables involucradas en la condición de modo que en algún momento la condición sea verdadera y se finalice la ejecución del ciclo.

Lazos Para

La instrucción Para ejecuta una secuencia de instrucciones un número determinado de veces. Para <- Hasta ( Con Paso <paso> ) Hacer

FinPara

Al ingresar al bloque, la variable recibe el valor y se ejecuta la secuencia de instrucciones que forma el cuerpo del ciclo. Luego se incrementa la variable en <paso> unidades y se evalúa si el valor almacenado en superó al

valor . Si esto es falso se repite hasta que supere a . Si se omite la cláusula Con Paso <paso>, la variable se incrementará en 1. Operadores y Funciones Este pseudolenguaje dispone de un conjunto básico de operadores y funciones que pueden ser utilizados para la construcción de expresiones más o menos complejas. Las siguientes tablas exhiben la totalidad de los operadores de este lenguaje reducido: Operador

Significado

Ejemplo

>

Mayor que

3>2

<

Menor que

'ABC'<'abc'

=

Igual que

4=3

<=

Menor o igual que

'a'<='b'

>=

Mayor o igual que

4>=5

&

Conjunción (y).

(7>4) & (2=1) //falso

|

Disyunción (o).

(1=1 | 2=1) //verdadero

~

Negación (no).

~(2<5) //falso

Relacionales

Logicos

Suma

Algebraicos *

Multiplicación

/

División

^

Potenciación

La jerarquíaa de los operadores matemáticos es igual a la del álgebra, aunque puede alterarse mediante el uso de paréntesis. A continuación se listan las funciones integradas disponibles: Función

Significado

RC(X)

Raíz Cuadrada de X

ABS(X)

Valor Absoluto de X

LN(X)

Logaritmo Natural de X

EXP(X)

Función Exponencial de X

SEN(X)

Seno de X

COS(X)

Coseno de X

ATAN(X)

Arcotangente de X

TRUNC(X)

Parte entera de X

REDON(X)

Entero más cercano a X

Algunas Observaciones  Se pueden introducir comentarios luego de una instrucción, o en líneas separadas, mediante el uso de la doble barra ( // ). Todo lo que precede a //, hasta el fin de la línea, no será tomado en cuenta al interpretar el algoritmo.  Note que no puede haber instrucciones fuera del programa, aunque si comentarios.  Las estructuras no secuenciales pueden anidarse. Es decir, pueden contener otras adentro, pero la estructura contenida debe comenzar y finalizar dentro de la contenedora.  Los identificadores, o nombres de variables, deben constar sólo de letras y números, comenzando siempre con una letra.  Las constantes de tipo carácter se escriben entre comillas ( " ).  En las constantes numéricas, el punto ( . ) es el separador decimal.  Las constantes lógicas son Verdadero y Falso. Ejemplos Explicados Página en construcción ;). Proximamente.

Subprocesos y el Futuro de PSeInt

Escribo estas aclaraciones debido a la gran cantidad de mensajes que recibí durante el último año preguntando acerca de la posibilidad de definir subprocesos/funciones en pseudocódigo. Paso a explicar a continuación algunas cuestiones históricas, prácticas y filosóficas relacionadas al futuro de este software y la posible inclusión de esta característica. En primer lugar hay que considerar el contexto en el cual nace este proyecto. Concebido inicialmente como un proyecto final de una materia del primer cuatrimestre de la carrera, presenta un diseño interno deficiente y poco flexible. En aquel momento, el objetivo era interpretar el pseudocódigo tal cual lo presentaban en mi carrera y nada más. Jamás pensé que llegaría a tener la cantidad y variedad de usuarios que tiene actualmente. Además, la falta de experiencia con el lenguaje de programación utilizado, el casi nulo conocimiento acerca de estructuras de datos dinámicas, y las muchas otras falencias en cuestiones algorítmicas más avanzadas, tambien condujeron a un diseño inicial pobre. Por esto resulta actualmente muy dificil agregar nuevas características y aún mantener las

existentes. Sería deseable que el parseo modelase un autómata de estados finitos, que las expresiones se representasen como árboles ordenados orientados, que la estructura del árbol se aprovechase para realizar una determinación de tipos más minuciosa, que al autómata resultara flexible frente a potenciales extensiones, etc, etc, etc. 6 años después, el código actual del intérprete me produce cierta vergüenza, y viendo que el proyecto sigue vivo, que el número de usuarios crece día a día, y que como programador creo haber alcanzado la maduréz y experiencia suficiente para reescribirlo correctamente, me propongo comenzar la tan postergada reestructuración interna. Por un buen período de tiempo, los cambios se irán introduciendo sin alterar las funcionalidades, por lo que el usuario final podrá no observar grandes diferencias. Sin embargo, quiero que la comunidad de usuarios docentes sepa que se está realizando un trabajo importante para que las futuras versiones estén a la altura de las circunstancias. Sin embargo, por ser éste un software libre desarrollado y mantenido sólo por el placer de programar y ver como la creación de pronto se torna útil para un número relativamente importante de personas e instituciones, no puedo dedicarle más que parte de mi tiempo de ocio, razón por la cual los avances se irán incorporando con cierta lentitud. Finalmente, volviendo al tema original, creo que el desarrollo de un software de estas características debe guiarse tanto por mis apreciaciones personales acerca de qué debe ser y qué no, como por la retroalimentación de la comunidad de usuarios. Algunas sugerencias recurrentes (como la inclusión del operador Mod, la definición explícita de tipos de variables, funcionalidades básicas de "depuración", etc.) han sido implementada de acuerdo a las posibilidades. Sin embargo, para poder desarrollar la característica más solicitada (subprocesos), debo primero llevar a cabo estas reestructuraciones que he mencionado. En conclusión, mi intención es desarrollar esta funcionalidad, y estoy lentamente trabajando para ello, pero antes deben aplicarse reformas de base, cambios mayores al diseño, que llevarán algo de tiempo y que será necesario probar y estabilizar previo al siguiente paso. Desde ya cuento con su paciencia y buena voluntad para saber entender y reportar de la mejor manera posible los errores que se produzcan en el camino, esperando completar esta tarea en el transcurso de 2009

Bosquejo de los pasos a seguir: 

Reescribir la evaluación de expresiones: Completado. El nuevo sistema arma un árbol implícitamente a travez de funciones recursivas, que se recorren en ambos sentidos para determinar correctamente los tipos de las variables y expresiones antes de realizar cualquier reemplazo. Esto mejora la interpretación y principalmente la detección de tipos. Con el nuevo esquema, es más fácil introducir nuevas operaciones (como la concatenación de candes con +) o funciones adicionales.



Reescribir el gestor de memoria: Completado. Debió realizarse casi al mismo tiempo que la evaluación de expresiones. Su interfaz es muy similar al sistema anterior, pero más efeciente y flexible internamente. Los tipos de variables se determinan por eliminación.



Reescribir el parseo de tokens del lenguaje: Esta parte del código, el análisis sintáctico, si bien no tiene un buen diseño, podría no ser de momento un gran problema a la hora de extender la funcionalidades para incorporar subprocesos. Sí lo es si se busca flexibilizar más el lenguaje, por ejemplo, permientiendo al docente elegir las palabras claves para cada acción.



Facilitar la personalización del lenguaje para cada docente (implementado, esperando respuestas de docentes): Se sacaron del menú de configuración todas las opciones referidas al lenguaje y se integraron en un cuadro de diálogo especial, donde el alumno puede simplemente elegir algo así como un "perfil" que configura todo de una sola vez. En este momento intento hacer un relevamiento acerca de cuales son las configuraciones que prefiere cada docente/institución. Sin dudas, la configuración por defecto, es la más flexible posible, para que el pseudocódigo incial tenga más de pseudo y menos de código, buscando no apartarse del fin original, ni enojar a Dijkstra.



Depuración: En este punto no tengo idea de cual será el camino a seguir. No quiero introducir la depuración como tal en un pseudocódigo (quiero evitar contaminar la interaz y parecerme tanto a un lenguaje real, si no usemos pascal y ya), sino mantener un nivel bien básico y sencillo como lo es la ejecución paso a paso automática con un mínimo de inspección, pero el manejo de ámbitos de valides de variables para el uso de subprocesos complica un poco las cosas... Por otro lado, una representación adecuada de la pila de llamadas podría ser súmamente útil en muchos casos (por ejemplo, para entender recursividad).



Documentación: La documentación debe crecer en todos los niveles: código fuente, ayuda del entorno, ayuda del lenguaje, tutoriales, ejemplos, etc. Tal vez se lleve a cabo en paralelo con las demás modificaciones.

Related Documents


More Documents from "Fernando Svetko"