jC: Hacia un lenguaje de programación para principiantes
jC: Towards a programming language for beginners
Baltasar García Perez-Schofield
Depto. de Informática, Universidad de Vigo
Edif. Fundición, s/n. Campus As Lagoas-Marcosende
Vigo, España
jbgarcia@uvigo.es
Francisco Ortín
Depto. de Informática, Universidad de Oviedo
c\ Calvo Sotelo s/n. 33007.
Oviedo, España
ortin@uniovi.es
Resumen—Existen multitud de lenguajes de programación, algunos de ellos incluso dedicados exclusivamente a la educación. Lógicamente, en la búsqueda de un lenguaje de programación para primero de carrera en ingenierías que no son informática, y que por tanto no precisan conocimientos avanzados, se espera que sea un lenguaje de programación sencillo, es decir, homogéneo, y que sirva como un primer y seguro paso para aprender otros lenguajes de programación. También se espera que tenga una sintaxis similar a C, de manera que sea a su vez similar a C++, C# y Java, lenguajes reales empleados en la industria, a estudiar probablemente en cursos más avanzados. Desgraciadamente, este lenguaje no existe, y las decisiones de diseño para crear jC, un lenguaje de programación que pretende llenar este nicho, se presentan aquí.
Palabras clave-Lenguaje programación, educativo, ingenierías.
Abstract—There are numerous programming languages, some of them even exclusively designed for education, which converts the process of choosing a programming language for the first course a difficult task. When focusing in other engineerings apart from computer science, the desired characteristics for this language are that it is simple, i.e., homogeneous, and that it will serve as a first and firm step for learning other programming languages. Syntax is expected to be similar to the mainstream programming languages used in the industry (i.e., C, and therefore C++, C# and Java), and which probably will need to be studied in more advanced courses. Unfortunately, a programming language fulfilling all these characteristics does not exist, and that is why the jC programming language was designed. In this paper, the main points of its designing process are discussed in deep.
Keywords-Programming language, education, engineerings.
Es difícil encontrar un lenguaje de programación adecuado para la educación. Hoy en día, en ingenierías informáticas, se emplean lenguajes de programación como Java [16], además de, en menor medida, C# y C++, lenguajes que presentan un paradigma de orientación a objetos como forma de desarrollo. La razón de su utilización consiste exclusivamente en que son los lenguajes de programación empleados en la industria. Lenguajes de programación específicos para la educación, como Pascal [9], parecen tener, cada vez más, un uso marginal.
Esta situación se torna compleja cuando se tienen en cuenta otras ingenierías. Cada vez más, otros estudios de ingeniería incluyen en sus primeros años nociones técnicas de programación [2], ya que se espera que precisen emplear estos conocimientos en el desarrollo de su profesión. Pero mientras en ingeniería informática se aplican estrategias como orientación a objetos desde el principio, o programación estructurada primero, y después orientación a objetos, en otras ingenierías estos criterios no son en general aplicables, o al menos de gran ayuda. En realidad, el lenguaje objetivo para esta audiencia debería reunir las características de a) que no sea excesivamente complicado para aprender, y b) que el conocimiento de dicho lenguaje de programación maximice el aprovechamiento en su profesión.
Así, muchas veces, incluso lenguajes de scripting embebidos en paquetes de cálculo matemático, como sucede en Excel [4], Matlab [5], Mathematica [13] o R[1], son preferidos sobre lenguajes de programación tradicionales debido a que a) presentan una sintaxis y semántica muy simple, b) de alguna manera, facilitan la programación de cálculos matemáticos, si bien c) suelen presentar un sistema de tipos débil o directamente dinámico, lo que no es recomendable para un principiante.
En este artículo se presenta el diseño de un lenguaje de programación dedicado exclusivamente a la enseñanza en ingenierías no informáticas, denominado jC1, y el cual ya está disponible. El resto del artículo se estructura como sigue: a continuación se realiza una discusión de distintas posibilidades en cuanto a lenguajes de programación educativos existentes. En las siguientes secciones se establecen los criterios de diseño para jC, su librería estándar y su entorno de trabajo, y finalmente se presentan las conclusiones y trabajo futuro.
Pascal [9] es un conocido lenguaje de programación dedicado a la enseñanza. Mientras en un principio era el lenguaje de programación de elección para asignaturas de programación de primer curso, ha caído en franco desuso debido a a) su sintaxis, que no sigue los estándares de la sintaxis que se ha impuesto, tipo C, y b) un exageradamente compartimentado sistema de tipos, generando conocimientos y experiencias hasta cierto punto confusas. Por ejemplo, algunos programadores formados con Pascal sienten extrañeza cuando se enfrentan por primera vez al hecho de que un carácter se represente mediante un número, en prácticamente cualquier otro lenguaje de programación.
Basic es un lenguaje de programación especialmente diseñado, desde un principio, para comenzar a programar. Sin embargo, a pesar de tener múltiples versiones recientes como Visual Basic [18] (y el más adecuado para principiantes, SmallBasic [15]), en la industria no se considera como un lenguaje de programación que hoy en día realmente siente unas bases apropiadas para principiantes. En buena parte, la naturaleza dinámica de esta clase de lenguajes de programación (incluyendo Python [21], y GRAIL [14]), con respecto al sistema de tipos, es culpable de esto.
LPP [12] es, según indican sus siglas, un lenguaje de programación para principiantes. Este lenguaje tiene las siguientes características: un entorno de programación con una distribución de biblioteca funciones estándar, un entorno que esconde todas las interioridades del lenguaje (compilación, enlace, etc.), sintaxis tipo Pascal, y la traducción de todas las palabras clave al español. El programa se instala fácilmente, mediante un instalador automatizado (exclusivamente para Windows). Fue desarrollado en la Universidad UNITEC (campus San Pedro Sula) de Honduras, como proyecto de fin de carrera, y no ha sido publicado académicamente.
Blue [11] es un lenguaje de programación para principiantes creado por la Universidad de Sydney. Fue el lenguaje que inicialmente se pensaba utilizar en el entorno de programación también llamado Blue (finalmente se descartó en favor de Java, con lo que nació BlueJ [7]), conformando un paquete único. Sus características son: totalmente orientado a objetos, sistema de tipos dinámico, y sintaxis minimalista.
C++ [19] es un potentísimo lenguaje de programación basado en C [10], de un extraordinario bajo nivel, añadiendo orientación a objetos y otras muchas posibilidades. Esto hace de C++ un híbrido entre programación procedural, y orientada a objetos, convirtiéndolo contradictoriamente en un lenguaje de simultáneamente alto y bajo nivel. La sintaxis que ofrece C es la sintaxis que se ha impuesto en los lenguajes de programación de mayor uso en la industria en estos momentos. Sin embargo, C no es un lenguaje de programación especialmente dedicado a principiantes; C++ tampoco, aunque en algunos casos se haya intentado mejorar esas características [20]. No tiene entornos especialmente dedicados, aunque sí muchos profesionales. Finalmente, C++ es preferible sobre C, incluso aunque no se use programación orientada a objetos, debido a ciertas características del primero de más alto nivel [23]. Un ejemplo es el paso por referencia, que evita complicaciones innecesarias debido a la necesidad de conocer un concepto tan técnico como el de los punteros. En cualquier caso, es una opción complicada para un estudiante de otras ingenierías, que debe igualmente conocer muchas interioridades del lenguaje de programación para poder usarlo adecuadamente, obteniendo en cambio pocas ventajas claras con respecto a su uso en su propio futuro profesional.
Java [16] es un lenguaje de programación orientado a objetos que ha triunfado, como lenguaje de programación para principiantes, exclusivamente debido a su amplia utilización en la industria (es criticado para su uso en educación [7]). En ingenierías no informáticas, cuando se emplea este lenguaje se usa como si fuera imperativo procedural, de manera que se suele emplear sólo una clase, con todas las funciones declaradas como static (de tal forma que no sea necesario crear objetos). Además de ser ampliamente utilizado, cuenta con multitud de entornos profesionales de desarrollo, como Netbeans [22] o Eclipse [8], e incluso algunos de ellos dedicados específicamente a la enseñanza, como BlueJ [3]. Los primeros suelen ser excesivamente técnicos como para usarlos en enseñanza directamente, mientras ambos tipos de entornos se centran en la programación orientada a objetos. Lo mismo es aplicable a C#, pues son en realidad lenguajes muy parecidos en sintaxis y semántica (su mayor diferencia es que la sintaxis de C# está muy basada en C++).
iJava [17] es probablemente el trabajo más relacionado con el diseño presentado aquí. Se trata, según su propio autor, de un lenguaje de programación imperativo obtenido tras la eliminación del lenguaje de programación Java de todas las características del paradigma de orientación a objetos. Incluye también un entorno de programación, que esconde todas las interioridades del proceso de compilación y ejecución, de manera que es muy sencillo programar ejercicios de cualquier tipo en él. En la parte negativa, es de destacar la ausencia de un verdadero compilador. Los errores de programación se señalan de manera parca y con poca información, lo que hace estrictamente necesaria la presencia de un docente que un amplio dominio del entorno y de la forma en la que está construido. Por poner un ejemplo, a pesar de no desear soportar orientación a objetos, presenta una mixta cobertura para cadenas (permite el uso de objetos String, así como vectores de caracteres) o vectores (soporta la expresión vector.length). Finalmente, hace especial énfasis en la salida gráfica, que parece convertirse en su principal objetivo. En cuanto a la facilidad de uso y asequibilidad, es de notar que no tiene instalador, exige tener instalado el JDK de Java (no sólo el JRE), el entorno utilizado no es excesivamente estándar en cuanto a la distribución de funcionalidad, y está escrito totalmente en inglés.
Lenguaje |
Instalador |
O.O. |
Entorno |
Idioma |
Sintaxis |
Portable |
Pascal |
Sí |
No |
Complejo |
Varios |
Pascal |
Sí |
Small Basic |
Sí |
No |
Muy sencillo |
Inglés |
Basic |
No |
Python |
No |
Sí, opc. |
Complejo |
Varios |
Basic |
Sí |
Java |
Sí |
Sí |
Complejo |
Varios |
C |
Sí |
C++ |
No |
Sí. opc. |
Complejo |
Varios |
C |
Sí |
LPP |
Sí |
No |
Simple |
Español |
Pascal |
No |
Blue |
No |
Sí |
Simple |
Inglés |
C, Lisp |
Sí |
iJava |
No |
No |
Simple |
Inglés |
C |
Sí |
Características básicas de los lenguajes de programación estudiados.
Finalmente, se pueden extraer de esta revisión bibliográfica (resumida en la tabla 1), las siguientes conclusiones deseables para un lenguaje de programación adecuado para aprender programación por parte de ingenieros no informáticos: a) disponer de un instalador sencillo que prepare todos los componentes necesarios para la ejecución del entorno, b) sintaxis tipo C, e imperativo-procedural, c) que sea multiplataforma, d) soporte de múltiples lenguas, d) soporte para las estructuras de datos complejas disponibles habitualmente en programación procedural (vectores, matrices, cadenas, …), e) un compilador real, proporcionando mensajes de error significativos, y f) un entorno sencillo que minimice el impacto de comenzar a escribir un programa, y esconda las interioridades del proceso de compilación y ejecución, a la vez que se asemeje a entornos más avanzados.
Tomando las conclusiones de la anterior sección, el lenguaje jC fue diseñado, como una simplificación de C, tomando como ejemplo con respecto a ciertas soluciones al lenguaje Java. Así, de C se eliminan tipos de datos, modificadores, y estructuras de datos complejas que no son necesarias en un lenguaje de programación para principiantes, y de Java se toma la mayor parte de las decisiones de sintaxis en cuanto a modificadores, y se descarta todo lo relacionado con el paradigma orientado a objetos. Se pueden encontrar los detalles ampliados de diseño en otro documento [6].
Si bien jC se espera que sea utilizado desde su entorno desde el primer momento, existe la posibilidad, si se desea, de emplearlo desde línea de comando. Este lenguaje ha sido construido mediante el lenguaje de programación Java, y permite la extensión del lenguaje mediante módulos escritos en Java.
Así, se espera que el usuario escriba su código fuente en archivos con extensión *.jc, a la vez que cree sus propios módulos (bibliotecas de funciones empleadas habitualmente) con extensión *.jcm.
El intérprete consume archivos con la extensión *.jcb. Es, en el presente estadio, un verdadero intérprete, si bien es factible crear, con más tiempo y recursos, un nuevo backend para el compilador que genere código nativo Java.
Como el resto de características del lenguaje de programación, los tipos han sido reducidos al máximo: boolean representa los valores resultado de expresiones condicionales; char representa caracteres según la norma UTF-16 (un vector de caracteres, char[], representa texto), int representa a los números enteros, con las restricciones de la máquina virtual en la que se ejecute jC (como mínimo, serán capaces de almacenar valores de 32bits); y finalmente, double, que almacena valores en coma flotante (al menos, 64bits). Todos los tipos de datos aceptan la formación de vectores y matrices.
Tal y como se ha indicado anteriormente, la sintaxis básica que sigue el lenguaje de programación es una mezcla entre C y Java, con algunos cambios que tratan de obtener lo mejor de ambas, puliendo defectos de manera que haya una y sólo una forma, en la medida de lo posible, de utilizar cada característica. Por supuesto, es obvio que se puede obtener una sintaxis más limpia y consistente estudiando a conciencia el problema y desarrollando un nuevo conjunto de reglas sintácticas (de hecho es muy tentador), pero entonces se estaría trabajando fuera de las premisas establecidas como punto de partida.
Así, cada sentencia se separa de la siguiente en secuencia mediante la marca de fin de instrucción: ';'.
Además, los bloques de instrucciones se marcan con llaves. Sólo existe un tipo de bloque de instrucciones, en lugar de la habitual duplicidad en la mayoría de lenguajes de programación que se encuentra en la forma de bloque de instrucciones de una sola instrucción y los restantes. Esta ambigüedad no existe en el lenguaje: si existe un bloque de instrucciones, este siempre se marca sintácticamente de la misma forma.
En cuanto a estructuras de decisión y repetición, se dispone de if, y switch, además de for (incluyendo la forma foreach), while y do... while, que siguen las mismas directrices que en C [6][10].
jC soporta la recolección de basura, especialmente para la creación y destrucción de vectores y matrices. Es el único contexto en el que se permite el uso del operador new. Por tanto, no es necesario hacer nada para liberar memoria: en cuanto un vector (o cadena) o matriz deja de usarse, es pasada al recolector de basura para su eliminación.
Dentro de cualquier función es posible crear variables, que almacenarán información de cualquiera de los tipos soportados. Para ello, sólo es necesario anteponer el tipo seleccionado y dar un nombre a la variable en cuestión; opcionalmente, se le podrá asignar un valor para su inicialización. En caso de que este se omita, se asume y asigna el valor cero o el valor por defecto correspondiente. No existen, por tanto, variables no inicializadas.
También es posible, igualmente, crear constantes, anteponiendo la palabra clave final al tipo de la variable. En este caso, la inicialización es obligatoria.
En el modo más estricto del compilador, si se intenten crear variables fuera de una función, es decir, variables globales, se proporciona un error, es decir, no se soporta. Sólo las constantes pueden ser globales. Este comportamiento es configurable, de tal forma que se puede exigir más disciplina al estudiante a medida que avanza en el dominio del lenguaje, adaptándose el compilador a él, y no al revés.
Las funciones se crean de forma muy parecida a la sintaxis que muestran en C. Se comienzan con el tipo de datos de retorno, o void, si no se devolviera ningún valor. A continuación, el nombre de la función, y la lista de parámetros entre paréntesis, de manera que cada uno de ellos sigue las mismas reglas sintácticas que se usa para la creación de variables.
Un caso especial (en cuanto a semántica), es la función main(), que es el punto de entrada para la ejecución de un programa en jC, y cuyo valor de retorno se interpreta como indicativo de éxito o fracaso del programa.
La librería estándar está dividida en varias partes, que se utilizan mediante la palabra clave tomada en Java import. Los módulos de la librería estándar se identifican por el prefijo std, como en std.io. La librería estándar es extensible, y de hecho será necesario crear nuevos módulos de la librería estándar para dar acceso a la extensa colección de librerías de Java (en este momento, debido al tiempo y recursos necesarios, sólo las más básicas están disponibles).
Los módulos sólo difieren con un programa en jC en que a cada función se le antepone la palabra clave public o private, indicando respectivamente si esa función es parte de la interfaz para ese módulo o no. No existe función main(). Un módulo puede usarse de la misma manera que se importa la librería estándar, excepto por la ausencia del prefijo std.
El soporte de programación modular ha sido una decisión de diseño que se ha tenido en cuenta desde el comienzo. El uso y creación de módulos está presente en cualquier lenguaje de programación, incluso en los de scripting. Los alumnos principiantes suelen tener una formación muy débil en cuanto a la creación y ventajas del uso de módulos, aspecto que se intenta paliar con esta iniciativa.
Así, el famoso programa “Hola, mundo” que se utiliza como ejemplo en todos los lenguajes de programación sería como sigue empleando la configuración simple del compilador:
import
std.io;
println( “Hola, mundo” );
Mientras se convertiría en el siguiente código, empleando la configuración estricta, dedicada al alumno que ya ha afianzado su conocimiento.
import std.io;
import std.util;
int
main()
{
println( "Hola, mundo" );
Para un objetivo como es el de diseñar un lenguaje para programadores principiantes, el entorno de programación es tan importante como el lenguaje en sí. jC se instala al mismo tiempo que su entorno, mediante un instalador multiplataforma escrito en Java, que creará, de ser necesario, enlaces para el escritorio y el menú de inicio. Tan sólo es necesario tener instalada la máquina virtual Java (conocida también como JRE) para que funcione; no es necesario el JDK.
Así, comenzar a trabajar con jC es tan sencillo como hacer doble clic en el enlace apropiado, de manera que se abra el entorno, escribir un programa y pulsar en ejecutar.
El entorno de programación tiene una distribución de funcionalidades estándar, aunque muy simplificadas, con respecto a otros entornos de programación profesionales. En la parte superior se escribe el código, mientras que en la parte inferior se obtienen mensajes de error relativos a la compilación. Sólo una opción o botón de la barra de tareas lanza la compilación y la ejecución del programa, si este no tiene errores. Esta simplificación se ha realizado para evitarle al principiante el tener que conocer las interioridades del proceso de compilación y ejecución, a costa de recompilar aún cuando pueda no ser estrictamente necesario.
También es de destacar que, en la sección de preferencias, es posible cambiar el idioma en el que se muestran los mensajes de error y opciones de menú de la aplicación, de entre las lenguas soportadas: español e inglés.
Un punto muy importante, que se ha cuidado al detalle, es la extracción de documentación del propio código fuente del programa. Uno de los mayores problemas a la hora de enseñar programación a programadores principiantes es convencerles de la necesidad de planear (diseñar, en una palabra) antes de sentarse a programar, a la vez que la de documentar su código. Si bien lo primero no va a cambiar por el uso de este lenguaje de programación o su entorno, sí se ofrecen facilidades para lo segundo. Al programador principiante puede ofertársele como atractiva la posibilidad de escribir documentación mientras programa, sabiendo que será premiado con la extracción de dicha documentación en forma de una página web, accesible desde el propio entorno.
El programador sólo precisa escribir comentarios justo antes de las funciones y constantes que empiecen por /**. Los mismos identificadores que se usan en JavaDoc, y que se han convertido en un estándar de facto [16], se emplean aquí para indicar el resumen de la actividad de la función (@brief), el uso de sus parámetros (@param), el valor de retorno (@return), etc. En cuanto a módulos, se puede documentar su nombre (@name), la fecha de creación (@date), el autor (@author), etc.
En cualquier momento, se puede pulsar F4 para que el entorno genere la documentación del programa o módulo actual y la muestre en una pestaña separada del código fuente. Así, en cualquier momento se puede comprobar, usando la propia documentación generada, cualquier duda sobre el código fuente. Esta documentación estará presente en el directorio del programa, de manera que posteriormente también se podrá cargar en un software de procesamiento de textos e imprimirla, u hojearla mediante un navegador sin la presencia obligatoria del entorno.
Mediante este mismo mecanismo, se ha creado la documentación de la librería estándar, que puede accederse mediante F1.
En la librería estándar, así como en el resto de características del lenguaje, se ha buscado simplicidad y eliminación de cualquier posible ambigüedad.
Por poner un ejemplo, uno de los mayores problemas con las librerías de entrada/salida de lenguajes profesionales suele estar relacionada con la falta de idempotencia en su uso. Por ejemplo, en C++ la entrada se corta por defecto por espacios, de manera que si se pide una cadena, se introduce “hola mundo”, y se vuelve a pedir una entrada por teclado, esta aparentemente “se salta”, creando una gran confusión entre los alumnos que se enfrentan por primera vez ante esta característica. Lo mismo sucede en Pascal, con el uso combinado de las funciones estándar read() y readln(). Finalmente, si se espera leer un número y el usuario teclea cualquier otra cosa, se produce un error de formato; pero, de una manera que puede resultar difícil de explicar, en muchos lenguajes el flujo de entrada permanece en un estado no recuperable de inmediato, que impide que sea utilizado de nuevo directamente. Así, en jC sólo se permite la lectura y escritura de cadenas de texto, mediante una y sólo una función, read() y print(), respectivamente. Una vez leída una cadena de texto, existen funciones de la librería estándar que permitirán convertirla a un número entero o un flotante.
La librería estándar, fuertemente inspirada en C, se divide, por tanto, en std.io (entrada y salida), std.util (funciones de utilidad, como size(), para obtener el tamaño de cadenas y vectores, conversiones entre tipos...), std.math (funciones y constantes matemáticas), std.string (funciones de manejo de cadenas, es decir, vectores de caracteres), std.limits (constantes para los valores inferiores y superiores de los tipos numéricos), y std.charType (funciones de manejo de caracteres).
Si bien la librería de módulos disponibles puede extenderse cuanto se quiera, la librería estándar se reduce a los anteriores módulos.
El trabajo en el compilador del lenguaje ha sido terminado, así como el entorno de programación. Existen todavía una serie de trabajos que se pueden realizar para pulir y mejorar el proyecto.
Verificación con estudiantes principiantes reales, de ingenierías no informáticas, de las fortalezas y debilidades de esta aproximación. Se planificaría un seminario con estudiantes de este tipo, obteniendo resultados de dos frentes distintos: a) interacción con el alumnado: observar cómo abordan los problemas habituales relacionados con comprender la programación, y si el lenguaje y el entorno les ayudan a afrontarlos; y b) elaboración de encuestas: se entregaría un pretest y un posttest que permitirá evaluar no sólo la adecuación de la herramienta, sino también los cambios de percepción antes y después de haber efectuado el seminario en cuestión, ofreciendo posibilidades adicionales de retroalimentación y mejora.
Elaboración de un courseware completo, con material docente, ejercicios, etc., que permita incluso a alumnos a distancia la adquisición de conocimientos de programación, desde un estadio básico, a un estadio final avanzado.
Si bien en ciertas carreras el uso de lenguajes de programación de scripting para programas como Excel, Mathematica, Matlab, etc., está sobradamente justificado, en otras áreas se observa la necesidad de un lenguaje de programación para principiantes, que sirva de preparación para otros lenguajes de programación profesionales que se vayan a utilizar en materias posteriores de la carrera, o en el ejercicio de la profesión.
En definitiva, un lenguaje de programación como jC viene a intentar cubrir un nicho que todavía no se ha completado satisfactoriamente, un nicho que hace años cubrían lenguajes como Pascal: un lenguaje de programación adecuado para el aprendizaje, que asiente conocimientos correctos y sólidos. Para lograr la obtención de este objetivo, ha sido necesario el estudio exhaustivo presentado en este trabajo de investigación, tratando de justificar las decisiones tomadas con las conclusiones y experiencias obtenidas de los citados trabajos, y tratando de garantizar, por tanto, la adecuación de la propuesta presentada aquí.
Este trabajo de investigación ha sido parcialmente subvencionado por el Ministerio Español de Ciencia y Tecnología, enmarcado en el programa de I+D con referencia de proyecto TIN2011-25978, titulado “Obteniendo software adaptable, robusto y eficiente incluyendo referencia estructural a lenguajes de programación de tipado estático.”
Adler, J. R in a Nutshell: A Desktop Quick Reference. O'Reilly, 2010.
Agencia Nacional de Evaluación y Acreditación. Libro blanco: Título de grado en ingeniería informática. 2004.
Barnes, D.; Kölling, M. Objects first with Java: A practical introduction using BlueJ. Prentice Hall, 2008.
Bovey, R.; Wallentin, D.; Bullen, S.; Green, J. Professional Excel Development: The Definitive Guide to Developing Applications Using Microsoft Excel, VBA, and .NET. Addison-Wesley Professional, 2009.
Chapman, S. MATLAB Programming for Engineers. CL-Engineering, 2008.
García Perez-Schofield, B. The jC Programming Language. Informe Técnico IT1/2010, Sept. 2010.
Hadjerrouit, Said. Java as First Programming Language: A Critical Evaluation. SIGSE Bulleting, v30 n2, June 1998.
Hou, D. Studying the evolution of the Eclipse Java editor. Proceedings of the 2007 OOPSLA workshop on eclipse technology eXchange. Acm, 2007.
Jensen, K. Pascal User Manual and Report: ISO Pascal Standard. Springer, 1991.
Kernighan, B.; Ritchie, D. The C Programming Language. Prentice Hall, 1988.
Kölling. M.; Rosenberg, J. Blue – A language for teaching object-oriented programming. ACM SIGSE Bulleting, v 28 n1, 1996
Castillo Suazo, Rommel. Programación en LPP (accedido en Feb. de 2012): http://www.scribd.com/doc/10392350/LPP-info
Maeder, R. Computer Science with Mathematica. Cambridge University Press, 2000.
McIver, L., Conway, D. GRAIL: A Zeroth Programming Language. Proceedings, International Conference on Computing in Education (ICCE99), pp. 43-50, 1999.
Miller, F.; Vandome. A.; McBrewster, J. Microsoft SmallBasic. VDM Publishing, 2009.
Naughton P., Schildt, H. Java 2: The Complete Reference. Osborne Publishing, 1999.
Sánchez (J.A.) iJava: un nuevo lenguaje para facilitar el paso del paradigma imperativo al orientado a objetos. en Proc. XV Jornadas de Enseñanza Universitaria de la Informática (JENUI '09), Barcelona, España, Julio 2009.
Stepehns, R. Visual Basic 2010 Programmer's Reference. Wrox Programmer to Programmer), 2010.
Stroustrup, B. The C++ Programming Language. Addison-Wesley, 2000.
Stroustrup, B. Learning Standard C++ as a New Language. Technical report in AT&T Labs, 2000.
Van Rossum, G. Foreword to Programming Python; Comparing Python to other languages: http://python.org/doc/essays/, accedido en Feb, de 2012.
Vaughan Nichols, S.J. The battle over the universal Java IDE. IEEE Computer v36 n4, April 2003.
García Perez-Schofield, B.; Ortin, F.; A programming tool to ease modular programming with C++. Actas del VI CISTI. Junio de 2011