Un logiciel libre, c’est quoi ?

lundi 13 juillet 2009
par  Alain BUSSER

Dans cet article, on propose un sujet de TP d’algorithmie en Seconde, portant sur les sujets suivants :

  • Affectation de variables
  • Entrée de données (par formulaire)
  • Affichage de sorties
  • Notion de fonction à deux variables
  • Révisions de géométrie (formules)

Comme deuxième TP de l’année scolaire en Seconde, j’ai imaginé l’énoncé suivant :

Écrire un programme qui réalise les opérations suivantes :

  1. Demander à l’utilisateur de fournir deux données : Un rayon et une hauteur, en centimètres.
  2. Calculer, à partir de ces données, le volume d’un cône dont la base a pour rayon, celui entré par l’utilisateur, et de hauteur, celle fournie par l’utilisateur.
  3. Afficher le volume, en centimètres cubes, arrondi au millimètre cube près.

On peut voir en passant que tout en algorithmique peut me servir de prétexte à faire des révisions de géométrie mais c’est une autre histoire [1]. Pour l’évaluation du TP, je pense créer un fichier sur tableur avec cases à cocher par moi pendant le TP, et dont un modèle pourrait être celui-ci :

Élève entrée de données Calcul du volume sait arrondir connaît le lien entre $cm^3$ et $mm^3$ affichage commentaires
Ali
Béatrice
Cheng
Deborah

Ainsi en multipliant par 4 le nombre de cases cochées dans les 5 premières colonnes, j’ai une note sur 20, la dernière colonne étant considérée comme un bonus.


Production attendue des élèves

Voici à quoi pourrait ressembler le programme créé par un élève (ou binôme) avec l’outil JavaScript en ligne :

var r=demander("Quel est le rayon de la base, en centimètres ?");
var h=demander("Quel est la hauteur du cône, en centimètres ?");
var v=Math.PI*Math.pow(r,2)*h/3;
afficher("Le volume de ce cône est ",v.toFixed(3),"cm³");

Et à titre de comparaison, la version « CarScript », laquelle a soit dit en passant été encore plus rapide à mettre au point :

r=Input("Quel est le rayon de la base, en centimètres ?");
h=Input("Quelle est la hauteur du cylindre, en centimètres ?");
v=Math.PI*Math.pow(r,2)*h/3;
Prompt("Le volume du cône est "+v.toFixed(3)+" cm³");

La colonne « commentaires » appelle un commentaire : Lorsqu’un étudiant en algorithmique est chargé de produire un programme, on lui demande régulièrement d’améliorer sa lisibilité en l’indentant et en le commentant. Dans cet esprit, une amélioration du code précédent serait alors la suivante :

var r=demander("Quel est le rayon de la base, en centimètres ?")
//la base est un disque;
var h=demander("Quel est la hauteur du cône, en centimètres ?");
//on demande un nombre en centimètres
var v=Math.PI*Math.pow(r,2)*h/3;
//volume=base*hauteur/3
afficher("Le volume de ce cône est ",v.toFixed(3),"cm³");
//arrondi à 3 décimales

Dans le cas présent, les commentaires ne sont pas vraiment indispensables à la lisibilité du programme, mais lorsque les boucles et tests sont représentés par des indentations ou accolades, la présence après une accolade fermante d’un commentaire comme « fin de la boucle tant que » améliore très considérablement la lisibilité du programme. Or, si la tâche confiée à l’élève est la production de ce qui est ci-dessus, ma tâche à moi est de juger cette production, et la présence de ces fameux commentaires facilite suffisamment cette tâche pour la rendre possible, et justifie qu’on en fasse un bonus. Citons le programme de Seconde :

À l’occasion de l’écriture d’algorithmes et de petits programmes, il convient de donner aux élèves de bonnes habitudes de
rigueur et de les entraîner aux pratiques systématiques de vérification et de contrôle.

Justement, la présence de commentaires dans un programme est une habitude de rigueur [2].

En fin d’année

Il est très possible de revenir à cet exemple lorsqu’on a vu les boucles à sortie conditionnelle, pour garantir que l’utilisateur fournit bien un nombre pour le rayon, et pas du texte ou une liste ou autre :

var r=Number.NaN;
while(isNaN(r))
{r=demander("Quel est le rayon de la base, en centimètres ?");}
var h=Number.NaN;
while(isNaN(h))
{h=demander("Quel est la hauteur du cône, en centimètres ?");}
var v=Math.PI*Math.pow(r,2)*h/3;
afficher("Le volume de ce cône est ",v.toFixed(3),"cm³");

