Você está na página 1de 9

Algor: Un intrprete para la enseanza de algoritmos

Algor: An interpreter for the teaching of algorithms


Eduardo Alonso Prez, Jos Alvites Rodas

Resumen
En este trabajo se describen las principales ideas tomadas en cuenta para el desarrollo de un intrprete de algoritmos. Surge por la necesidad de investigar nuevas estrategias que ayuden a la enseanza de algoritmos en carreras de computacin. Con esta herramienta los estudiantes pueden comprender mejor el proceso de construccin y ejecucin de los algoritmos que desarrollan en clase. Se dise un pseudo lenguaje que utiliza palabras del lenguaje natural y una sintaxis simple y fcil de aprender. Se implementaron cada una de las etapas necesarias para la construccin de compiladores e intrpretes utilizando herramientas automticas para la generacin de analizadores lxicos y sintcticos. Con el intrprete desarrollado, los estudiantes de cursos bsicos de programacin pueden probar, paso a paso, los algoritmos escritos en pseudo cdigo, as como inspeccionar las variables que intervienen en los mismos. De esta manera el intrprete sirve como complemento en la enseanza de la programacin en su nivel ms bsico. Palabras clave: compilador, intrprete de algoritmos, pseudo cdigo, programacin.

Abstract.
In this paper it is described the main ideas in the development of an algorithm interpreter. It is a result of the searching of new strategies for the teaching of algorithms. With this tool, the students can have a better understanding of the process of building and executing algorithms. It was designed a pseudo language that use natural language words and an easy to learn syntax. It was implemented each of the phases needed to build a compiler or interpreter and was used code generator tools for the lexical and syntax analyzers. With this tool, students of basic programming curses can test, step by step, the algorithms written in pseudo code, and at the same time, they can inspect the variables contents. In this way, the interpreter its an important complement in the teaching of programming at the most basic level. Key words: compiler, algorithm interpreter, pseudo code, programming.

Universidad Catlica Santo Toribio de Mogrovejo, Ingeniera de Sistemas y Computacin ealonso@usat.edu.pe, josealvites@hotmail.com

Introduccin
La programacin constituye uno de los temas esenciales en cualquier carrera de Sistemas, Computacin Informtica. Es la base para un nmero significativo de cursos en los planes de estudio de stas especialidades. Su importancia requiere de una investigacin constante por parte de los docentes en la bsqueda de nuevas y mejores estrategias para su enseanza. Se estudia en los primeros semestres de las carreras y por lo general los docentes cuando comienzan con los cursos bsicos se enfrentan con algunas deficiencias esenciales en los estudiantes, entre los cuales podemos mencionar, el razonamiento, la abstraccin y la capacidad analtica. Dificultades que les impide poder realizar una de las actividades principales de la programacin que es la de describir de manera precisa los pasos para la solucin de un problema. La programacin es un proceso complejo y creativo que requiere de conocimientos, habilidades y actitudes. Es una disciplina muy difcil de dominar de llegar a ser un experto en ella. Muchos consideran que se requiere un talento especial, como todo un artista, para llegar a dominarla, como lo coment James Gosling, autor del lenguaje Java: la programacin de computadoras siempre es un arte , en una entrevista concedida a Bill Venners (2002) y mucho antes, de Knuth (1974) al comentar sobre uno de los libros ms famosos de la historia de la computacin The Art of Computing Programming. An as, todos los estudiantes de las carreras relacionadas con la computacin tienen que, en mayor o menor medida, adquirir esos conocimientos, habilidades y actitudes que le permitan construir programas de computadoras. La adquisicin de los conocimientos, en principios, est determinada por el docente quien debe lograr que los alumnos estudien los conceptos y fundamentos de la programacin. La experiencia del docente dictando este tipo de curso contribuye notablemente en el aprendizaje de estos conocimientos. Las habilidades en programacin slo se adquieren con mucha prctica. La nica manera de aprender a programar es programando, por tanto requiere desde un inicio la realizacin de muchos ejercicios y de una gran disposicin e inters del estudiante por resolverlos. Las actitudes estn relacionadas directamente con la disciplina en la programacin. Esta disciplina se adquiere igualmente con las enseanzas del profesor a travs de su ejemplo, as como el de otros buenos programadores. Aunque existen diversos criterios estrategias para la enseanza de la programacin, por lo general hay coincidencia en algunos aspectos relacionados con la secuencia de temas que se deben dictar. Es comn que se impartan cursos sobre: -Construccin de algoritmos -Tcnicas de programacin -Tipos de datos. (Estructura de datos) El primer aspecto provee a los futuros programadores un nivel bsico de enlace entre la lgica y las primeras etapas de la programacin. Se manejan los conceptos de algoritmos, datos y estructuras de control que son comunes a cualquier lenguaje de programacin. Una slida formacin en construccin de algoritmos es fundamental para el posterior aprendizaje de cualquier lenguaje de programacin. En este nivel bsico los algoritmos se presentan utilizando alguna tcnica de descripcin de algoritmos, como el pseudo cdigo los diagramas de flujo, lo cual significa que el alumno slo describe al algoritmo, mas no los ejecuta en la computadora. El segundo aspecto, las tcnicas de programacin, introducen al alumno a la fase de codificacin de los algoritmos en algn lenguaje de programacin de alto nivel, como el Pascal, C Java. Adems, y como su nombre lo indica, se debe profundizar en tcnicas concretas de programacin. Por lo general estos cursos se orientan a desarrollar

