Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Análisis de Nuevos Lenguajes para La Enseñanza de Programación Imperativa en La UNNOBA PDF
Análisis de Nuevos Lenguajes para La Enseñanza de Programación Imperativa en La UNNOBA PDF
1 Introducción
2.1 Pascal
Si bien Pascal es un lenguaje estructurado pensado para enseñar los conceptos básicos
de la programación imperativa, lamentablemente ha ido caído en desuso (tanto en la
industria como en la academia), trayendo como consecuencia la falta de herramientas
de apoyo modernas (entornos de desarrollado y depuradores) y de comunidades
activas que lo promuevan. Delphi [12] y FreePascal [13] son excepciones que han
encontrado su nicho y aún continúan desarrollándose. Delphi, sin embargo, al tratarse
de un producto comercial, impone ciertas restricciones que limitan su atractivo: no es
multiplataforma, requiere hardware relativamente moderno para ser usable y tiene
asociado un costo por cada licencia de uso. FreePascal, por su parte, no sufre de estos
inconvenientes y el proyecto Lazarus, que busca implementar un ambiente similar a
Delphi, podría ser un entorno de desarrollo conveniente para que los alumnos utilicen.
No obstante, la percepción por parte de los alumnos (y el mensaje trasmitido a ellos
por alumnos más avanzados de la carrera) es que nunca usarán Pascal en su desarrollo
profesional. Esto causa desmotivación y falta de interés en el lenguaje, que va en
detrimento de los conceptos fundamentales que quieren enseñarse. El uso de un
lenguaje que resulte más atractivo para el alumno, ya sea por su aplicación comercial
o por su “popularidad”, puede fomentar el interés por aprenderlo, traduciéndose en
una mejor asimilación de los tópicos a enseñar.
2.2 C
2.4 C++
C++ [2], como evolución del lenguaje C, fue considerado como el lenguaje ideal para
enseñar a programar, ya que permite utilizar construcciones más avanzadas que
simplifican muchas de las tareas que en C requerirían un esfuerzo importante. Por
otra parte, todo lo incorporado a C++ es opcional: pueden definirse clases o no, puede
usarse sobrecarga de operadores o no, pueden definirse funciones o clases genéricas o
no, etc. La filosofía siempre fue que si algo no se usa, no se paga un costo adicional
(en memoria o velocidad) por tener la posibilidad de usarlo. Sin embargo, C++ es un
lenguaje enorme y no fue ideado para ser usado como primer lenguaje de
programación. El hecho que C++ soporte casi todo el lenguaje C y además agregue
conceptos como clases, operadores, sobrecarga, espacio de nombres, programación
genérica, plantillas y más, lo convierten en un lenguaje monstruoso. Explicar el
siguiente programa trivial a un alumno inexperto no es una tarea sencilla:
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 cout << “Hola, mundo!” << endl;
7 return 0;
8 }
La línea 1 requiere entender el uso de archivos de cabecera y del preprocesador
(ambos heredados del lenguaje C). La línea 2 involucra el concepto de espacio de
nombres. La línea 4 requiere explicar que es una función y el por qué es necesario
devolver un 0 en la línea 7. La línea 6, involucra tantos conceptos que resulta difícil
enumerarlos sin olvidar ninguno: cout es un objeto de la clase std::ostream,
“<<” es un operador sobrecargado para trabajar con un “char *” y explicar el
mecanismo detrás de “endl” le daría dolores de cabeza a más de uno. Obviamente, es
posible aplicar la metodología de “No se preocupe, lo va a entender más adelante.
Por ahora, copie eso textualmente que va a funcionar” pero como estrategia
pedagógica no es la mejor, causando desconcierto y frustración en el alumno cuando
algo no funciona de la forma esperada. Por todo esto es que C++ fue descartado.
2.5 Java y C#
Java [8] y C# [3] son dos lenguajes similares y de amplio uso. Ambos son, en
principio multiplataforma, empleando una máquina virtual para abstraerse del sistema
operativo sobre el que corren. En el caso de Java, Oracle provee máquinas virtuales
que corren tanto sobre Windows, Linux, Solaris y OS X. En el caso de C#, Microsoft
provee solamente para Windows la plataforma .NET (plataforma para la cuál C#
compila) pero existe el proyecto Mono [4] que busca desarrollar una plataforma
compatible con .NET (en la medida de lo posible) y provee versiones para Windows,
Linux, Solaris y OS X, permitiendo también compilar para iOS y Android. El
principal inconveniente que ambos lenguajes tienen es que solamente soportan el
paradigma de la programación orientada a objetos y casi rechazan completamente el
paradigma imperativo. Es imposible en ambos lenguajes definir una función
independiente; sólo pueden definirse métodos en una clase. Esto conduce a una
sobrecarga de estructuras innecesarias en un programa donde solamente se pretende
enseñar programación imperativa, como puede verse en los siguientes ejemplos de un
“Hola, mundo” escritos en Java y C# respectivamente.
1 package hola; Java
2 public class HolaMundo {
3 public static void main(String[] args) {
4 System.out.println("¡Hola, mundo!");
5 }
6 }
1 using System; C#
2 namespace hola {
3 public class HelloWorld {
4 public static void Main(string[] args) {
5 Console.WriteLine("¡Hola, mundo!");
6 }
7 }
8 }
2.6 Scala
2.7 Go
2.8 Ruby
2.9 Javascript
3.1 Python
Python [14] es un lenguaje claro y minimalista, que busca expresar los conceptos
preferiblemente de una única manera. Emplear la indentación para definir bloques
fuerza a que el alumno incorpore la buena costumbre de escribir código claro, que se
espera arrastre a otros lenguajes donde los bloques se definen usando delimitadores.
Si bien Python es un lenguaje orientado a objetos, lo puede disimular muy bien,
dando la apariencia de ser un lenguaje completamente imperativo. Además, al ser un
lenguaje de muy alto nivel, la cantidad de conceptos que el alumno deberá manejar al
comienzo serán pocos. Es un lenguaje fuertemente tipado, dinámico e interpretado.
Permite correr una sesión interactiva con ayudas tales como documentación online y
completado de código. El sistema de documentación en línea es aplicable tanto sobre
una función o método propio del lenguaje como uno escrito por el alumno. Por
último, cuenta con la facilidad para escribir casos de pruebas dentro de la
documentación del código, denominado doctests, usando una sintaxis idéntica a la de
la sesión interactiva. La siguiente función posee documentación y casos de pruebas
contenidos dentro de la misma documentación.
>>> def factorial(n):
... """
... Calcula el factorial de n: n*(n-1)*(n-2)*...*2*1
...
... >>> factorial(1)
... 1
... >>> factorial(2)
... 2
... >>> factorial(3)
... 6
... >>> factorial(4)
... 24
... """
... if n > 1:
... return n * factorial(n - 1)
... else:
... return 1
3.2 D
Dada la función func que recibe un flotante x y devuelve otro flotante, el código
dentro del bloque in verificará que el valor del parámetro x sera siempre mayor que 0
(o fallará en caso que no lo sea), luego se ejecutará el cuerpo de func y finalmente,
en el bloque out, el valor retornado por la función (recibido en resultado en este
caso) se verificará si se encuentra dentro del intervalo [0, 1].
Una problemática que generalmente aparece cuando se quiere implementar un
TAD (una lista enlazada simple o una pila, por ejemplo) es el tipo de los valor que se
manipularán. En el caso de las listas enlazadas, si se escribe código donde el valor en
cada nodo es un entero, no será posible usarlo para crear una lista de cadenas o
flotantes o lo que fuera. En D, esto se resuelve mediante tipos genéricos (existen
mecanismos similares en C++, Java o C#). Una definición genérica para un nodo de
una lista enlazada simple puede escribirse de la siguiente forma:
1 struct Nodo(T) {
2 T valor;
3 Nodo *siguiente;
4 }
La estructura ahora posee un tipo paramétrico T, pudiendo ser instanciada así:
Nodo!int n1; Nodo!double n2; Nodo!string n3;
Las tres definiciones anteriores producirán tres estructuras (n1, n2 y n3), cada una
especializada para el tipo indicado luego del signo de exclamación. D posee más
características interesantes que no se mencionarán por una cuestión de brevedad.
4 Resultados esperados
Referencias
1. Kernighan, B., Ritchie, D.: The C Programming Language. Prentice Hall; 2nd edition (1988)
2. Stroustrup, B.: The C++ Programming Language. Addison-Wesley Professional; 3er ed. (2000)
3. C# Language Specification, http://go.microsoft.com/fwlink/?LinkId=199552
4. Mono: Cross platform, open source .NET development framework, http://www.mono-project.com/
5. D Programming Language – Official Website, http://dlang.org/
6. Alexandrescu, A.: The D Programming Language. Addison-Wesley Professional; 1st ed. (2010)
7. The Go Programming Language – Official Website, http://golang.org/
8. Java official website at Oracle, http://www.oracle.com/technetwork/java/index.html
9. Flanagan, D.: JavaScript: The Definitive Guide. O'Reilly Media; 6th edition (2011)
10.Crockford, D.: JavaScript: The Good Parts. Yahoo Press; 1st edition (2008)
11.OS X Developer Library: The Objective-C Programming Language,
http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/
12.Embarcadero Delphi XE2 - http://www.embarcadero.com/products/delphi/
13.Free Pascal – Advanced open source Pascal compiler for Pascal, http://www.freepascal.org/
14.Python Programming Language – Official Website, http://www.python.org/
15.Ruby Programming Language – Official Website, http://ruby-lang.org/
16.The Scala Programming Language – Official Website, http://www.scala-lang.org/
17.Online Python Tutor, http://www.onlinepythontutor.com/