Ci-dessous le brouillon, un encadré où apparaissent les résultats affichés par des algorithmes que l'on exécute.

L'algorithme,
objet de tous les fantasmes

L. Robin

Ingénieur ECP spécialisé en Informatique
Professeur agrégé de Mathématiques

Cet article a été essentiellement mis au point d'octobre 2018 à janvier 2019 suite à une demande de Guy MOREL, secrétaire et membre fondateur du GRIP, décédé le 24 février 2019. Je le dédie à sa mémoire, celle de l'ami et du collègue, celle d'un homme qui a toujours combattu l'obscurantisme et les dérives de l'enseignement. Il a donc été publié via le site du GRIP.

Introduction

En quelques années le mot algorithme est devenu une sorte de totem, connu de tout le monde via des articles de presse qui disent absolument tout et n'importe quoi, surtout dans l'objectif de faire peur, confondant allégrement les algorithmes avec les logiciels, en particulier ceux dits d'intelligence artificielle, ce qui n'a rien à voir, ou si peu.

Alors soit on crie au génie, soit on tremble d'effroi, de façon irrationnelle.

On a même pu voir paraître en 2016 un ouvrage de Cathy O'Neil, au titre éloquent : Weapons of Math Destruction (Armes de Destruction Mathématique). Il est paru en français en 2018 sous un titre aussi percutant, Algorithmes : la bombe à retardement, mais en évacuant curieusement les mathématiques de l'annonce apocalyptique. L'ouvrage traduit étant préfacé par Cédric Villani, l'escamotage pose question… Chacun peut s'en poser en effet, en lisant un simple extrait de son introduction (c'est Cathy O'Neil qui parle) :

Mais à l'automne 2008, un peu plus d'un an après mon arrivée, tout s'est brusquement effondré.

Le krach financier a révélé avec la plus grande clarté que les mathématiques, mon refuge de toujours, étaient non seulement intimement mêlées aux problèmes du monde, mais alimentaient également nombre d'entre eux. En récitant leurs formules magiques, les mathématiciens s'étaient rendus complices de la crise de l'immobilier, de la chute d'institutions financières majeures, de la montée du chômage. Grâce aux extraordinaires pouvoirs que je vénérais tant, les mathématiques s'étaient associées à la technologie pour décupler le chaos et le malheur, conférant une ampleur et une efficacité redoutables à des systèmes que je savais désormais défectueux.

On pourrait alors philosopher sur la responsabilité des concepteurs d'outils (matériels ou conceptuels) dans l'usage qu'on en fait, la guerre en particulier, mais là n'est pas notre propos.

On est malgré tout enclin à se demander quel est le lien entre les Mathématiques et l'Algorithmique, surtout lorsqu'on sait que cette dernière fait partie de l'enseignement des Mathématiques en Seconde depuis les programmes de 2009 au lycée et même au collège depuis 2015 (cycle 4), surtout avec l'application des nouveaux programmes depuis septembre 2019.

Bref, le mot algorithme est mis à toutes les sauces de l'enseignement et des médias, sans que le béotien puisse comprendre finalement de quoi on parle, alors que ce dernier peut être parent d'un élève à même de l'utiliser régulièrement, en classe et dans son travail à la maison.

Rassurons tout de suite le lecteur : un algorithme n'est en rien un emblème porteur d'un pouvoir destructeur de quoi que ce soit, même par le truchement des Mathématiques.

Mais alors pourquoi tant de passion autour d'un mot si galvaudé ? Que signifie-t-il en réalité ?

Comme nous allons le voir, c'est un mot dont la popularité prend sa source dans celle de la programmation, donc avec l'avènement des machines programmables qu'on appelle désormais ordinateur, tablette, smartphone ou calculatrice.

Mais alors quel rapport avec les Mathématiques et son enseignement du CP à la Terminale ?

L'objectif de cet article est donc triple : préciser la notion d'algorithme, somme toute élémentaire, expliquer le lien entre l'algorithmique, la programmation et les logiciels et enfin montrer que si le lien entre l'algorithmique et les Mathématiques est important dans une acception du terme en tant que science particulière, il est insignifiant dans une pratique liée à la programmation, même si celle-ci peut être courante dans la résolution de problèmes.

Les explications fournies étaieront alors une conclusion sous forme d'une critique des programmes de Mathématiques de Seconde qui incluent l'algorithmique dans leur propos, c'est à dire celui de 2009 originellement, son aménagement de 2017 et le texte officiel paru en janvier 2019 et appliqué à partir de la rentrée de septembre 2019.

Le mythe du dieu Algorithme, en un mot

Un mot d'origine modeste

Comme on peut le découvrir aisément dans le TLFi, le mot algorisme désignait au XVIe siècle le procédé de calcul arithmétique avec les chiffres arabes. Ensuite le mot algorithme a été utilisé juqu'au XVIIIe siècle dans le sens de procédé arithmétique, ou encore pour désigner la pratique de l'algèbre, comme on le constate dans l'Encyclopédie de Diderot :

ALGORITHME, s. m. terme arabe, employé par quelques Auteurs, & singulierement par les Espagnols, pour signifier la pratique de l’Algebre. Voyez Algebre.

Il se prend aussi quelquefois pour l’Arithmétique par chiffres. Voyez Arithmetique.

L’algorithme, selon la force du mot, signifie proprement l’Art de supputer avec justesse & facilité ; il comprend les six regles de l’Aritmétique vulgaire. C’est ce qu’on appelle autrement Logistique nombrante ou numérale. V. Arithmetique, Regle, &c.

Ainsi l’on dit l’algorithme des entiers, l’algorithme des fractions, l’algorithme des nombres sourds.

Un mot lié aux Mathématiques arabes

En fait, la construction de ce mot part d'un premier ouvrage écrit contenant la notion d'algèbre (الجبر : al-jabr en arabe), rédigé au IXe siècle par l'astronome et mathématicien al-Khwarizmi : il y explicitait des procédés de résolution d'équations.

Le nom de ce dernier a ainsi permis aux européens de forger le mot algorithme, disons dès le XIIIe siècle, avec un sens resté très longtemps lié au calcul arithmétique d'une part, et aux méthodes algébriques de résolution des équations simples d'autre part.

Si l'algorithmique reste de nos jours intimement liée aux nombres et à la résolution exacte ou approchée de problèmes mathématiques, il n'en va pas de même pour la programmation, comme nous le verrons plus loin.

Les procédés de calcul arithmétique à la main, qu'on baptise encore de nos jours algorithmes, ont permis à l'ensemble de l'humanité de savoir calculer, surtout à partir de l'ouvrage de Simon Stevin écrit en 1585 : La Disme était une apologie du système décimal.

Comme quoi l'algorithme est historiquement un bienfait, pas un fléau.

Si le mot algorithme est resté confiné pendant des siècles dans les applications des Mathématiques élémentaires (arithmétique et algèbre), il s'est paré d'une autre acception avec l'arrivée des calculateurs électroniques au milieu du XXe siècle.