programas medianamente complejos utilizando la programacin estructurada u orientada a objetos como metodologas de programacin. Adems en estos cursos el estudiante se familiariza con algn ambiente de desarrollo integrado que le permite editar, compilar, ejecutar y depurar los programas. Generalmente se incluye en los planes de estudios un tercer tipo de curso, orientado a profundizar en el concepto de tipo de dato abstracto. Aqu el estudiante ya debe tener una slida formacin en programacin de manera que pueda definir nuevos tipos de datos utilizando un enfoque aplicativo de los mismos. Se estudian, por ejemplo, las listas y sus aplicaciones como las pilas, colas y deques. Los rboles, los conjuntos, diccionarios, grafos y otros. De cada tipo de datos se analiza adems variantes de implementacin y distintas aplicaciones. Con estos tres tipos de cursos que podramos clasificar en bsicos, intermedios y avanzados el estudiante queda preparado para desarrollar aplicaciones complejas en algn lenguaje de programacin. De la misma manera est en capacidad de asimilar nuevos lenguajes y paradigmas dado que ya tiene los conocimientos y habilidades necesarios para hacerlo. Cualquiera que sea el curso nivel que se dicte el docente debe estar en constante bsqueda de nuevas estrategias para lograr sus objetivos con los estudiantes. En este trabajo describimos una herramienta que contribuye a que la enseanza de la Construccin de Algoritmos pueda resultar ms eficaz. Como mencionamos anteriormente en estos cursos el estudiante construye algoritmos utilizando pseudo cdigo o diagramas sin llegar a probar verificar que efectivamente funcionen. Lo que proponemos es un intrprete que le permite al estudiante ejecutar paso a paso los algoritmos escritos en pseudo cdigo. De esta manera el estudiante puede comprender mejor la lgica de funcionamiento de las diferentes estructuras de control bsicas que se utilizan para construir programas. Se describen las caractersticas del lenguaje, algunos detalles de la implementacin y finalmente algunas experiencias relacionadas con el uso del intrprete.

El lenguaje
Cuando se habla de describir un algoritmo en pseudo cdigo, se refiere a una manera informal, sin rigor sintctico, en la que, usando palabras del lenguaje natural se describen los pasos para resolver cierto problema. El trmino informal es muy amplio, o sea, no se precisa hasta donde puede llegar la informalidad para describir el algoritmo. Lo importante es que los pasos del algoritmo queden bien claros en cuanto a la informacin que maneja y qu hace con esa informacin. Por lo general, y lo ms conveniente cuando se utiliza el pseudo cdigo para describir algoritmos, es tratar de formalizar el pseudo lenguaje que se utilice. De esta manera el estudiante, an utilizando palabras del lenguaje natural y una sintaxis y semntica fcil de aprender, debe seguir ciertos convenios al escribir un algoritmo permitiendo que stos queden de una manera ms precisa e incluso ms cercana a un lenguaje de programacin verdadero. Como nuestro trabajo consiste en la implementacin de un intrprete de algoritmos, fue necesario formalizar el pseudo lenguaje, con lo cual ya deja de ser pseudo para convertirse en un lenguaje de programacin, con una sintaxis y semntica bien precisa, sin alejarse del propsito fundamental del pseudo cdigo que es el de permitir describir algoritmos de una manera simple y natural.