Ce programme commence par réclamer que l’utilisateur lui fournisse le rayon de la base, jusqu’à ce que ce rayon soit un nombre. Dans l’ancienne version, le programme donnait un volume égal à « NaN », c’est-à-dire non numérique. Cette amélioration n’est pas forcément l’objet d’un TP, elle peut être juste une illustration de ce qu’est une boucle à sortie conditionnelle.


Rôle du professeur

Pour évaluer le programme produit par l’élève, le professeur devra

  1. Lire le script écrit par l’élève ;
  2. Tester le programme, donc, l’utiliser.

Or le programme en question est une création de l’esprit. Elle est donc soumise à une législation sur les droits d’auteur, dont le bénéficiaire est l’élève. Dit d’une autre manière, l’élève ayant créé un programme, en est le propriétaire. Et le professeur n’est même pas certain d’avoir le droit de lire cette création. Dans une situation un peu caricaturale, un élève pourrait très bien chercher à me vendre le programme qu’il a créé, et ne m’autoriser à tester (à fin d’évaluation) ledit programme que si je l’ai acheté ! Plus sérieusement, n’étant pas moi-même un génie de l’informatique, je ne peux pas exclure la possibilité que pour faire un exercice en cours de maths, un élève invente un algorithme innovant pour lequel il pourrait avoir intérêt à déposer un brevet logiciel. Ce n’est nullement irréaliste, que l’on songe à la relative simplicité des algorithmes de multiplication rapide comme l’algorithme de Karatsuba ou l’algorithme de Schönhage-Strassen, à l’intérêt commercial et stratégique que représente le kryptage de Rivest Shamir Adleman ou l’algorithme mp3...

Même si un tel évènement est très peu probable, il n’est pas totalement impossible et la prudence m’incite alors à garantir que

  1. la loi m’autorise à consulter le travail algorithmique de mes élèves, pour avoir la possibilité matérielle de leur donner une note ;
  2. la même loi m’empêche, moi ou quelqu’un d’autre, de leur voler leur travail.

Bref j’ai besoin d’un cadre juridique qui me protège et qui protège mes élèves.

Ce cadre juridique existe, il s’appelle un copyleft, et est régi par des licences dont la plus répandue est la GnuGPL, ou Licence publique générale GNU.

Où est-ce que tout ceci nous mène ? À ce que pour pouvoir faire un TP dans de bonnes conditions (notamment la publication en ligne des chefs-d’œuvre de mes élèves), j’ai intérêt à placer la moindre ligne écrite par ceux-ci (même boguée) ainsi que mes corrigés sous la license GPL3.0 tout en garantissant pour l’avenir un placement sous d’éventuelles améliorations de cette license, ce qui se fait en donnant comme référence à la license, le texte « GPL 3.0 ou ultérieure ». Si les élèves enregistrent leur travail dans un document texte appelé « TP_numéro2.js », il serait bon qu’un préambule y soit ajouté sous forme de « commentaire » portant un texte de ce type :

Programme calcul de volume
Ce programme calcule des volumes de cônes
Auteur: Laura Lauret
Date: 12 novembre 2009
Ce programme est libre, placé sous license GPL 3.0 ou ultérieure.
Le texte de la license se trouve à l'adresse suivante:
http://www.gnu.org/licenses