Un mot qui change de cap

Si son sens moderne a été donné au milieu du XIXe siècle, bien avant l'apparition des calculateurs programmables, il est de nos jours appliqué la plupart du temps à rebours de l'Histoire. Ce qui est clairement expliqué dans l'ouvrage Histoire d'Algorithmes (p. 4 dans l'édition de 1993) :

Bien avant l'apparition d'un terme servant à les désigner, les algorithmes existaient déjà, profondément enracinés dans le désir de transmettre des moyens efficaces pour obtenir certains résultats en partant de certains ingrédients et en les transformant selon des directives simples, appliquées systématiquement, étape par étape.

Ainsi on peut parler de recettes, de règles, de techniques, de procédés, de procédures, de méthodes, un même mot pouvant s'appliquer à des domaines variés.

Ainsi, dans une première approche des algorithmes au sens qui nous intéresse ici, on peut dire qu'un algorithme est la description précise d'un processus permettant de résoudre assurément un problème donné, avec des ressources données, en exploitant un vocabulaire limité et sans ambiguïté. On précisera plus loin cette définition, en lien avec l'Informatique, donc avec la programmation.

Voici un exemple de processus qu'on peut baptiser algorithme, sans machine au sens informatique du terme, et de plus accessible dès 8 ans : la préparation d'une tartine de beurre au goûter. Il est composé d'instructions destinées à un être humain équipé d'une ressource, un couteau, et manipulant du pain et du beurre, des données au sens d'objets concrets.

  1. Prendre un pain.
  2. Couper une tranche de 1,5 cm d'épaisseur (à 5 mm près).
  3. Prendre le beurrier (avec du beurre dedans) et un couteau à beurre.
  4. Tant que la tartine n'est pas couverte de beurre, répéter les instructions suivantes :
    1. Râcler le beurre du beurrier pour en porter sur la tartine.
    2. Étaler le beurre sur la tartine.

Cet exemple hors contexte informatique permet d'introduire néanmoins le vocabulaire de base des algorithmes exploités en Informatique, c'est à dire en programmation, comme on peut le constater en annexe 1.

C'est avec un exemple similaire que le Professeur Jean-Pierre Zanotti, de l'université de Toulon, introduit la notion d'algorithme dans le chapitre I de son cours d'Algorithmique.

Un mot lié à la programmation

En Informatique, plus précisément en programmation, notre première définition du mot reste convenable, en précisant toutefois les choses, car il ne s'agit plus de faire manipuler des objets réels à un humain, mais des objets virtuels à une machine.

Ainsi un algorithme, au sens informatique du terme, peut être défini simplement en s'inspirant fortement de la page 2 de l'ouvrage Petite introduction à l'algorithmique de Pierre Damphousse (Ellipses 2005) :

Un algorithme est une suite déterministe d'opérations, les instructions, à exécuter sur un jeu de données initial qu'il peut faire évoluer.

C'est à dire qu'étant donné une entrée particulière, il produit la même sortie à chaque fois qu'on l'exécute, la machine passant toujours par la même suite d'états pour le jeu de données considéré. En programmation un programme est non déterministe dès qu'il exploite une fonction retournant un nombre aléatoire, comme on peut le constater sur le programme en Javascript suivant composé de deux instructions (à cliquer pour l'exécuter, plusieurs fois pour constater les différences) :
var x = nombre.entier.aléatoire(0,100) ; afficher("Le nombre x vaut " + x + ".") ;

Avant d'imaginer élaborer des algorithmes en Informatique, c'est leur essence même qu'il est fondamental de comprendre. En effet, d'une part ceux-ci exploitent un jeu d'instructions d'une extrême pauvreté au regard de l'extrême diversité des buts à atteindre, et d'autre part nécessite la définiton d'une machine capable de les exécuter sans erreur, avec un nombre limité de données manipulables.

Un mot intimement lié à une machine

En pratique, un algorithme est concrétisé par un programme, c'est à dire une suite d'instructions exécutées successivement par une machine physique, c'est à dire un microprocesseur pour ce qui concerne l'informatique de tous les jours, que ce soit dans un ordinateur, une tablette, un smartphone ou une calculatrice.

La difficulté de mise au point d'un algorithme dépend donc du jeu d'instructions adopté, donc en pratique du langage de programmation utilisé, mais aussi du but qu'on s'est fixé et qu'il faut alors être capable de spécifier.

Même l'algorithme d'une recette de cuisine dépend du matériel disponible, donc de la machine sur lequel on l'exécute. Ainsi lorsqu'on dispose d'un Thermomix, bien des potages, sauces et gâteaux deviennent très simples à réaliser. Ainsi avec ce matériel, spécifier que dans la recette de la pâte à crêpes, on trouve la séquence d’instructions : mettre la farine dans le bol ; faire un puits ; mettre les œufs dans le puits, n'est pas adapté.

Comme on le voit souvent écrit pour illustrer l'introduction d'un cours d'algorithmique. On peut remarquer que cet outil de cuisine est aussi une machine, capable d'exécuter une tâche donnée, programmée à l'aide de touches sur sa façade. Un chef cuisinier saura évidemment tirer parti de tout contexte pour concevoir un algorithme adapté et efficace, que ce soit avec ou sans Thermomix, différent dans chaque cas. Mais n'est pas chef qui veut…

Il est bien connu que, même dans la vie de tous les jours, un même problème est résolu de manière variée selon les ressources disponibles. D'où l'expression courante, conçue au sein des navires à voile : avec les moyens du bord.

Un mot lié à la spécification d'une résolution de problèmes

Il n'y a donc aucune peur à avoir d'un algorithme : il est inoffensif puisque c'est seulement la description d'une suite d'instructions à exécuter dans le but de résoudre un problème précis, avec des ressources données.

En revanche les logiciels, eux, peuvent être nuisibles. Comme par exemple ceux utilisés pour le trading à haute fréquence, pouvant parfois engendrer des crises financières comme celle évoquée par Cathy O'Neil dans son ouvrage, sans même le besoin d'une intervention humaine. Mais ces logiciels ne font qu'utiliser intensivement des notions mathématiques de calcul de statistiques et de probabilités. Ce qui explique peut-être en partie pourquoi, lors de sa traduction en français déjà mentionnée, les mathématiques sont passées sous silence du titre de l'ouvrage, donnant d'emblée le mauvais rôle aux algorithmes. À tort…

On ne peut donc condamner un algorithme comme s'il était nuisible car il n'est que la traduction d'un but à atteindre. Seul ce dernier peut être nuisible, pas les moyens mis en œuvre.

Il nous faut maintenant faire le lien entre les algorithmes et les logiciels : la programmation, seul moyen de produire des logiciels dont l'action peut parfois être considérée comme nuisible.

La programmation, ou algorithmique de M. Jourdain

Nous allons expliquer dans cette section ce qu'il est essentiel de retenir dès à présent, avant d'aborder le contenu des programmes de Seconde qui traitent à la fois d'algorithmique et de programmation. À savoir :

  1. On ne peut définir un langage algorithmique sans définir au préalable une machine théorique. Alors une difficulté conceptuelle supplémentaire se pose. On doit en effet utiliser un langage de bas niveau, en opposition à la simple programmation en un langage usuel de haut niveau, comme Javascript ou Python, qui ne nécessite pas la connaissance intime de la machine sous-jacente.
  2. Pour avoir une idée de la notion de machine théorique et de langage de bas niveau, on peut en étudier une que le Professeur Zanotti a définie convenablement, comme le jeu d'instructions qui va avec et qu'on peut expérimenter via un simulateur tout à fait pertinent.

  3. On peut alors utiliser le mot algorithme comme synonyme de programme, tel Monsieur Jourdain avec la prose, sans pour autant se détacher du langage choisi.
  4. Il n'y a pas d'algorithmique décente sans une pratique courante de la programmation, préalable et conjointe, au moins dans un langage donné.
  5. Il n'y a pas d'application de l'algorithmique en Mathématiques sans connaissance mathématique spécifique préalable, en particulier la représentation binaire, octale ou hexadécimale des nombres et le calcul arithmétique qui va avec.
  6. Enfin, il n'y a pas de pseudo-code algorithmique qui s'affranchirait d'une machine théorique, sauf si on impose une syntaxe qui rappelle les langages les plus populaires, supposés déjà pratiqués par les apprenants et qu'ils sont donc censés utiliser en programmation, par exemple C, C++, PHP, Java et Javascript. Mais alors on doit définir la liste des instructions utilisables, a priori compréhensibles par toute machine sous-jacente.

Hors machine, point de salut

La notion de programmation est intimement liée à celle de machine et de langage : un programme est écrit en un langage pour l'exécuter sur une machine. Un programme est donc composé d'une suite d'instructions compréhensibles par la machine, qu'elle exécute dans l'ordre d'écriture.

On peut déjà sentir la ressemblance énorme entre un algorithme et un programme, mais le premier est théorique, s'exécutant par la pensée sur une machine théorique elle aussi, tandis que l'autre est pratique, destiné à être exécuté sur une machine physique.

La machine physique en question est presque toujours un microprocesseur, que ce soit pour un ordinateur grand public, une tablette ou un smartphone.

Mais ce peut aussi être une machine virtuelle, c'est à dire un logiciel qui simule une machine… sur une machine réelle. Nous n'en dirons pas plus car la différence est imperceptible, tant pour le débutant que pour le développeur de logiciels confirmé. Par exemple, les langages Java et SmallTalk utilisent des machines virtuelles. L'intérêt est de pouvoir transporter facilement un logiciel d'une machine réelle à l'autre sans besoin de l'adapter à chaque fois à une machine particulière : il suffit que la machine virtuelle existe pour les deux, garantissant ainsi qu'un logiciel fonctionnant correctement sur l'une le fera aussi sur l'autre. Sinon une telle adaptation nécessite de compiler un programme avant de pouvoir l'exécuter, en passant par un langage intermédiaire, dit d'assemblage. Le détail de ces notions sort du cadre de cet article et son développement n'apporterait pas grand-chose à l'argumentaire développé.

Dans la pratique l'algorithmique se confond alors plus ou moins avec la programmation, puisque d'une part un algorithme doit aussi être écrit un un langage précis, qui sera traduit et adapté à un langage de programmation particulier, et que d'autre part tout programme concrétise implicitement un algorithme.

Finalement, celui qui écrit des programmes pour construire des logiciels fait de l'Algorithmique comme M. Jourdain faisait de la prose : sans effort particulier, sans même s'en rendre compte, et c'est bien pourquoi il est préférable de commencer par programmer avant de s'intéresser à l'algorithmique.

Hors langage spécifique, point de programmation

On a cru quelque temps qu'on pouvait définir un langage algorithmique universel, qui serait facilement traduisible dans tous les langages de programmation, mais on a vite compris que c'était illusoire. De toute façon, si un tel langage avait pu être mis au point il aurait en pratique rapidement éliminé tous les autres qui n'auraient alors plus eu aucun intérêt.

Un langage algorithmique ne peut donc être quethéorique, et il nécessite de définir au préalable une machine elle aussi théorique pour lui donner du sens. Approche qui relève d'emblée des cours post-baccalauréat, a fortiori lorsqu'il s'agit d'algorithmes de calcul numérique.

Un enseignement de l'algorithmique n'a donc de sens bien défini que si on utilise une machine théorique et qu'on travaille avec un langage de bas niveau, en exécutant directement le jeu d'instructions de la machine. Il nécessite donc une pratique de la programmation, préalable et conjointe à l'étude et la mise en place d'algorithmes, afin d'une part de pouvoir effectivement les mettre au point, et d'autre part de chercher à les améliorer pour réduire le temps d'exécution ou la place requise en mémoire. C'est ce que préconise le cours du Professeur Zanotti, déjà cité.

Ce qui devrait être le cas lorsque cet enseignement est dévolu aux professeurs de Mathématiques, comme dans les lycées français depuis septembre 2009.

Néanmoins, même sans machine théorique bien définie et pour un langage donné, comme Python, le débutant a tout intérêt à comprendre ce qui se passe en mémoire. C'est seulement ainsi que l'élève de lycée peut travailler efficacement en pratique, avant de pouvoir aborder réellement l'algorithmique dans les cours supérieurs.

On peut alors remplacer la machine théorique au jeu d'instructions bien défini, par une machine définie évasivement en disant simplement qu'elle exécute des instructions, les unes à la suite des autres en mémoire, certaines manipulant explicitement des contenus variables eux aussi en mémoire. Il faut alors imaginer qu'une variable est un nom permettant de désigner un unique conteneur d'une information variable. On peut l'expérimenter sur un exemple en Python.

Hors programmation, point d'algorithmique

Si le cours de Zanotti, déjà cité, est intéressant par son contenu, certes, il l'encore plus encore par un constat a priori surprenant, mis en avant par l'enseignant :

Je constate d'année en année que les étudiants en informatique programment de moins en moins en dehors du cadre scolaire. Depuis que j'ai pris conscience de cette évolution, je pose chaque année la question rituelle Programmez vous chez vous ?  et les réponses sont de plus en plus alarmantes. Je suis passé progressivement du oui unanime, au non quasi unanime (j'ai eu deux promotions dans lesquelles aucun étudiant ne programmait !) Je ne pense pas que l'on puisse devenir informaticien sans de solides connaissances en algorithmique et sans une pratique régulière de la programmation. Non pas que l'informatique se résume à celà, loin de là, mais la connexion abstraite et concrète avec l'Ordinateur est certainement ce qui fait la spécificité de cette science, au même titre que faire des démonstrations fait partie du quotidien du mathématicien.

Un nombre croissant d'étudiants en informatique se fourvoient dans cette voie par rejet des autres sciences et en particulier des mathématiques, ce qui est aussi saugrenu que de vouloir devenir chef d'orchestre en étant allergique au solfège. Beaucoup sont persuadés que la facilité avec laquelle ils manipulent des objets de haute technologie et leur goût prononcé pour ces mêmes technologies leur tient lieu de savoir.

Cette diminution de l'activité de programmation a été constatée pendant la montée en puissance d'un soi disant enseignement informatique au Lycée, avec une algorithmique introduite dans toutes les filières, y compris de management et gestion (STMG). Nous reviendrons sur ce paradoxe apparent.

En revanche il est clair que l'apprentissage de l'algorithmique doit s'accompagner d'une pratique régulière de la programmation.

En outre, dans la préface d'un ouvrage de référence (p. XI) on donne les deux prérequis pour étudier l'Algorithmique et les algorithmes : Vous devez avoir une expérience de la programmation et Vous devez être familiarisé avec les démonstrations mathématiques, surtout le raisonnement par récurrence.

Hors pratique, point d'apprentissage de la programmation

On peut donc en déduire que l'algorithmique s'appuie sur les Mathématiques et non l'inverse, et qu'elle doit faire plus partie d'un cursus universitaire que d'un cycle secondaire, puisque la notion de récurrence n'est abordée qu'en Terminale à vocation scientifique.

C'est à dire la Terminale S jusqu'en juin 2020 et ensuite toute terminale dans laquelle on aura regroupé des élèves de spécialité Mathématiques.

Donc l'algorithmique doit être vue au lycée, encore plus au collège, comme un implicite conceptuel, mis en œuvre uniquement dans une certaine pratique de la programmation.

C'est bien pourquoi il est tout à fait légitime de s'interroger sur le bien-fondé d'un enseignement de l'algorithmique au secondaire censé débuter par le biais d'un usage de l'environnement Scratch, conçu en 2003 par le Media Lab du MIT, puis continuer au lycée avec l'usage du langage Python, un langage professionnel, conjointement à un pseudo-langage algorithmique dit… naturel.

On dit aussi pseudo-code, parfois en association au mot étrange d'algorigramme, évoquant immédiatement à tout informaticien expérimenté des méthodes de développement obsolètes.

Le programme officiel est donc a priori ambitieux et vertueux, mais sans une seule heure officiellement allouée dans l'emploi du temps pour le faire ! Cette posture intenable en pratique a-t-elle un but autre que de donner l'illusion qu'on apprend quelque chose en Informatique, pour être dans la vision prométhéenne du XXIe siècle comme ère du tout numérique ?

Et ce n'est pas avec l'enseignement des SNT (sciences numériques et technologie), pour tout élève de Seconde depuis septembre 2019, que l'on va améliorer la situation. Cet enseignement est en effet un bric-à-brac permettant tout au plus, avec seulement 1 h 30 par semaine, de donner un vernis culturel qui ne pourra tenir plus d'un an, puisque quasiment rien ne sera approfondi par la suite. N'aurait-il pas été bien plus pertinent d'allouer cette heure et demie à la programmation ?

La SIF (Société Informatique de France) avait pourtant bien signalé ce côté volatil du programme prévu, dès novembre 2018…

Finalement, cet enseignement français de l'algorithmique et de la programmation en Secondaire n'est-il pas, lui aussi, un simple fantasme ?

Dix ans d'algorithmique au collège et au lycée en France

Un pur fantasme ?

Alors que l'algorithmique comme enseignement relève finalement plutôt des classes post-Baccalauréat, comment peut-on imaginer, sans prévoir au moins les moyens horaires et matériels à cet effet, mettre les élèves en situation de résoudre effectivement des problèmes avec un algorithme (compris ici au sens de programme en Python) conçu par eux et non simple copié-collé de celui du professeur, simplement modifié à la marge ?

En fait il s'agit d'un fantasme, peut-être promu par une vélléité politique de tenter de réagir à la suprématie américaine incontestable en matière de logiciels, sans doute dû à une naïveté dans la connaissance de la capacité d'assimilation des élèves, mais certainement impardonnable lorsque qu'il perdure. C'est plutôt un tour d'illusionniste dont les citoyens sont les spectateurs sidérés.

Voyons dans les détails, là où le diable se tapit.

Programme scolaire, ou langue de bois ?

Dejà dans le programme de Mathématiques du lycée de 2009 (B.O n° 30 du 23 juillet 2009), à la rubrique Algorithmique (objectifs pour le lycée) il était spécifié ce qui suit :

La démarche algorithmique est, depuis les origines, une composante essentielle de l’activité mathématique. Au collège, les élèves ont rencontré des algorithmes (algorithmes opératoires, algorithme des différences, algorithme d’Euclide, algorithmes de construction en géométrie). Ce qui est proposé dans le programme est une formalisation en langage naturel propre à donner lieu à traduction sur une calculatrice ou à l’aide d’un logiciel. Il s’agit de familiariser les élèves avec les grands principes d’organisation d’un algorithme : gestion des entrées-sorties, affectation d’une valeur et mise en forme d’un calcul.

Dans le cadre de cette activité algorithmique, les élèves sont entraînés :

Aucun langage, aucun logiciel n’est imposé.

L’algorithmique a une place naturelle dans tous les champs des mathématiques et les problèmes posés doivent être en relation avec les autres parties du programme (fonctions, géométrie, statistiques et probabilité, logique) mais aussi avec les autres disciplines ou la vie courante.

À la lumière des sections précédentes on comprend aisément qu'il est tout à fait abusif de dire que la démarche algorithmique est, depuis les origines, une composante essentielle de l’activité mathématique et aussi que l’algorithmique a une place naturelle dans tous les champs des mathématiques, puisqu'on confond plusieurs acceptions d'un même terme, avec un rebours historique tout à fait discutable. C'est donc plus un effet d'annonce promotionnelle qu'une définition de programme scolaire.

Parler de formalisation en langage naturel n'a aucun sens : pour formaliser on utilise un… langage formel, ou à tout le moins un langage de programmation, lui-même étant sous-tendu par une grammaire formelle. Cette assertion est donc plutôt de la langue de bois qu'une injonction didactique.

La formalisation d'un langage constitue à en définir le vocabulaire et la grammaire formelle, permettant une analyse syntaxique et sémantique des programmes. Ce formalisme est donc indispensable pour définir un langage de programmation afin qu'il puisse être exécuté sur une machine.

Parler de gestion des entrées-sorties laisse rêveur : tout dépend d'une part de l'environnement informatique physique, et d'autre part des ressources logicielles de gestion des IHM (Interfaces Homme-Machine) ! C'est donc, une fois de plus, de la langue de bois.

Donc n'imposer aucun langage était, dans cette perpective, une grave erreur. D'autre part c'était un obstacle fondamental pour assurer la continuité des enseignements : un professionnel ne passe pas si facilement d'un langage à l'autre, alors un élève du secondaire… Cette affirmation était donc, au mieux, une naïveté de béotien, mais c'était néanmoins une erreur fondamentale qu'on aurait facilement pu éviter en s'appuyant sur des spécialistes des langages et de la programmation ayant une expérience d'enseignement de ces sujets.

C'est l'ingénieur qui parle, ayant une expérience de plusieurs dizaines de milliers de lignes de programmation, écrites en une douzaine de langages (Fortran, Pascal, C, BASICs, PHP, Python, SmallTalk, TI-BASIC (avec calcul formel), Javascript et assembleurs).

La notion de langage symbolique est une chimère en Informatique : on y parle de langages impératifs, fonctionnels, déclaratifs, de balisage, à objets, à classes d'objets, à prototypes d'objets, de requètes, formels, dédiés. Le langage symbolique ? Inconnu au bataillon. C'est de la langue de bois, ou bien fait référence à la religion, l'art, l'ésotérisme ou la (para-)psychologie : on n'ose quand même pas y croire !

Enfin, ce programme de 2009, malgré une ambition folle dans les généralités, réduisait nettement la voilure dans les détails :

À 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.

Instructions élémentaires (affectation, calcul, entrée, sortie).

Les élèves, dans le cadre d’une résolution de problèmes, doivent être capables :

Boucle et itérateur, instruction conditionnelle

Les élèves, dans le cadre d’une résolution de problèmes, doivent être capables :

Bref, ce programme de 2009 concernant l'algorithmique était d'avance voué à l'échec, par manque de connaissance et de pratique du sujet de la part de ses concepteurs, d'autant plus, rappelons-le avec force, qu'aucune heure n'était officiellement allouée pour cet enseignement.

On a corrigé un peu le tir dans un amendement de 2017, mais si peu.

Un réel amendement ?

En mai 2017, dans la circulaire n° 2017-082, apparaît un amendement au programme de 2009, donnant a priori plus d'importance à l'algorithmique, en l'accompagnement du mot qui aurait dû être incontournable dès la première version : programmation.

On a donc perdu huit ans, uniquement par faute de se fier aux professionnels du développement, à ceux de l'enseignement des langages de programmation et de l'algorithmique, ou ne tenant pas compte de leurs avertissements.

Mais passons, par irénisme.

Algorithmique et programmation constituent désormais, en principe et seulement après huit ans d'usage d'un programme scolaire pratiquement intenable, une partie complète du programme de Mathématiques de Seconde :

Le programme est divisé en quatre parties :

Cet amendemant annonce de plus : Le travail sur l’algorithmique et la programmation doit être réinvesti dans les trois autres parties.

Quelle prégnance dans cet enseignement, alors que d'une part aucune heure n'est prévue officiellement pour apprendre la programmation, et que d'autre part il est bien difficile de réserver régulièrement une salle informatique dans la plupart des lycées français !

Mais, une fois encore, le diable est tapi dans les détails. En effet, on découvre ensuite précisément cette quatrième partie (Algorithmique et programmation) :

La démarche algorithmique est, depuis les origines, une composante essentielle de l’activité mathématique. Au cycle 4, en mathématiques et en technologie, les élèves ont appris à écrire, mettre au point et exécuter un programme simple. Ce qui est proposé dans ce programme est une consolidation des acquis du cycle 4 autour de deux idées essentielles :

Dans le cadre de cette activité, les élèves sont entraînés :

Un langage de programmation simple d’usage est nécessaire pour l’écriture des programmes. Le choix du langage se fera parmi les langages interprétés, concis, largement répandus, et pouvant fonctionner dans une diversité d’environnements.

Outre l'effet d'annonce déjà souligné, on mélange toujours algorithmique et programmation, tout comme on parle de la description d'un algorithme en langage naturel, ce qui, nous l'avons expliqué, a peu de sens. Apparemment on ne se rend toujours pas compte que programmer c'est implicitement mettre au point des algorithmes !

De plus, parler de langage de programmation textuel ne veut rien dire en Informatique, d'autant qu'on ne voit pas comment un langage pourrait ne pas être textuel, à moins de ne communiquer qu'à l'oral. On subodore simplement la volonté de bannir l'usage d'environnements de programmation comme Scratch, pourtant recommandé au collège !

Dans la version de novembre 2018 du programme du cycle 4, on est d'ailleurs passé de Scratch, clairement exprimé initialement, à (p. 142) : Ils peuvent être initiés à programmer avec un langage de programmation couplé à une interface graphique pour en faciliter la lecture. La conception, la lecture, et la modification de la programmation sont réalisées au travers de logiciels d’application utilisant la représentation graphique simplifiée des éléments constitutifs de la programmation.. Ce qui autorise aussi Snap! (Berkeley University) et Blockly (Google), concurrents de Scratch (MIT), ajoutant ainsi à la confusion, d'autant plus que le MIT collabore avec Google…

Autre invention terminologique : on parle de langage concis, ce qui n'a aucun sens précis en Informatique. On pourrait seulement imaginer qu'on veut parler ici de la taille de la grammaire formelle décrivant le langage, mais alors on voit mal quel professeur de Mathématiques peut comprendre la phrase qui contient l'expression ! Les seuls langages historiquement conçus pour avoir une concision souhaitée dans leur grammaire formelle sont Lisp (List processing, un langage fonctionnel de traitement de listes) et SmallTalk (Petit Discours en français !) conçu en 1971, et toujours utilisé de nos jours.

Sauf à se référer au principe de Huffman, visant le langage Perl, qui s'appuie sur des affirmations tout à fait discutables puisque trop de concision peut aussi nuire à la lisibilité, limitant ainsi son intérêt pratique dans la productivité du développement logiciel. Le lecteur curieux pourra donc s'intéresser au langage Perl ; voire au langage APL le champion de la concision, mais aussi celui de l'hermétisme…

Cette confusion entre algorithme et programme d'une part, et entre les notions similaires en Informatique et Mathématique d'autre part, est prégnante dans l'extrait suivant :

À l’occasion de l’écriture d’algorithmes et de petits programmes, il convient de transmettre aux élèves l’exigence d’exactitude et de rigueur, et de les entraîner aux pratiques systématiques de vérification et de contrôle. En programmant, les élèves revisitent les notions de variables et de fonctions sous une forme différente.

La notion d'écriture d'algorithmes en langage naturel, si elle avait un sens, interdirait en effet l'exigence d'exactitude et de rigueur, car il n'y aaurait aucun moyen se savoir si ce qu'on fait est correct ou non… Sauf en programmant afin de tester les algorithmes conçus, donc avec un langage bien défini ! Donc les affirmations de ce programme scolaire amendé n'ont toujours pas vraiment de sens.

Quant au fait de revisiter les notions de variables et de fonctions sous une forme différente, on sent qu'on a oublié un élément essentiel : le temps ! Si les mots sont les mêmes (variable et fonction), les concepts sous-jacents sont bien différents.

En effet, en Mathématiques une variable peut prendre des valeurs, selon des hypothèses formulées par des prédicats intemporels (du genre si x ≥ –3 alors ··· ou supposons x = 12 alors ···) permettant d'arriver à des conclusions différentes, alors qu'en programmation une variables prend des valeurs au cours du temps et un test du genre si x ≥ –3 alors ··· considère la valeur de la variable à un instant donné.

Donc il ne s'agit pas seulement de revisiter des notions, encore en phase d'acquisition en Seconde, mais de complètement les reprendre. C'est une difficulté importante pour les débutants en programmation et seul un travail sur machine (ordinateur ou tablette) avec des essais et erreurs permet d'assimiler petit à petit ces notions. Sans y passer un temps conséquent, on reste dans le domaine du fantasme.

Notons enfin à ce propos que la pratique systématique de vérification et de contrôle n'est pas une mince affaire et ne s'acquiert que via une pratique importante, qui a peu de chance de se produire puisqu'il n'y a, rappelons-le, aucune heure officielle d'allouée pour apprendre à programmer.

Sauf si un lycée décide d'allouer une heure spécifique à l'algorithmique, en dédoublant les classes afin que chaque élève puisse effectivement travailler une heure par semaine sur un ordinateur, ce qui de toute façon est trop peu. Comme il n'y a quasiment jamais aucune salle informatique permettant d'accueillir plus de 18 élèves, la pratique régulière et suffisante de la programmation pour chaque élève est donc, sauf exception, tout simplement impossible

L'opportunité d'un réel amendement était posée après la publication en février 2018 du rapport Villani-Torossian puisque ce dernier pose un diagnostic clairvoyant sur l'état calamiteux de l'enseignement des Mathématiques…

Le rapport Villani-Torrosian… Et après ?

Ce rapport mettant en évidence la discipline Informatique comme accompagnatrice de celle des Mathématiques, on pouvait croire à la mise en place d'un enseignement de la programmation hors contexte Mathématique, en faisant émerger une discipline à part :

Le besoin d’un enseignement disciplinaire informatique est clairement établi, et c’est donc l’occasion de créer une articulation didactique entre informatique et mathématiques.

Les mathématiques sont largement présentes dans l’enseignement de la discipline informatique : il s’agit, entre autres, d’acquérir les fondements conceptuels nécessaires pour pouvoir évoluer tout au long d’une carrière professionnelle mobilisant l’informatique. L’apprentissage de l’algorithmique débute bien souvent par des activités débranchées propices au raisonnement pur. La discipline informatique permet, de plus, de développer une démarche complète de modélisation : on part d’un problème, on le modélise, on propose un algorithme, on le programme, on l’exécute et on analyse les résultats ; on part du concret, on passe par l’abstraction et on retourne au concret.

La mission recommande de développer une offre spécialisée, efficace, structurée, d’un enseignement d’informatique qui commence très tôt et va en se spécialisant de plus en plus, avec ses enseignants, ses programmes, le tout en coordination avec les cours de sciences et tout particulièrement le cours de mathématiques. Le périmètre précis de cette nouvelle offre doit faire l’objet d’études approfondies.

À noter qu’une difficulté supplémentaire est l’absence de partenaires institutionnels identifiés au sein de l’éducation nationale pour la mise en place équilibrée de cette synergie entre mathématiques et informatique, et la difficulté de construire un véritable curriculum de la maternelle à l’enseignement supérieur.

Au second point on parle d'une démarche complète de modélisation ce qui relève, une fois de plus, d'une ambition démesurée par rapport aux horaires alloués (quasi nuls) et au niveau requis, puisqu'il s'agit essentiellement des cours supérieurs.

C'est un spécialiste du domaine qui le dit, ayant enseigné la Modélisation en école d'ingénieurs pendant de nombreuses années. La modélisation, pour concevoir des bases de données ou des logiciels de qualité, n'est certainement pas accessible au lycée !

Le dernier point de l'extrait cité est essentiel, car en effet l'Éducation Nationale n'a même pas eu la volonté de s'appuyer sur les forces vives de ses enseignants déjà expérimentés en Informatique et dans son enseignement. Ce qui lui aurait pourtant permis de facilement définir des programmes qui tiennent la route. Elle s'est contentée de prendre conseil auprès de sociétés comme la SMF, la SMAI ou la SIF ou encore d'universitaires, sans pour autant tenir compte de leurs conseils avisés, comme tout enseignant de Mathématiques peut le constater ici.

Le rapport Villani-Torossian a-t-il été suivi d'un effet tangible au sujet de l'Algorithmique et la Programmation dans les nouveaux programmes ? On peut déjà en douter…

Une prise en compte dans les nouveaux programmes de 2019 ?

Le programme de 2de mis en œuvre à la rentrée 2019, et mis en ligne le 22 janvier 2019, reprend malheureusement in extenso l'amendement de 2017, en apportant seulement quelques précisions (p. 15), comme le langage de programmation concis, cette fois-ci imposé (Python) :

Un langage de programmation simple d’usage est nécessaire pour l’écriture des programmes informatiques. Le langage choisi est Python, langage interprété, concis, largement répandu et pouvant fonctionner dans une diversité d’environnements. Les élèves sont entraînés à passer du langage naturel à Python et inversement.

Le choix de Python est tout à fait discutable, mais n'a certainement pas été discuté… Passons.

On peut facilement constater qu'il n'est pas le seul langage populaire de haut niveau, et que le langage Javascript répond aussi aux qualificatifs énoncés : langage interprété, concis, largement répandu et pouvant fonctionner dans une diversité d’environnements avec un net avantage : il est utilisé dans quasiment toute page du Web, au contraire de Python ! En outre, et c'est sans doute la vraie et seule raison du choix de Python, ce langage avait déjà été sélectionné pour les CPGE en 2013. Noblesse oblige…

On peut se contenter de quelques commentaires pour montrer que le nouveau programme ne cède quasiment en rien à l'ancien, celui de 2009 amendé en 2017.

Une partie spécifique mais toujours pas d'horaire alloué

Le nombre de parties du programme de Mathématiques passe de 4 à 5 avec la mise en évidence (p. 5) de celle intitulée Nombres et calculs :

Le programme s’organise en cinq grandes parties : Nombres et calculs, Géométrie, Fonctions, Statistiques et probabilités et Algorithmique et programmation.

Mais il n'y a pas d'enseignement de la programmation dans un cours à part, qui serait pourtant en accord avec les recommandations du rapport Villani-Torossian.

Le nouveau programme de 2de définit donc cinq parties pour le prix de quatre en quelque sorte, puisque le nombre d'heures allouées n'a pas changé et que les contenus sont quasiment les mêmes.

Un langage imposé sans justification précise préalable, sans réelle pertinence

On remarque à nouveau cette idée de passer du langage naturel à Python et inversement, qui n'a aucun sens, surtout avec un langage modulaire comme Python, puisque le simple usage du nombre π ou d'une fonction racine carrée (sqrt) nécessite l'import d'un module : Math. Sans ce dernier pas de calcul de racine carrée d'un nombre à moins de concevoir une fonction (donc un algorithme) qui la calcule. Et ceci n'est pas simple, comme on peut l'étudier dans l'annexe 2. Il en va de même avec la plupart des fonctions mathématiques usuelles, avec les algorithmes de tris de listes, avec les statistiques, etc…

Avec de plus une notation pointée (propre aux langages à objets) explicite ou implicite que le débutant ne peut comprendre. En Python le débutant inexpérimenté en programmation est rapidement obligé d'utiliser des expressions qu'il ne comprend pas : fâcheux pour mettre au point soi-même un programme, et surtout pour un enseignement !

On postule que l'affectation sera notée ← en langage naturel, comme si une telle notation faisait partie d'un langage naturel. Pourquoi alors ne pas tout simplement utiliser le symbole = d'égalité, comme dans la plupart des langages de programmation ? L'imposition de cette flèche orientée vers la gauche est étonnante, puisque d'une part dans les calculatrices usuelles (CASIO et TI), la flèche d'affectation va de gauche à droite, mais qu'en plus pour comprendre l'ordre chronologique des opérations effectuées (calcul puis affectation du résultat) il faut quand même, comme avec le symbole d'égalité, lire de droite à gauche, donc à l'inverse de ce qu'on fait quotidiennement avec un langage… naturel !

On postule enfin qu'il y a deux types de boucle : boucle bornée (for), boucle non bornée (while), comme si le cas de Python était généralisable à tous les langages usuels de programmation. En particulier la boucle for du Python n'est qu'un artifice de parcours d'une structure itérable, et donc n'a rien à voir avec celle du C, de Java, de Javascript ou de PHP, langages partageant une syntaxe commune, qui permet en fait de se passer de la boucle while.

Par exemple, en plus une vingtaine d'année de programmation en Javascript et PHP, et développement de plus de 400 modules, l'auteur de cet article a rarement utilisé une boucle while, essentiellement des boucles for. Ne parlons même pas de SmallTalk, langage sans instructions conditionnelles ni boucles, puisqu'on les traduit par des envois de messages à des objets, en leur fournissant des blocs d'instructions, eux-mêmes des objets. Bien que très déroutante au départ, l'écriture des blocs conditionnés ou itérés devient vite assez naturelle puisque finalement très logique.

Le langage Python n'a donc vraiment rien de fracassant conceptuellement qui entraînerait son choix pour un enseignement massif à des débutants, c'est à dire à tous les élèves de Seconde et à tous ceux des classes de 1ère technologique (sauf STD2A).

En fait ce n'a pas vraiment d'importance puisque qu'au Baccalauréat on fait seulement semblant d'évaluer l'algorithmique et la programmation…

Une pseudo-évaluation au baccalauréat

L'algorithmique au lycée est donc un pur fantasme depuis 2009, faute de temps alloué et d'une vision claire de la problématique de l'enseignement de l'algorithmique couplée à la programmation.

L'évaluation au Baccalauréat, toutes filières confondues, se réduit alors à vérifier que les candidats savent lire les quelques algorithmes ultra-élémentaires qu'on leur aura répétés au cours des années de lycées, surtout en 1ère et Terminale.

On peut le constater dans le recueil de tous les algorithmes donnés dans les sujets du Bac S en 2018. On ne demande en effet jamais au candidat de mettre en place la moindre instruction conditionnelle ou la moindre boucle : en pratique soit il lui suffit de traduire un algorithme en langage de sa calculatrice, et le faire exécuter pour répondre aux questions posées, soit il complète un algorithme de quelques lignes avec quelques égalités, inégalités ou affectations, qu'il aura bachoté sur un ou deux ans.

Soyons clairs : aucun bachelier depuis 2009, sauf s'il a appris à programmer seul ou en dehors du système scolaire classique, ne sait mettre au point seul un programme faisant de l'ordre d'une dizaine de lignes et qui n'a pas été bachoté au préalable.

L'Éducation Nationale serait-elle devenue, au moins sur ce plan, une machine… à illusions ?

Pour conclure : vers un enseignement à part entière

Mettre en place un enseignement à vocation algorithmique au lycée, sans se bercer d'illusions donc après un enseignement de programmation, n'a de sens qu'à plusieurs conditions :

Ce langage a le net avantage sur tous les autres langages de pouvoir être utilisé dans les pages du Web, sachant que tout élève de 2de étudie le langage HTML dans l'enseignement SNT (thème le Web). Le programme officiel de la SNT a curieusement évacué ce langage de programmation pourtant fondamental pour le Web, tout le mentionnant comme code exécutable pour le dialogue client-serveur…

Ce langage, dans l'environnement de programmation Squeak, a le net avantage de permettre de modifier par programme tout objet de l'IHM, comme Javascript peut le faire avec tout élément d'une page Web. Et avec Squeak on peut facilement passer d'un environnement à l'autre en tranférant l'ensemble des données et de la machine virtuelle : Squeak est un OS (Operating System) à part entière !

Sinon on restera dans le domaine du fantasme et les bacheliers seront toujours aussi incompétents à l'entrée dans le supérieur en algorithmique-programmation, ce qui est plutôt fâcheux pour un enseignement de plus en plus découpé en compétences dont le niveau n'est jamais défini.

Annexe 1
Du beurrage de tartine à la programmation sur une machine

Reprenons l'exemple de l'algorithme naïf que nous avons vu pour introduire la notion d'algorithme :

Il n'est pas si simpliste qu'il y paraît car il permet d'introduire le vocabulaire classique en programmation :

Pas assez de beurre pour couvrir une grande tartine, ou une tartine trop grande pour la quantité de beurre disponible.

On note que la notion de machine est essentielle pour l'algorithme puisse tout simplement avoir du sens puisqu'on s'exprime avec un langage qui doit être compéhensible pour cette machine.

Il est cependant difficile de trouver sur Internet des cours universitaires mettant bien en évidence cette contrainte. Celui de J-P. Zanotti de l'université de Toulon, fait partie de ceux-là. Son cours d'Algorithmique définit clairement une telle machine théorique, qu'il appelle machine RAM, et il en a même fait un simulateur qui prend en compte le langage algorithmique associé.

Il peut donc exécuter concrètement les programmes donnés à la page dédiée à cette machine théorique. Mais alors la programmation se fait en un langage proche de la machine, qui ressemble à un langage d'assemblage, déjà évoqué dans la note 4. Dans ce cas le langage théorique se confond avec un langage pratique : on peut réellement exécuter les algorithmes.

Annexe 2
L'aspect fonctionnel d'un algorithme

Mettre en avant les fonctions c'est heureux et fondamental en programmation, mais utiliser la notion de langage algorithmique, comme avec les nouveaux programmes de Mathématiques de 2019, n'a pas plus de sens que dans les programmes précédents.

En effet, tout algorithme (déterministe) peut s'écrire (mathématiquement ou informatiquement dans la plupart des langages usuels) sous la forme S = f(E)E est un objet représentant le jeu des données d'entrée, S celui des données de sortie et f une fonction qui fait le travail demandé.

Donc celui qui doit résoudre un problème et sait que f fait le travail, se contentera d'écrire une seule instruction : S = f(E). C'est l'exemple du calcul de la racine carrée déjà donné pour le cas de Python avec la nécessité d'importer un module, Math, qui permet d'utiliser la fonction ad hoc, c'est à dire sqrt (en anglais, square root désigne la racine carrée).

En revanche, celui qui ne connaît pas ladite fonction risque d'aborder en fait un problème très complexe, qui a pu demander des années de recherche avant d'aboutir à un algorithme (numérique ou non) convenable.

C'est pourquoi, dans les sujets du Baccalauréat, examen qui permet en France d'obtenir un premier titre universitaire, les algorithmes font presque tous seulement quelques lignes, simples boucles de calcul d'une suite pour la grande majorité, comme on peut le constater sur l'ensemble de sujets consignés sur le site de l'APMEP, en particulier en série S pour l'année 2018.

À titre d'illustration, prenons celui de Métropole en septembre 2018 au Bac S, où le candidat se contente de boucher quelques trous dans un algorithme déjà écrit, pourtant vu et revu maintes fois sur deux ans, et que les élèves apprennent de plus à mettre en œuvre sur leur calculatrice.

On peut donc savoir comment faire sans rien comprendre à ce qu'on fait. Le constat de Zanotti déjà évoqué, sur l'absence d'une pratique personnelle de la programmation chez ses étudiants, est donc tout à fait compréhensible : ils en sont tout simplement incapables !

En Javascript (dit aussi JS), le langage des pages du Web, la solution est élémentaire :

En langage Algo, un langage pédagogique mis au point et exploité par l'auteur de cet article, la solution est aussi élémentaire :

Pour en savoir plus sur le sujet, on doit se pencher sur la notion de langage algorithmique, leitmotiv qui sous-tend cet enseignement en France, étonnant à plus d'un titre.

Annexe 3
Langages d'expression algorithmique

Nous avons déjà appris qu'un langage algorithmique nécessitait de définir une machine théorique auparavant, ce qui semble assez logique, puisque la programmation est destinée à créer des logiciels s'exécutant sur les machines réelles.

Précisons alors que pour exploiter une une machine théorique comme la machine RAM de Zanotti, le langage le plus adapté est forcément rudimentaire : c'est en fait un langage d'assemblage, ou assembleur, un langage de bas niveau aux instructions en nombre limité, volontairement réduit dans un cadre d'apprentissage.

Cet aspect primitif est tout à fait en accord avec un langage algorithmque : ses instructions doivent être rudimentaires, sinon, par le jeu des fonctions et donc des modules qu'elles composent, la difficulté de conception des algorithmes dépend fortement de la connaissance du langage : plus on connaît un langage et plus il est facile de mettre au point un algorithme comme solution à un problème donné, peut-être même en une seule ligne comme nous l'avons dit dans l'annexe précédente.

Le corollaire est qu'en limitant le lot des instructions possibles, on accroît la difficulté de mise au point d'un algorithme pour résoudre un problème donné. Nous allons illustrer un tel accroissement sur un exemple.

En effet, supposons un script en Javascript qui calcule la racine carrée d'un nombre positif n, c'est à dire le nombre positif r dont le carré est n (c'est à dire qu'on doit avoir : r × r = n) :

L'algorithme est élémentaire car on dispose d'une fonction qui fait l'essentiel du travail : sqrt est la fonction permettant en effet de calculer la racine carrée (square root en anglais) d'un nombre positif ou nul.

Il faut bien comprendre le plus important dans la problématique d'un enseignement d'algorithmique : un algorithme décrit en fait une fonction, donc tout algorithme peut très bien être déjà exprimé dans un langage permettant de décrire les fonctions, c'est à dire quasiment tous les langages de programmation… sauf les assembleurs, des langages justement proches d'un langage lié à une machine théorique.

Ainsi forcer des apprenants à utiliser un pseudo-langage algorithmque c'est a priori leur interdire d'utiliser les fonctions puissantes des langages usuels. C'est bien pourquoi l'algorithmique ne peut s'étudier qu'après une certaine habitude de la programmation, pour savoir finalement comment sont programmées les fonctions usuelles, comme un approfondissement d'une algorithmique qu'on pratique sans vraiment en avoir conscience.

En ce qui concerne la racine carrée d'un nombre (ici x = 17, affectation modifiable sur clic), l'algorithme qui sous-tend une telle fonction est celui de la méthode de Héron, un grand classique en algorithmique, dont l'efficience ne peut a priori pas être démontrée avant une classe de fin de lycée, pour un enseignement à vocation scientifique.

Ainsi on peut calculer une racine carrée uniquement avec des opérations élémentaires, mais si on ne connaît pas au préalable la méthode de Héron, on ne voit pas comment un élève peut s'en sortir seul pour mettre au point l'algorithme de calcul sous-entendu. Voici un programme simple qui le met en œuvre :

Bien entendu il resterait à démontrer qu'avec cet algorithme, l'erreur relative commise sur la racine carrée est très proche de 0.5*(1 - x/r2), ce qui relève uniquement des Mathématiques.

Sur cet exemple on se rend compte combien l'algorithmique n'est en fait qu'un approfondissement pour la compréhension détaillée d'une programmation usuelle. Concevoir des algorithmes avec un minimum d'instructions disponibles complique d'emblée la tâche à accomplir, et fait alors appel à des Mathématiques plus élaborées qu'avec un langage évolué.

En fait un simple commentaire (p. XIII) dans une bible sur le sujet (Algorithmique, de Cormen-Leiserson-Rivest-Stein ; 1188 pages dans la 3e édition de 2010), référence internationale depuis près de 25 ans, exprime l'inutilité d'imaginer un langage algorithmique hors sol, en préférant l'ancrer dans une pratique de la programmation, donc avec une syntaxe proche de celle des langages usuels :

Suite à moult demandes, nous avons modifié la syntaxe de notre pseudo-code. Nous employons maintenant = pour indiquer l'affectation et == pour tester l'égalité, comme le font C, C++, Java et Python. De même nous avons supprimé les mots-clés faire et alors et adopté // comme symbole pour commencer un commentaire en fin de ligne.

Les auteurs auraient pu ajouter le langage Javascript à cette liste, car il est utilisé dans toutes les pages du Web. Quand même !