Una comparación muy rápida de los lenguajes populares de programación de la enseñanza por ordenador
Original web-page: http://www.ariel.com.au/a/teaching-programming.html
La prueba
Yo quería ver lo que estaba involucrado en la escritura de programas muy simples en un (pequeño) gran variedad de idiomas. Los idiomas que elegí eran básicas, C, Java y Python. Solía C y Java, porque estos son de uso común en el departamento (y en otras instituciones de enseñanza. Elegí Python porque lo amo, y creo que es una excelente opción para la enseñanza, y elegí BÁSICO porque, bueno, simplemente era demasiado fácil…..
“Hola mundo” parecía un poco demasiado trivial, por lo que se decidió por la relativamente simple tarea de leer dos números por parte del usuario, sumándolos e imprimir el resultado. Mi interés era
- ¿Cuánto tiempo se tarda en escribir y depurar el código
- ¿Cuántas cosas hace un estudiante necesita entender con el fin de escribir este código
Los tiempos indicados para escribir el código, obviamente, no están destinados a ser representativos del tiempo requerido por un estudiante, pero yo creo que dan una medida más o menos precisa de comparación. Estoy razonablemente experto (1-5 años de experiencia profesional) en cada idioma, así que no creo que era excesivamente sesgada.
BASIC
Aprendí a programar, a finales de los años 70, en un nivel I TRS-80, y en un sistema de intercambio de tiempo que mi escuela secundaria tuvo acceso ocasional a. El programa es trivial en buena BÁSICO antigua:
10 INPUT A
20 ENTRADA B
30 C = A + B
40 PRINT C
CORRER
Tiempo para escribir:
15 segundos. Admito que no tengo un intérprete de BASIC práctico y no he probado esto, pero yo sólo sé que funciona. (OK, dispararon hasta el emulador TRS-80 y, de hecho pasé – funciona …)
Cosas que explican:
- Línea de números
- Variables
- ENTRADA
- IMPRESIÓN
- CORRER
Pros y contras
BASIC es muy fácil para los principiantes a empezar a utilizar, pero es un viejo lenguaje, mal diseñado, carente de casi todas las características modernas. Visual Basic agrega mucho a “el bueno de BASIC”, pero no es apropiado (creo) para enseñar a un lenguaje propietario de una sola plataforma. Y aún así no es realmente un buen lenguaje ….
C
#include <stdio.h>
int main (int argc, char * argv [])
{
int a, b, c;
scanf ( "% d", y a);
scanf ( "% d", y b);
c = a + b;
printf ( "% d \ n", c);
}
%> Gcc -o añadir add.c
%> ./add
Tiempo para escribir:
unos tres minutos, incluyendo la depuración.
Cosas que explican:
- #include, funciones (principales), regresan tipos, argc, argv
- variables, tipos (int)
- scanf (y muy pronto sus limitaciones y cómo trabajar alrededor de ellos)
- printf, cadenas de formato
- punteros (ya !!)
- compilar, llaves y punto y coma
Pros y contras
C fue diseñado por los mejores piratas informáticos para su propio uso. Fue diseñado para sistemas operativos de la escritura, compiladores y otras herramientas del sistema, y en este papel se ha vuelto casi totalmente dominante.
Se puede proporcionar un excelente rendimiento (suponiendo buena elección del algoritmo y buenas habilidades C) y permite el acceso al hardware de bajo nivel, pero éstos no son normalmente las cosas requeridas por el principiante. El uso de C de los punteros son una fuente de frustración y confusión para los principiantes, pero son esenciales, incluso en programas bastante triviales (como la de arriba, aunque de una manera trivial).
Además, manejo de cadenas de C es débil en comparación con muchas otras lenguas modernas (la función scanf utilizado anteriormente es notoriamente problemática).
C es un lenguaje importante y muy importante, y todos los programadores deben tener un riesgo significativo a la misma. Sin embargo, es un lenguaje terrible de enseñar a los principiantes. Hay demasiado C que tiene que ser explicado, dejando menos tiempo para explicar la programación.
Java
import java.io. *;
AddUp clase pública
{
principales (args String []) {public static void
InputStreamReader stdin = new InputStreamReader (System.in);
BufferedReader consola = new BufferedReader (stdin);
int i1 = 0, i2 = 0;
cadena s1, s2;
tratar {
s1 = Console.ReadLine ();
i1 = Integer.parseInt (s1);
s2 = Console.ReadLine ();
i2 = Integer.parseInt (s2);
}
captura (IOEX IOException) {
System.out.println ( "Error de entrada");
System.exit (1);
}
captura (nfex NumberFormatException) {
System.out.println ( "\" "+ nfex.getMessage () + "\" no es numérico");
System.exit (1);
}
System.out.println (i1 + "+" + i2 + "=" + (I1 + I2));
System.exit (0);
}
}
%> Addup.java javac
%> AddUp java
Tiempo para escribir:
19 minutos! En realidad, pasé unos 15 minutos, no pudo, entonces busqué en Google de un ejemplo. El código anterior se copia de una página web, la cual, revelador pensé, comienza con las palabras “Podría pensarse que un programa que lee en dos enteros introducidos por el usuario e imprime su suma sería un simple trozo de código”.
Obviamente, este código no es perfectamente equivalente a los otros programas que se presentan aquí, ya que hace la comprobación de errores apropiado, sin embargo Java hace que sea difícil no hacer la comprobación de errores. Debe detectar las excepciones, y haberlos atrapado que también podría hacer algo con ellos.
Estoy en realidad un poco avergonzado que tenía tantos problemas con esto – He estado trabajando en un paquete de Java comercial durante dos años, pero debido a que está basado GUI que rara vez tienen que hacer frente a la lectura desde la consola. verdaderos programadores Java es probable que mirar hacia abajo en mí con una mezcla de lástima y asco. Así es la vida.
Cosas que explican
- importación, clases, punto y coma apoyos
- vacío, Cuerda, principales argumentos públicas estáticas []
- InputStreamReader, BufferedReader, System.in
- variables, tipos
- tratar, coger, excepciones, readLine, parseInt
- System.out.println, compilar, ejecutar
Pros y contras
Java es un lenguaje útil para el desarrollo de GUI multiplataforma, es una plataforma sólida para el desarrollo orientado a objetos, y tiene un conjunto amplio y altamente evolucionada de bibliotecas de clases. Tal vez lo más importante, que es el idioma más popular en todo y hay un montón de puestos de trabajo para los programadores de Java.
Sin embargo, la extensa biblioteca de clases es bastante desalentador. Parece que hay una clase para casi todo, y gran parte de la “programación en Java” parece consistir en “la búsqueda de la clase correcta”. Incluso después de dos años me parece que no puedo hacer mucho en Java sin hacer referencia constante a la documentación.
Java hace cumplir la orientación a objetos, la comprobación de excepción y tipos de datos estrictos – todos estos son (posiblemente) cosas buenas – que hacen que sea más fácil para un grupo de programadores para crear grandes sistemas robusta. Pero para los problemas pequeños (como los que se enfrentan en las clases de introducción a la programación) estas cosas llegan a ser nada más que un complicado, carga de tiempo chupadores.
La razón empleo por sí solo es suficiente para hacer de Java un “debe enseñar” lanaguage, pero yo creo que hacemos a nuestros estudiantes un mal servicio si este es el mejor lenguaje que les mostramos.
Pitón
import sys
a = sys.stdin.readline ()
b = sys.stdin.readline ()
c = int (a) + int (b)
c impresión
%> Add.py pitón
Tiempo para escribir:
aproximadamente un minuto, incluyendo pruebas y depuración.
Cosas que explican
- importar
- las variables
- sys.stdin
- readline (lee una cadena)
- int (convierte una cadena a un entero)
- impresión
Pros y contras
Python tiene una gran cantidad de buenos puntos:
- refuerza buen estilo de programación (sangrado es significativa)
- OO disponible, pero no forzada
- Excepciones utilizar, pero no se hacen cumplir
- no es un juguete o lenguaje académico – mucho trabajo en el mundo real se realiza en Python
- permite la concentración en algoritmos y problemas, no en las características del lenguaje y deficiencia.
- es multiplataforma y tiene un potente conjunto de bibliotecas
- es seguro – no tiene tiempo de ejecución comprobación de tipos dinámica y comprobación de límites en matrices
- se ha incorporado en los tipos de datos de gran alcance – diccionarios, listas, secuencias, funciones, conjuntos (en 2.4)
- tiene poderosas estructuras de control incorporado – bucle simple a través de secuencias, mapa, generadores, listas por comprensión, expresiones regulares …
- requiere menos líneas de código para cualquier problema dado, y es más fácil de leer – así una mayor productividad.
Para la enseñanza como primera lengua sin embargo, tiene algunas ventajas específicas. Como se puede ver en los ejemplos anteriores (ignorando BASIC), Python requiere menos tiempo, menos líneas de código, y menos los conceptos que se les enseñe a alcanzar una meta determinada. Esto permite más tiempo para ser gastado en las cosas importantes. Además, algunos errores comunes de los estudiantes están completamente byassed en Python:
- final de la línea es de fin de línea (no hay punto y coma olvidados)
- no hay declaraciones de tipos
- verdadera estructura de bloque siempre es evidente (sin error de los apoyos que falta)
- asignación dinámica de memoria y recolección de basura
Por último la programación en Python es divertido! La confianza raza éxito diversión y frecuente e interés en el estudiante, que es entonces en mejores condiciones para seguir aprendiendo a programar.
Pero Python es un lenguaje de script Justo
Python se despide a menudo como “sólo un lenguaje de script” (Perl y Ruby también sufren de esta intolerancia tonta). Esto es simplemente incorrecta. No es “sólo un lenguaje de script” – es un lenguaje de alto nivel muy alto con todas las funciones que es ideal para muchas aplicaciones, incluyendo tareas de secuencias de comandos simples.
El hecho de que se puede escribir guiones “rápido y sucio” en Python es una ventaja, no una desventaja, ya scripting es en realidad una parte esencial de la programación profesional. Si los estudiantes no saben Python (o Perl o Ruby, o ….), Van a perder mucho tiempo tratando de resolver los problemas de secuencias de comandos como en Java.
Pero Python es muuuuy lento
Python es un lenguaje interpretado, y esto se le añade algo de sobrecarga. Los límites dinámicos de cheques, tipos dinámicos y otras cosas Python inteligente redúzcalos aún más. Python puede ser órdenes de magnitud más lento que el código C equivalente. Sin embargo
- Muchas, muchas aplicaciones no están obligados calcular. Para usar un lenguaje de alto rendimiento para ellos ejemplifica el pecado de optimización temprana.
- interfaces Python así a C – enormes ganancias se pueden hacer mediante la codificación de las secciones críticas en C
- El ahorro de tiempo de codificación en Python, y la mucho mayor simplicidad del código escrito, permite mucho más tiempo para la experimentación en los algoritmos más eficientes – a menudo mucho más fructífera que la simple ejecución de un algoritmo mal muy rápidamente.
Conclusión
C y Java son importantes para los idiomas – los conceptos que encarnan, para las perspectivas de empleo, y para las clases de problemas de los que solucionan. Los estudiantes deben tener una base sólida en estos idiomas. Ellos sin embargo no forman un arsenal suficiente para que el programador profesional – un buen “lenguaje de programación” es una necesidad – ni son buenos idiomas para enseñar a los estudiantes nuevos en la programación. Tienen una gran cantidad de obstáculos fijos y otros que tienen una gran parte del placer, y hacer que tanto el alumno y de puestos de trabajo del profesor más difícil de lo que debería ser.
Hay personas que argumentan que los impedimentos son parte de la disciplina de la programación – los estudiantes deben aprender a coger sus excepciones, utilizan punteros, declaran todos sus tipos y así sucesivamente. Tal vez, tal vez no – pero no hay tiempo para eso más tarde. Vamos a dejar que los estudiantes tienen la simple alegría de los pequeños éxitos que nosotros (así, “I” de todos modos) teníamos cuando estábamos empezando. Patrick Jordan – [email protected] – 2004-12-14
PostScript (febrero de 2006)
Aparte de los comentarios anteriores, un gran número de personas que me escribió después de este artículo apareció en el diario Python para señalar que había una manera más sencilla de hacerlo en Python:
a = input ()
b = input ()
c = a + b
c impresión
%> Add.py pitón
(varios forros uno como ‘de entrada de impresión () + (entrada) también fueron sugeridos y funcionan igual de bien pero yo diría son menos útiles para fines de enseñanza). Además, puesto que la entrada () acepta cualquier expresión válida en Python, este programa solo funciona para una amplia gama de entradas – enteros, flotadores, cuerdas (que va a concatenar ellos – pero tenga en cuenta que deben estar entre comillas demás van a ser interpretadas como los nombres de variables) o expresiones tales como “3.14 ** 2”. Una prueba más, como si fuera necesario, de la belleza de Python.
Recent Comments