Une comparaison très rapide des langages populaires pour l’enseignement de la programmation informatique

Posté le février 13, 2018 à 5:36

Une comparaison très rapide des langages populaires pour l’enseignement de la programmation informatique

Dans le département CS où j’enseigne actuellement, j’ai récemment participé à un débat sur le langage de programmation qui devrait être utilisé pour enseigner aux débutants. Java et C sont les langues les plus couramment utilisées dans le département, et pour beaucoup de sujets c’est approprié, mais pas (je crois) pour les débutants absolus. Je crois que Python est un choix bien meilleur pour les débutants, et pour raffermir ma propre position, j’ai effectué le test très court, très peu scientifique décrit ci-dessous.


Le test

Je voulais regarder ce qui était impliqué dans l’écriture de programmes très simples dans une (petite) variété de langues. Les langages que j’ai choisies étaient BASIC, C, Java et Python. J’ai utilisé C et Java parce qu’ils sont couramment utilisés dans le département (et dans d’autres institutions d’enseignement.) J’ai choisi Python parce que je l’aime, et je pense que c’est un excellent choix pour l’enseignement, et j’ai choisi BASIC parce que facile….
« Hello World » semblait un peu trop trivial, alors j’ai décidé de lire deux nombres de l’utilisateur, de les additionner et d’imprimer le résultat. Mon intérêt était

• Combien de temps a-t-il fallu pour écrire et déboguer le code ?
• Combien de choses un élève doit-il comprendre pour écrire ce code ?

Les heures données pour rédiger le code ne sont évidemment pas censées représenter le temps requis par un étudiant, mais je crois qu’elles donnent une mesure à peu près exacte de la comparaison. Je suis raisonnablement qualifié (1-5 ans d’expérience professionnelle) dans chaque langue, donc je ne pense pas que j’étais déraisonnablement biaisé.


BASIC

J’ai appris à programmer, à la fin des années 70, sur un TRS-80 de niveau I, et sur un système de partage de temps auquel mon école secondaire avait un accès occasionnel. Le programme est trivial en bon vieux BASIC :
10 INPUT A
20 INPUT B
30 C=A+B
40 PRINT C
RUN

Temps d’écriture :
15 secondes J’avoue que je n’ai pas d’interprète BASIC à portée de main et je n’ai pas testé cela, mais je sais juste que ça fonctionne. (OK, j’ai lancé l’émulateur TRS-80 et l’ai exécuté – ça marche …)

Choses à expliquer :

• Numéros de ligne
• Variables
• INPUT
• PRINT
• RUN

Avantages et inconvénients

BASIC est très facile à utiliser pour les débutants, mais c’est un vieux langage mal conçu, qui manque de presque toutes les fonctions modernes. Visual BASIC ajoute beaucoup à « bon vieux BASIC », mais il n’est pas approprié (je crois) d’enseigner un langage propriétaire à plate-forme unique. Et ce n’est toujours pas vraiment un bon langage …


C

#include <stdio.h>

int main(int argc, char*argv[])
{
int a,b,c;


scanf("%d",&a);
scanf("%d",&b);


c = a+b;
printf("%d\n",c);
}


%> gcc -o add add.c
%> ./add

Temps d’écriture :
environ trois minutes, y compris le débogage.

Choses à expliquer:

• #include, fonctions (main), types de retour, argc, argv
• variables, types (int)
• scanf (et bientôt ses limites et comment les contourner)
• printf, formatage des chaînes
• pointeurs (déjà !!)
• compilation, accolades et points-virgules

Avantages et inconvénients

C a été conçu par les meilleurs pirates informatiques pour leur propre usage. Il a été conçu pour écrire des systèmes d’exploitation, des compilateurs et d’autres outils système, et dans ce rôle, il est devenu presque totalement dominant.
Il peut fournir d’excellentes performances (en supposant un bon choix d’algorithme et de bonnes compétences C) et permet un accès matériel de bas niveau, mais ce ne sont normalement pas des choses requises pour le débutant. L’utilisation de pointeurs par C est une source de frustration et de confusion pour les débutants, mais ils sont essentiels même dans des programmes assez triviaux (comme celui ci-dessus, quoique de manière insignifiante).

De plus, la manipulation des chaînes de caractères de C est faible comparée à beaucoup d’autres langages modernes (la fonction scanf utilisée ci-dessus est notoirement problématique).

C est un langage majeur et très important, et tous les programmeurs devraient y avoir une exposition significative. C’est cependant un langage terrible pour enseigner aux débutants. Il y a trop de C à expliquer, ce qui laisse moins de temps pour expliquer la programmation.


Java