Nos hemos basado en el lenguaje descrito por Luis Joyanes (2003). Si bien la mayora de las estructuras de control son similares hemos realizado algunas modificaciones e igualmente omisiones del lenguaje original. Dado que el objetivo no es crear un nuevo lenguaje de programacin, el mismo tiene muchas limitaciones, en comparacin a otros lenguajes. Recordemos que el objetivo es disponer de una herramienta para probar algoritmos sencillos. Las caractersticas principales del lenguaje son: utilizacin de tipos de datos simples: enteros, reales, cadenas y lgicos, as como arreglos de una o ms dimensiones de los tipos de datos simples. Uso de las estructuras de control: entrada, salida, asignacin, condicional simple, condicional completa, mientras, repetir-hasta y para. Las expresiones permiten los operadores aritmticos de suma, resta, multiplicacin, divisin, divisin entera, resto de la divisin entera, potencia, y negativo. Los operadores relacionales, mayor, menor, mayor o igual, menor o igual, igual y diferente. Y los operadores lgicos de disyuncin, conjuncin y negacin. Se permite adems la definicin de funciones. El intrprete desarrollado permite la ejecucin de los algoritmos en dos modos. Modo normal en el que el algoritmo se ejecuta completamente desde el inicio hasta el final. Y el modo paso a paso, en el que se va mostrando cada instruccin que se va a ejecutar y el contenido de las variables del algoritmo. Ha sido programado bajo el entorno del C++ Builder utilizando las herramientas de construccin automtica de compiladores el FLEX y BISON.

Breve descripcin del lenguaje Los algoritmos, en este lenguaje, tienen tres secciones: Encabezamiento Definicin de funciones Variables Instrucciones Seccin de Encabezamiento El encabezamiento, es opcional y es la palabra algoritmo seguido de un nombre.
Seccin de definicin de funciones En esta seccin se pueden definir funciones. Las funciones en el lenguaje slo pueden retornar tipos de datos simples, ms no arreglos. Los parmetros son opcionales. Se declaran cada uno individualmente. Los tipos de datos para los parmetros slo pueden ser simples. En la versin actual no se permite pasar arreglos como parmetros. El paso de parmetros es siempre por valor. Las variables que se declaren en la funcin son locales a la misma. Su alcance es slo para la funcin y no interfieren con otras variables, posiblemente con igual nombre, que estn definidas en otras funciones o en el programa principal. En la versin actual slo se permite llamar a funciones definidas anteriormente. No permitindose as llamadas recursivas. Seccin de Variables Las variables que se usan en un algoritmo deben ser declaradas, lo cual significa, que se les deber especificar el tipo que tendrn. En un principio habamos considerado no incluir esta seccin en el lenguaje y trabajar con tipos dinmicos, o sea, que las variables tomasen el tipo durante la ejecucin y de acuerdo al tipo de las expresiones que se le asignasen, pero finalmente decidimos incorporarlo, adems de razones tcnicas de implementacin, porque consideramos conveniente que los estudiantes se vayan familiarizando con el concepto de tipo de los lenguajes de programacin. Los tipos permitidos en la versin actual son simples: entero, real, cadena y lgico. Para cada tipo de dato se pueden escribir constantes para ser usadas en las expresiones.

Adicionalmente se pueden declarar arreglos de una o ms dimensiones de cualquiera de los tipos de datos simples. Seccin de Instrucciones Esta seccin contiene las instrucciones ejecutables del algoritmo. Comienza con la palabra inicio, le siguen las instrucciones y termina con la palabra fin. Las instrucciones permitidas son las siguientes: Entrada Salida Asignacin Condicional Simple Condicional Completa Mientras Repetir-Hasta Para o Instruccin de Entrada Permite que el algoritmo lea datos ingresados por el usuario. Su sintaxis es la palabra leer seguida de una o ms variables separadas por coma. o Instruccin de Salida Permite que el algoritmo imprima valores en la pantalla. Su sintaxis es la palabra imprimir imprimirln seguida de una o ms expresiones. Las expresiones pueden ser de cualquier tipo, incluso lgicas, en cuyo caso se imprimir la palabra true false de acuerdo al resultado. o Instruccin de asignacin Permite asignarle a una variable el resultado de una expresin. Su sintaxis es la variable seguida de <- seguida de la expresin. El lenguaje tiene implementada reglas semnticas para la conversin implcita de tipos. Las expresiones se escriben de la forma usual, utilizando la notacin infija, y como todo lenguaje hay una tabla de precedencia y asociatividad de los operadores. o Instruccin Condicional Simple Permite ejecutar un conjunto de instrucciones si se cumple una condicin. Su sintaxis es: si condicion entonces instrucciones a ejecutar si se cumple la condicin finsi o Instruccin Condicional Completa Permite ejecutar un conjunto de instrucciones si se cumple una condicin, u otro conjunto de instrucciones sino se cumple. Su sintaxis es: si condicion entonces instrucciones a ejecutar si se cumple la condicin sino instrucciones a ejecutar si NO se cumple la condicin finsi o Instruccin repetitiva tipo Mientras Permite ejecutar repetidamente, mientras se cumpla una condicin, un conjunto de instrucciones. Su sintaxis es: mientras condicion hacer instrucciones a repetir mientras se cumpla la condicin

