Eclairage scientifique – Algorithmes, langages et programmes
1, 2, 3, codez ! - Eclairage scientifique - Algorithmes, langages et programmes
L’ambiguïté du verbe « coder »
Le verbe « coder » est très à la mode
(on le trouve par exemple dans la formule « lire, compter, écrire et
coder » au sujet de l’introduction de l’informatique à l’école). Ce mot
pouvant être porteur de plusieurs ambiguïtés, discutons-en ici.
La première de ces ambiguïtés est certainement la plus facile à
clarifier. En effet, il arrive parfois que le mot « coder » soit utilisé
pour faire référence au fait de modifier le contenu d'un message pour
le rendre illisible à quiconque ne connaîtrait pas le « code secret ».
Dans la suite de ce manuel, cette action sera désignée comme du « chiffrement »,
soit l'action de « chiffrer » le message pour le rendre illisible à
quiconque ne connaît pas la « clé de chiffrement » permettant non
seulement de « chiffrer » le message, mais aussi de le « déchiffrer »
pour le rendre à nouveau lisible. Plus généralement, le mot « coder »
fait référence à l'action de donner des instructions à une machine,
généralement un ordinateur. Cette activité peut également être désignée
par le terme de « programmation ». Les instructions seront alors interprétées par cette machine qui va les exécuter pour produire un résultat.
Enfin, coder peut être utilisé pour représenter une
information à l’aide de symboles (par exemple, écrire un texte en
binaire, à l’aide de 0 et de 1). Selon les cas, on utilisera les termes
encoder ou décoder. Dans ce guide pédagogique, c’est ce sens qui a été
retenu pour le verbe « coder », bien que le grand public utilise plutôt «
coder » pour « programmer ».
Le mot « coder » véhicule toutefois une seconde ambiguïté, qui ne
concerne pas sa définition mais plutôt l'idée que l'on peut se faire de
l'informatique à travers cette activité de programmation. Car
l'informatique ce n'est pas que de la programmation. Il s'agit
certainement de l'activité la plus visible. Celle qui, dans la culture
populaire, représente concrètement le pouvoir qu'ont les programmeurs,
et qui illustre la séparation entre ceux qui subissent les machines en
tant qu'utilisateurs (même tacites) et ceux qui les font fonctionner.
C'est, par exemple, l'image souvent caricaturale du programmeur qui
enchaîne des lignes de code très rapidement dans les films. C'est,
encore, l'image d'un écran qui fait défiler des pages entières de code
en arrière-plan d'un informaticien dans un reportage ou un documentaire
(probablement parce que ça donne un côté impressionnant, ou très
spécialisé). Cette image pourrait participer à la diffusion de l'idée
que l'informatique est difficile d'accès et réservée à une élite ou à
des esprits qui lui sont prédestinés. Heureusement, ce n'est pas le cas.
De toute évidence, coder fait entièrement partie de l'informatique et,
pourtant, cette activité n'en est pas le seul engrenage. Coder permet
effectivement de voir se concrétiser ses idées. Mais ces idées peuvent
naître et mûrir en dehors de toute forme de programmation, en utilisant
le raisonnement comme moteur principal. Ce raisonnement, associé à la
nature mécanique des ordinateurs et de leur fonctionnement, constitue la
pensée informatique et permet de mettre au point les algorithmes qui font aujourd'hui tourner une grande partie de notre monde.
Qu’est-ce qu’un algorithme ?
L'omniprésence des algorithmes n'est plus à démontrer. Quand on fait une requête sur un moteur de recherche, ce sont plusieurs algorithmes qui sont mis en jeu pour trouver les pages les plus pertinentes possibles. Quand les marchés financiers voient des opérations se faire par milliers en une seconde, de la part d'un même trader, ce n'est pas un trader humain qui donne les ordres, mais un algorithme de trading à haute fréquence. Quand un gouvernement veut analyser de très grandes masses de données concernant les activités humaines, afin d'essayer d'y détecter des comportements suspects, alors il se tourne vers les algorithmes . Les algorithmes jouent un rôle important dans nos vies, qu'on en fasse le choix ou pas.
Pour illustrer la notion d'algorithme, l'exemple de la recette de cuisine est assez bien adapté. Après-tout, il s'agit d'une série d'instructions à appliquer pour obtenir un résultat. Et les analogies entre une recette de cuisine et un algorithme peuvent aller plus loin. Une recette peut être diffusée dans le monde ou bien elle peut être gardée secrète. Elle peut être recopiée à la main ou transmise oralement. Mais tant qu'elle n'est pas incarnée par des actions en cuisine, elle reste un concept. En informatique, ce concept est un algorithme. Il peut rester écrit à la main, sous une forme plus ou moins formelle mêlant des explications et des symboles mathématiques. Tant qu'il reste sous cette forme, sans être appliqué, il est un savoir qui ne produit aucun résultat. La puissance d'un algorithme se manifeste quand il est interprété et concrètement déroulé, que ce soit par un humain ou par une machine.
Pour la vitesse d'exécution, c'est autre chose… Un algorithme simple peut être interprété par un être humain, en suivant les étapes et en notant les résultats intermédiaires, s’il y en a. C'est le cas, par exemple, pour l'algorithme de la division que les élèves peuvent appliquer systématiquement une fois qu'ils l'ont appris. Ils peuvent alors dérouler n'importe quelle division à la main en appliquant rigoureusement les étapes de l'algorithme. Ils notent les valeurs intermédiaires et recommencent les opérations jusqu'à ce que les conditions d'arrêt du calcul soient atteintes. Pour un algorithme plus compliqué cela peut devenir délicat et pour la plupart des algorithmes qui se déroulent en ce moment autour de nous, cela devient inenvisageable. Les machines, elles, peuvent faire dérouler ces algorithmes à des vitesses chaque année plus grandes. Pour que cela soit possible il faut réunir au moins deux conditions :
- 1. Concevoir et écrire un algorithme qui permet d'atteindre le résultat visé.
- 2. Traduire cet algorithme dans un programme que la machine peut interpréter.
Ces deux activités sont certainement le cœur de la production d'objets numériques. La programmation peut connaître différents niveaux de qualité, en fonction de l'expérience du programmeur et de sa connaissance du langage utilisé. Un programme peut être écrit de plusieurs manières tout en suivant le même algorithme. Certains programmeurs connaissent tellement bien leurs langages préférés qu'ils peuvent obtenir des gains de performance importants, en écrivant des programmes plusieurs fois plus rapides que les programmes écrits par des programmeurs novices. Cela n'est pourtant pas toujours suffisant pour obtenir des programmes efficaces.
Car les algorithmes, eux aussi, peuvent être écrits de plusieurs manières. Simplement parce qu'ils peuvent être conçus de plusieurs manières. Un algorithme peut être particulièrement bien pensé mais il peut aussi être basique et utiliser des choix malvenus. Ce que nous allons voir dans la suite, c'est qu'un algorithme mal conçu ne peut pas être compensé par une programmation efficace, ou un ordinateur ultra performant. Un algorithme bien conçu, en revanche, même programmé par un novice sur un ordinateur vieillissant, peut offrir des performances radicalement supérieures. Cette conception de la méthode, ce raisonnement permettant de produire l'algorithme le plus efficace possible, est une véritable clé en informatique. La discipline qui lui correspond est l'algorithmique. Explorons ensemble quelques fondements de cette discipline, à la lumière de la petite histoire de l'informatique que nous venons de voir.
Langages
Les premiers ordinateurs étaient programmés avec des cartes perforées. C'est d'ailleurs ce que Babbage avait prévu pour sa machine analytique. Comme nous l'avons déjà vu, en voulant rendre la programmation plus accessible, Grace Hopper a compris les limites des cartes perforées comme interface entre la machine et ceux qui la programment. Pour dépasser ces limites, elle a contribué à la création des compilateurs. Il s'agissait de pouvoir exprimer un programme dans un langage proche du langage humain. Toute la difficulté étant de traduire ce programme dans le langage de la machine, pour qu'elle exécute les actions correspondantes. Cette traduction est connue sous le nom de compilation. Le programme qui se charge de la compilation est un compilateur. Il faut, pour compiler un programme, relever un grand nombre de défis, parmi lesquels :
- Reconnaître et séparer les mots et les éléments du langage pour en faire des entités avec lesquelles travailler par la suite. Par exemple la ligne de code resultat=a+3 doit permettre de reconnaître la variable resultat, l'opérateur =, la variable a, l'opérateur + et le nombre 3.
- Détecter les incohérences dans le langage et s'assurer que le programme est correct d'un point de vue syntaxique ou grammatical (donc vérifier que le programme respecte les règles du langage dans lequel il est écrit).
- Détecter les incohérences sémantiques. Par exemple, si deux variables portent le même nom alors il est impossible de traduire le programme pour la machine (il y a une ambiguïté qui rend impossible la compilation).
- Générer effectivement le code, dans le langage de la machine, à partir des éléments construits dans les étapes précédentes.
L'apport des compilateurs est majeur dans l'histoire de
l'informatique. Il est évidemment beaucoup plus facile d'utiliser des
mots, des nombres et des opérateurs pour programmer, que d'inscrire les
états de la machine, un par un, sur des cartes perforées. Cet apport se
traduit aujourd'hui par une multitude de langages de programmation,
parmi lesquels figure Scratch, le langage que nous avons choisi
pour initier les élèves à la programmation. Les différences entre les
langages peuvent être très importantes. Dans le projet pédagogique
proposé pour le cycle 3, une séance (III-1.1),
illustre la diversité des langages utilisables pour guider un robot :
les langages autocentrés et allocentrés (Le site Pixees propose le « jeu du robot » ). Les langages de programmation possèdent un vocabulaire extrêmement limité et très précis, sans la moindre ambiguïté. Dans notre exemple, le robot peut être guidé par quatre instructions allocentrées (absolues) : Nord (ce qui signifie « avance d’un pas vers le Nord »), Sud, Est, Ouest. Le robot ne saura toutefois pas exécuter l’instruction « évite l’obstacle », qui est vague, non directive, floue. Dans un langage autocentré (relatif), le robot peut répondre à trois instructions : avance (avance d’un pas droit devant toi), droite (c’est-à-dire « tourne sur toi-même de 90° vers la droite »), gauche. On peut même simplifier encore l’instruction gauche en droite-droite-droite, ce qui réduirait encore le vocabulaire à deux éléments seulement. Il est possible de passer d’un langage à un autre, mais l’exercice n’est pas simple, et le faire en classe illustrera bien le mérite des compilateurs ! |
Quel langage utiliser pour piloter ce robot ? (extrait de la progression pédagogique cycle 3, séance III-1.1) |
Une fois mise en place cette contribution majeure que sont les compilateurs et donc des langages de programmation, il nous reste à… programmer ! Et pour cela, le plus sage est encore de commencer par bien concevoir son algorithme avant de le traduire en programme (et, le compilateur va ensuite traduire ce programme pour la machine). Voyons maintenant comment ces fameux algorithmes peuvent naître, de quoi ils sont faits et surtout... comment tout le monde peut en produire !
Extrait de "1, 2, 3... codez !", Editions Le Pommier, 2016-2017. Publié sous licence CC by-nc-nd 3.0.