import java.io.*;
public class Addup
{
static public void main(String args[]) {
InputStreamReader stdin = new InputStreamReader(System.in);
BufferedReader console = new BufferedReader(stdin);
int i1 = 0,i2 = 0;
String s1,s2;
try {
s1 = console.readLine();
i1 = Integer.parseInt(s1);
s2 = console.readLine();
i2 = Integer.parseInt(s2);
}
catch(IOException ioex) {
System.out.println("Input error");
System.exit(1);
}
catch(NumberFormatException nfex) {
System.out.println("\"" + nfex.getMessage() + "\" is not numeric");
System.exit(1);
}
System.out.println(i1 + " + " + i2 + " = " + (i1+i2));
System.exit(0);
}
}
%> javac Addup.java
%> java Addup

Temps d’écriture:

19 minutes! En fait, j’ai passé environ 15 minutes, a échoué, puis fouillé Google pour un exemple. Le code ci-dessus est copié à partir d’une page Web, qui, pensais-je, commence par les mots « On pourrait penser qu’un programme qui lit dans deux entiers entrés par l’utilisateur et imprime leur somme serait un simple morceau de code ».

Évidemment, ce code n’est pas parfaitement équivalent aux autres programmes présentés ici car il permet de vérifier les erreurs, mais Java rend difficile la vérification des erreurs. Vous devez attraper les exceptions, et après les avoir attrapés, vous pourriez aussi faire quelque chose avec eux.

Je suis en quelque sorte embarrassé, j’ai eu tellement de problèmes avec ça – j’ai travaillé sur un paquet Java commercial pendant deux ans, mais parce que c’est basé sur l’interface graphique, j’ai rarement à faire avec la console. Les vrais programmeurs Java me regarderont probablement avec un mélange de pitié et de dégoût. C’est la vie.

Choses à expliquer

• import, classes, accolades et points-virgules
• public, static, void, String, arguments principaux []
• InputStreamReader, BufferedReader, System.in
• variables, types
• try, catch, exceptions, readLine, parseInt
• System.out.println, compilation, exécution

Avantages et inconvénients

Java est un langage utile pour le développement de l’interface graphique multiplateforme, est une plate-forme robuste pour le développement OO, et dispose d’un ensemble étendu et hautement évolué de bibliothèques de classes. Peut-être plus important encore, c’est la langue la plus populaire autour et il y a beaucoup d’emplois pour les programmeurs Java.
La bibliothèque de classe étendue est cependant assez décourageante. Il semble y avoir une classe pour presque tout, et une grande partie de la « programmation en Java » semble consister à « chercher la bonne classe ». Même après deux ans, je trouve que je ne peux pas faire grand chose en Java sans référence constante à la documentation.

Java impose l’orientation de l’objet, la vérification des exceptions et le typage strict – ce sont toutes (sans doute) de bonnes choses – elles permettent à un groupe de programmeurs de créer des systèmes volumineux plus facilement. Mais pour les petits problèmes (tels que ceux rencontrés dans les classes de programmation d’introduction) ces choses ne deviennent rien de plus qu’un fardeau compliqué et chronophage.

La seule raison de l’emploi est suffisante pour faire de Java un langage « incontournable », mais je crois que nous rendons un mauvais service à nos étudiants si c’est la meilleure langue que nous leur montrons.


Python

import sys

a = sys.stdin.readline()
b = sys.stdin.readline()
c = int(a) + int(b)
print c


%> python add.py

Temps d’écriture :

Environ une minute, y compris les tests et le débogage.

Choses à expliquer

• import
• variables
• sys.stdin
• readline (lit une chaîne)
• int (convertit une chaîne en entier)
• print

Avantages et inconvénients

Python a énormément de bons points:

• applique un bon style de programmation (l’indentation est significative)
• OO disponible mais non appliqué
• Exceptions utilisées mais non appliquées
• n’est pas un jouet ou une langue académique – beaucoup de travail dans le monde réel est fait en Python
• permet de se concentrer sur les algorithmes et les problèmes, pas sur les caractéristiques du langage et les défauts.
• est multiplateforme et dispose d’un ensemble puissant de bibliothèques
• est sûr – il a une vérification de type de temps d’exécution dynamique et une vérification des limites sur les tableaux
• a de puissants types de données intégrés – dictionnaires, listes, séquences, fonctions, ensembles (en 2.4)
• possède de puissantes structures de contrôle intégrées – une simple boucle sur les séquences, la carte, les générateurs, les compréhensions de listes, les expressions régulières …
• nécessite moins de lignes de code pour un problème donné, et est plus lisible – donc une plus grande productivité.