(pour écrire des commentaires sur plusieurs lignes, en JavaScript on utilise les symboles « /* » et « */ ». En Python c’est trois fois le symbole « guillemets » pour le début du commentaire, et la même chose pour la fin du commentaire : «  »« commentaire long »«  ». En Scratch on met tout le commentaire dans un texte (icône tout en haut à droite).

Et comme le professeur est censé montrer l’exemple, il devrait mettre ses corrigés sous la même forme, ce qui avec l’exemple ci-dessus donnerait ceci :

/*
Programme volume du cône
Ce programme calcule des volumes de cônes,
l'utilisateur entre des données: rayon de la base, et hauteur
Auteur: Alain Busser
Date: 13 juillet 2009
Ce programme est libre, placé sous license GPL 3.0 ou ultérieure.
Le texte de la license se trouve à l'adresse suivante:
http://www.gnu.org/licenses
*/

var r=Number.NaN;
while(isNaN(r))
{r=demander("Quel est le rayon de la base, en centimètres ?");}
var h=Number.NaN;
while(isNaN(h))
{h=demander("Quel est la hauteur du cône, en centimètres ?");}
var v=Math.PI*Math.pow(r,2)*h/3;
afficher("Le volume de ce cône est ",v.toFixed(3),"cm³");

Évidemment lorsque le texte sur la license est plus long que le programme proprement dit, tout ceci paraît un peu ridicule. Mais on arrivera vite à des programmes plus longs que ça, et ... il convient de donner aux élèves de bonnes habitudes de rigueur...


Où est l’autoréférence dans tout ça ?

En dehors du fait que si mes élèves lisent cette page, ils ont directement le corrigé du TP [3], il va de soi que, si donner à ses élèves dès le début, des habitudes liées au monde des logiciels libres, car c’est quand même de ça qu’on parle l’air de rien depuis le début de cet article, le professeur est le mieux placé pour montrer l’exemple, en utilisant systématiquement des logiciels eux-mêmes placés sous license GPL, c’est-à-dire libres.

Et au moins le TP doit se dérouler avec des outils libres : L’élève doit écrire un programme dont le code source est ouvert, et il est tout de même préférable qu’il le fasse en utilisant un environnement lui-même ouvert : La voilà, l’autoréférence ! L’important n’est pas que l’élève regarde le source de l’interpréteur ou du compilateur, mais simplement qu’il ait la possibilité de le faire. Sur ce forum, on peut lire un conseil concernant l’environnement IDLE pour Python, qui est écrit ... en Python !

Le gain en algorithmique est conséquent : Quiconque a essayé de savoir comment Excel calcule des nombres pseudo-aléatoires, a fini par renoncer (d’ailleurs c’est illégal...). Alors qu’avec un logiciel libre comme OpenOffice, il « suffit » de télécharger le source, puis de l’ouvrir avec un éditeur de texte, et de lire le source. Apprendre « comment ça marche » est très formateur, et peut donner des idées. Des codes sources particulièrement lisibles (et comme par hasard, ils sont très commentés) sont selon moi celui de Yacas (calcul formel, écrit en Scheme qui est une variante de LISP) et celui de CaRMetal (géométrie dynamique, écrit en Java).

Comme la license GPL m’y autorise, je reproduis ici des extraits de ces suberbes codes sources : Un peu de Yacas d’abord (nombres pseudoaléatoires) :

// second method: update state object and return a new random number (floating-point)
RNGEngine'L'Ecuyer(state_IsList) <--
[
	Local(new'state, result);
	new'state := {
		Mod(1403580*state[2]-810728*state[3], 4294967087), state[1], state[2],
		Mod(527612*state[4]-1370589*state[6], 4294944433), state[4], state[5]
	};
	result:=Mod(state[1]-state[4], 4294967087);
	{
		new'state,
		MathDivide(If(result=0, 4294967087, result), 4294967088)
	};
];

Magnifique, non ? On y voit immédiatement des tests de primalité à effectuer ! Passons à un extrait de CaRMetal (calcul d’un vecteur normal, dans le dessin d’une courbe cartésienne) :

// coords du vecteur unitaire directeur de (M1M2) :
double lg = Math.sqrt((xm2 - xm1) * (xm2 - xm1) + (ym2 - ym1)* (ym2 - ym1));
double dx = (xm2 - xm1) / lg;
double dy = (ym2 - ym1) / lg;

// coords du point H projeté ortho de P sur (M1M2) :
final double h = (xx - xm1) * dx + (yy - ym1) * dy;
final double xh = xm1 + h * dx;
final double yh = ym1 + h * dy;

// coords du vecteur unitaire directeur de (HP) :
lg = Math.sqrt((xx - xh) * (xx - xh) + (yy - yh) * (yy - yh));
dx = (xx - xh) / lg;
dy = (yy - yh) / lg;

Excellente illustration du cours sur les produits scalaires (pas en Seconde donc) !


Hérédité du copyleft

Puisqu’un programme placé sous les termes de la license GPL est libre, on a le droit, sous certaines restrictions, d’en prendre des morceaux et de les incorporer à son propre projet, ce qui évite d’avoir à tout réinventer à chaque fois. Il y a deux restrictions « évidentes » :

  1. Le morceau de code puisé ailleurs, l’est avec le nom de son auteur : On n’a pas le droit de prétendre en être l’auteur ;
  2. Le morceau de code doit rester sous license GPL, et du coup le tout doit l’être : Si un employé de Adobe est émerveillé par un filtre du Gimp ou de ImageJ et souhaite l’incorporer à la prochaine version de PhotoShop, il n’en a le droit qu’en faisant de PhotoShop un logiciel libre, ce qui n’est pas possible parce que dans ce cas, les autres contributeurs devraient tous mettre leurs contributions sous license GPL, hypothèse peu vraisemblable...

On dit que la license GPL est héréditaire et contaminante. Il semble alors que tout programme rédigé avec un outil libre est automatiquement libre sous GPL d’après le droit américain au moins, et que dans ce cas la référence à la license GPL 3.0 faite ci-dessus est inutile. On peut quand même la garder, ça ne fait pas de mal.

Phénomène significatif : Tout en bas de la page 5 du document d’accompagnement « Ressources pour la classe » d’algorithmique, on lit une note que je ne cite pas puisqu’elle n’est pas placée sous copyleft [4], et qui montre une confusion entre « libre » et « gratuit ». Trouver cette confusion dans un document officiel rend tout de même assez songeur... Un logiciel gratuit mais pas libre, c’est comme un livre qu’on offrirait à tout le monde en n’autorisant que certains à le lire. Un logiciel libre, c’est un livre avec des marges assez grosses pour qu’on puisse non seulement le lire mais l’annoter à volonté. Un tel livre peut d’ailleurs très bien être vendu, comme le montre l’exemple des manuels Sésamath.


Cocorico

La license GPL n’est pas la seule qui existe, il y en a une qui est française, et donc peut-être mieux adaptée au cas présent : La license CeCILL dont le texte figure en suivant ce lien. On y trouve l’extrait suivant qui est une bonne description du travail d’un prof de maths de Seconde :

Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant aux domaines d’application, étant ci-après précisé que cela comporte :

1. la reproduction permanente ou provisoire du Logiciel en tout ou partie par tout moyen et sous toute forme.

2. le chargement, l’affichage, l’exécution, ou le stockage du Logiciel sur tout support.

3. la possibilité d’en observer, d’en étudier, ou d’en tester le fonctionnement afin de déterminer les idées et principes qui sont à la base de n’importe quel élément de ce Logiciel ; et ceci, lorsque le Licencié effectue toute opération de chargement, d’affichage, d’exécution, de transmission ou de stockage du Logiciel qu’il est en droit d’effectuer en vertu du Contrat.

Finalement, l’exemple ci-dessus devient dans ce cas :

Programme calcul de volume
Ce programme calcule des volumes de cônes
Auteur: Laura Lauret
Date: 12 novembre 2009
Ce programme est libre, placé sous license CeCILL.
Le texte de la license se trouve à l'adresse suivante:
http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html
var r=demander("Quel est le rayon de la base, en centimètres ?")
//la base est un disque;
var h=demander("Quel est la hauteur du cône, en centimètres ?");
//on demande un nombre en centimètres
var v=Math.PI*Math.pow(r,2)*h/3;
//volume=base*hauteur/3
afficher("Le volume de ce cône est ",v.toFixed(3),"cm³");
//arrondi à 3 décimales

[1Le tout premier commentaire de la partie « Géométrie dans l’espace » du programme de Seconde se trouve à la page 8 de celui-ci

[2qu’il me reste encore à acquérir mais mon cas personnel n’est pas un exemple à suivre...

[3C’est l’inconvénient des outils en ligne, qui ouvrent la possibilité d’utiliser discrètement un moteur de recherche pendant le TP...

[4la citer serait une « reproduction même partielle » du document, soumise à l’autorisation du directeur général de l’Enseignement Scolaire.


Commentaires

Logo de Dominique TOURNÈS
lundi 13 juillet 2009 à 18h45 - par  Dominique TOURNÈS

Une petite remarque juridique : Alain avait tout à fait le droit de citer la note de la page 5 du document ressource sur l’algorithmique. Dans un tel cas, il ne s’agit pas d’une « reproduction partielle », mais d’une « courte citation », permise par le code français de la propriété intellectuelle, qui dit exactement : « Lorsque l’œuvre a été divulguée, l’auteur ne peut interdire […] sous réserve que soient indiqués clairement le nom de l’auteur et la source [...] les analyses et courtes citations justifiées par le caractère critique, polémique, pédagogique, scientifique ou d’information de l’œuvre à laquelle elles sont incorporées ». Voici donc cette note pour les lecteurs curieux : « Tous les logiciels qui seront présentés par la suite sont « libres » au moins au sens où leur téléchargement l’est ».