finmientras o Instruccin repetitiva tipo Repetir-Hasta Permite ejecutar repetidamente un conjunto de instrucciones, hasta que se cumpla una condicin. Su sintaxis es: repetir instrucciones a repetir hasta que se cumpla la condicin hasta condicion o Instruccin repetitiva tipo Para Permite ejecutar repetidamente un conjunto de instrucciones un nmero determinado de veces. Su sintaxis es: para variable <- valorinicial hasta valorfinal hacer instrucciones a repetir finpara La variable debe ser numrica (entera o real), al igual que las expresiones correspondientes a valorincial y valorfinal. La instruccin incrementa en 1 la variable al terminar de ejecutar las instrucciones y antes de comparar con el valor final. La expresin correspondiente a valorfinal se evala en cada iteracin. o Instruccin repetitiva tipo Para con Paso Permite ejecutar repetidamente un conjunto de instrucciones un nmero determinado de veces, con la particularidad de que la variable de control se incrementa decrementa en cada iteracin en funcin de una constante. Su sintaxis es: para variable <- valorinicial hasta valorfinal paso valorconstante hacer instrucciones a repetir finpara La variable debe ser numrica (entera o real), al igual que las expresiones correspondientes a valorincial y valorfinal. La instruccin incrementa (o decrementa) en el valor del paso la variable al terminar de ejecutar las instrucciones y antes de comparar con el valor final. El valor de paso es una constante entera real, y puede ser negativa en cuyo caso la variable de control se decrementa en cada iteracin. Cuando el paso es negativo, tambin cambia la operacin de comparacin para cada iteracin. La expresin correspondiente a valorfinal se evala en cada iteracin. Comentarios En los algoritmos se puede incluir comentarios (texto que se ignora durante el anlisis y la ejecucin). Los comentarios comienzan con el carcter punto y coma ; y tienen un alcance hasta el fin de la lnea:

Ejemplo de un algoritmo completo: ; Algoritmo palindrome ; Ingresa un numero y determina si es palindrome ; calculando el numero con las cifras invertidas
algoritmo palindrome variables numero, original, inverso, digito: entero cad: cadena

inicio imprimir "Ingrese un numero: " leer numero original <- numero inverso <- 0 mientras numero <> 0 hacer digito <- numero MOD 10 inverso <- inverso * 10 + digito numero <- numero DIV 10 finmientras si inverso = original entonces cad <- " es " sino cad <- " no es " finsi imprimirln "El numero ", original, cad, "palindrome" fin

La implementacin
Para la implementacin del intrprete se siguieron las principales tcnicas y herramientas para la construccin de compiladores descritas por Aho et al. (1988b) en su famoso libro del Dragn as como por Pratt et al. (1998) Para comenzar, una vez precisado el lenguaje fuente, se defini el conjunto de componentes lxicas del lenguaje necesarias para la implementacin del analizador lexicogrfico. Esta etapa del intrprete se encarga principalmente de analizar el programa fuente para formar las palabras que en l aparecen y clasificarlas en las componentes lxicas definidas. Para la implementacin del analizador se utiliz un generador automtico de analizadores lxicos, especficamente el FLEX (Gitelman 1999) La segunda etapa del intrprete, conocida como anlisis sintctico, requiri definir una gramtica libre de contexto para el lenguaje. En esta etapa el intrprete verifica que la secuencia de componentes lxicas generadas por el analizador lxico est en el orden correcto, de acuerdo a la sintaxis del lenguaje. El analizador se implement utilizando un generador automtico de analizadores sintcticos, el BISON (Gitelman 1999). La tercera etapa, el analizador semntico, cuya funcin es verificar que el programa fuente tenga un significado correcto, fue implementada utilizando la tcnica de traduccin dirigida por sintaxis (Aho et al. 1988b), la cual utiliza gramticas de atributos. La gramtica de atributos es la misma gramtica utilizada en el anlisis sintctico pero se le agrega un conjunto de atributos y rutinas semnticas encargadas de realizar el anlisis semntico. Estas rutinas semnticas, las cuales estn asociadas a las reglas de produccin de la gramtica, son ejecutadas por el mismo programa generado por el BISON para el anlisis sintctico. La siguiente etapa del intrprete realiza la sntesis del programa. A travs de ella se obtiene una representacin del programa fuente en un lenguaje intermedio. Este lenguaje intermedio se defini en base a formas internas orientadas a pila, segn describe Katrib (1988). Para la implementacin del generador de cdigo intermedio se utiliz la misma tcnica de traduccin dirigida por sintaxis que incorpora atributos y rutinas semnticas a la gramtica del lenguaje. Para concluir con la implementacin del intrprete, se implement la fase de ejecucin del cdigo intermedio. Fue programada para ejecutar el programa en dos modos. Modo normal y el modo paso a paso en que el programa fuente se puede ejecutar instruccin por instruccin a la vez que se inspecciona el valor de las variables que intervienen.