Pour l’enseignement en tant que première langue, cependant, il présente des avantages spécifiques. Comme on peut le voir dans les exemples ci-dessus (en ignorant BASIC), Python nécessite moins de temps, moins de lignes de code, et moins de concepts à enseigner pour atteindre un objectif donné. Cela permet de consacrer plus de temps aux choses importantes. De plus, certaines erreurs communes aux élèves sont complètement classées dans Python :

• la fin de la ligne est la fin de la ligne (aucun point-virgule oublié)
• aucune déclaration de type
• structure de bloc vraie toujours évidente (pas d’erreur d’accolades manquante)
• allocation de mémoire dynamique et récupération de place

Enfin la programmation en Python est amusante! Le succès amusant et fréquent engendre la confiance et l’intérêt pour l’élève, qui est alors mieux placé pour continuer à apprendre à programmer.

Mais Python est juste un langage de script

Python est souvent rejeté comme « juste un langage de script » (Perl et Ruby souffrent aussi de cette bigoterie stupide). C’est simplement incorrect. Ce n’est pas « juste un langage de script » – c’est un langage complet de très haut niveau qui est idéal pour de nombreuses applications, y compris les tâches de script simples.
Le fait que vous puissiez écrire des scripts « rapides et sales » en Python est un avantage, pas un inconvénient, puisque le script est en fait une partie essentielle de la programmation professionnelle. Si les étudiants ne connaissent pas Python (ou Perl, ou Ruby, ou …), ils perdront beaucoup de temps à essayer de résoudre des problèmes de type script en Java.

Mais Python est Slooooooow

Python est un langage interprété, et cela ajoute un peu de surcharge. La vérification dynamique des limites, le typage dynamique et d’autres choses intelligentes de Python le ralentissent encore plus. Python peut être plus lent que le code C équivalent. Toutefois

• De nombreuses applications ne sont pas liées au calcul. Utiliser un langage haute performance pour eux illustre le péché d’optimisation précoce.
• Python s’interface bien avec C – des gains énormes peuvent être réalisés en codant des sections critiques en C
• Le temps gagné en codant en Python, et la plus grande simplicité du code écrit, permettent beaucoup plus de temps pour l’expérimentation dans des algorithmes plus efficaces – souvent beaucoup plus fructueux que de simplement exécuter un mauvais algorithme très rapidement.


Conclusion

C et Java sont des langages importants – pour les concepts qu’ils incarnent, pour les perspectives d’emploi, et pour les classes de problèmes qu’ils résolvent. Les étudiants doivent recevoir une connaissance approfondie de ces langues. Ils ne forment cependant pas un arsenal suffisant pour le programmeur professionnel – un bon « langage de script » est un must – et ils ne sont pas de bonnes langues pour enseigner aux nouveaux venus en programmation. Ils ont beaucoup de surcharge et d’autres obstacles qui ne permettent pas beaucoup de plaisir, et rendent les tâches de l’étudiant et de l’enseignant plus difficiles qu’elles ne devraient l’être.
Il y a des gens qui diraient que les obstacles font partie de la discipline de la programmation – les élèves doivent apprendre à attraper leurs exceptions, utiliser des pointeurs, déclarer tous leurs types et ainsi de suite. Peut-être, peut-être pas – mais il y a le temps pour ça plus tard. Laissons les étudiants avoir la joie simple de petits succès que nous (bien, « moi » de toute façon) avions quand nous étions en train de commencer. Patrick Jordan – patrick@ariel.com.au – 2004-12-14.


Postscript (février 2006)

Mis à part les commentaires ci-dessus, un grand nombre de personnes m’ont écrit après que cet article est apparu sur Daily Python pour souligner qu’il y avait une façon plus simple de le faire en Python :

a = input()
b = input()
c = a + b
print c


%> python add.py

(Plusieurs lignes comme ‘print input() + input()’ ont aussi été suggérées et fonctionnent aussi bien mais je dirais qu’elles sont moins utiles à des fins d’enseignement). De plus, puisque input() accepte toute expression Python valide, ce programme fonctionne uniquement pour toute une gamme d’entrées – ints, floats, strings (il les concaténera – mais notez qu’elles doivent être entre guillemets sinon elles seront interprétées comme noms de variables) ou des expressions telles que « 3.14 ** 2 ». Autre preuve, comme si nécessaire, de la beauté de Python.

Commentaires

J’ai reçu un certain nombre de commentaires sur ce sujet, notamment sur les langues que je n’ai pas mentionnées (Ruby, C ++, Smalltalk, LISP) …

Source : http://www.ariel.com.au/a/teaching-programming.html