El intrprete posee dos mdulos adicionales, necesarios para su funcionamiento. El manejo de errores y la tabla de smbolos. El mdulo de manejo de errores funciona en modo pnico en el que todo procesamiento se detiene al detectarse un error. Pueden detectarse errores de tipo lxico, sintctico, semntico de ejecucin. La tabla de smbolo es la estructura de datos fundamental en todo compilador intrprete. Rene la informacin de todas las variables, funciones y constantes que intervienen en un programa. Es utilizada desde su creacin en el anlisis lxico y durante todo el proceso de traduccin y ejecucin. Para su implementacin se utilizaron algoritmos y estructuras de datos descritos por Aho et al. (1988a) El ambiente integrado para la ejecucin de los algoritmos (Alvites, 2008), fue programado utilizando como lenguaje de implementacin el C++ y como plataforma de desarrollo la versin 6.0 del C++ Builder.

Algunas experiencias El intrprete desde su primera versin fue colocado en Internet en la pgina http://usuarios.lycos.es/ealonsop/algor.html, para su libre uso. Desde entonces, se ha estado utilizando con buenos resultados en distintas universidades y por personas que se han interesado de manera autodidacta en aprender programacin.
En la Universidad Catlica Santo Toribio de Mogrovejo se est utilizando desde el ciclo de verano 2009-0 como herramienta de apoyo en el curso de Fundamentos de Programacin. Tambin desde hace varios semestres se utiliza en la Universidad de Occidente, del estado de Sinaloa en Mxico, para el curso de Introduccin a la Programacin. En esa universidad se ha creado un foro de discusin para el curso, a travs del cual estudiantes y profesores discuten los algoritmos, utilizando como herramienta para ejecutarlos el intrprete desarrollado. Igualmente se han tenido referencias explcitas sobre la utilizacin de manera exitosa del intrprete en Buenos Aires, Argentina, Venezuela, tambin por estudiantes y profesores de Ingeniera Informtica en Medelln, Colombia y de otros pases.

Conclusiones
Se ha descrito una herramienta alternativa para la enseanza de los algoritmos; que es un intrprete para la ejecucin, paso a paso, de algoritmos escritos en pseudo cdigo, permitiendo al estudiante verificar los algoritmos que construye adems de brindarle una mejor perspectiva para comprender la lgica de funcionamiento de las diferentes estructuras de control de la programacin. El intrprete ha sido utilizado con xito desde su primera versin a finales del ao 2007, permitiendo a los estudiantes una mejor comprensin del proceso de construccin de algoritmos.

Referencias Bibliogrficas
Aho, Alfred.; Hopcroft, John.; Ullman, Jeffrey. 1988a Estructura de datos y Algoritmos. Argentina. Addison Wesley Iberoamericana. Aho, Alfred.; Sethi, Ravi.; Ullman, Jeffrey 1988b. Compiladores, principios, tcnicas y herramientas. Argentina. Addison Wesley Iberoamericana. Alvites, Jos (2008). Ambiente integrado para la ejecucin de algoritmos para mejorar el aprendizaje de los alumnos del curso de algoritmos de la carrera profesional de

Ingeniera de Sistemas y Computacin en la USAT; Tesis; Ttulo Ingeniero de Sistemas y Computacin. Lambayeque; Universidad Catlica Santo Toribio de Mogrovejo. Gitelman, Alex. 1999. Bison/Flex Wizard .EU.A. FG Soup Software. Joyanes, Luis. 1996. Fundamentos de Programacin. Algoritmos y Estructura de datos. Espaa. McGraw-Hill Interamericana. Katrib, Miguel. 1988. Lenguajes de programacin y tcnicas de compilacin. Cuba. Pueblo y Educacin. Knuth, Donald. 1974. Computer Programming as an art. Communications of the ACM. Vol 17. No. 12. Pratt, Terrence.; Zelkowitz, Marvin. 1998. Lenguajes de programacin: diseo e implementacin. Mxico. Prentice Hall Hispanoamericana. Venners, Bill. 2002. James Gosling and the art of computer programming; (accedido junio 16 de 2007) <http://www.artima.com/intv/goslingD.html>

Você também pode gostar