mardi 5 août 2008

Démonologie informatique 1/2

Voici la suite de ma saga de l'été concernant les langages informatiques. Je doute que ça intéresse beaucoup de personnes mais pour moi, l'audience n'est pas un problème, je ne suis pas rémunéré par la publicité et de toutes façons, comme on va le voir, le culturel ne pait pas.

Dans les discussions entre professionnels de la profession (le développement de logiciels s'entend), il y a pas mal de buzz words qui reviennnent tout le temps. L'un de ces mots est langages dynamiques. Là, Madame Chombier, très estimée lectrice de ce blog demeurant dans la charmante localité de Bignoules-de-Bagorre, se demande déjà ce qu'est un buzzword. Cliquez sur le mot en bleu souligné, madame Chombier. Les autres se demanderont certainement ce que c'est qu'un langage dynamique et s'imaginent peut-être une allégorie du langage portant costume Hugo Boss, Blackberry vissé sur l'oreille et iMac à la main, courant d'une altière foulée vers l'avenir tout en portant un regard à peine méprisant sur la plèbe statique rampant sur son chemin.

En fait, interrogez les professionnels de la profession et il ne s'en trouvera pas deux pour donner une définition équivalente (j'ai pas dit identique) d'un langage dynamique. Pourquoi ? Les professionnels sont-ils des ignares ? Pas plus que d'autres. Il y a simplement que, dans ce contexte, le mot dynamique a plusieurs sens qu'il convient maintenant d'examiner.

Tout d'abord, dynamique est le contraire de statique. Avant de trouver un sens au dynamique, trouvons un sens à son contraire dans le cadre des langages informatiques.
Pour qui a un peu de connaissances en la matière, le premier mot qui vient à l'esprit quand on associe langage informatique et statique, c'est typage. Le typage, kezako ?

Le typage est une opération qui s'applique à un programme informatique lors de son écriture et/ou de son exécution et qui a pour effet de confirmer la nature (le type) des éléments que manipule ce programme. Imaginez que vous vous brossiez les dents, on pourrait dire qu'il s'agit de l'exécution de votre programme de brossage des dents (routine événementielle planifiée 2 à 3 par jour selon les recommandations constructeur). Imaginez alors qu'un petit démon s'assoie sur votre épaule pendant que vous vous brossez les dents et vous confirme, à chaque va-et-vient de la brosse couverte de dentifrice moussant sur votre râtelier, que vous utilisez bien une brosse à dents et, quand bien même cela ne suffirait pas, le petit démon marque "brosse à dents" sur ledit ustensile (au cas où vous êtes trop crétin pour vous en apercevoir).

Voilà, illustrée, l'opération de typage.

Là, les lecteurs qui ont déjà fait de la programmation s'énervent car ils détestent qu'on les prennent pour des crétins (supposition de ma part). Patience, mesdames et messieurs, praticiennes et praticiennes de l'art ésotérique de la programmation, patience. Je n'en ai pas fini avec mes métaphores.

Quel est l'intérêt de typer ? De coller des étiquettes sur des objets (ça y est, le mot magique est prononcé) ? On va le voir, mais avant, il faut passer par, non pas un, mai deux passages obligés, la variable et l'affectation de valeur.

Une variable est une boîte avec une étiquette dessus. Sur l'étiquette figure un nom, celui de la variable. Une variable, c'est une boîte avec un nom écrit dessus. (après les boîtes sont rangées dans une étagère qui ne doit contenir que des boîtes avec des noms différents, mais ça c'est une autre histoire).

Une variable est faite pour contenir une valeur ce qui revient à mettre quelque chose dans la boîte. Exemple, vous avez adopté un nouveau chien et vous voulez lui donner un nom, mettons "Cosmos". Dans un langage informatique, vous prendriez une boîte, colleriez dessus une étiquette marquée "Cosmos" et mettriez le chien dedans. Le langage informatique ne permet pas de faire des trous dans la boîte pour que le chien puisse respirer, je sais c'est barbare mais c'est pas le pire. Imaginons que vous ayez un deuxième chien mais une seule boîte, rien ne vous empêche de retirer le premier chien de la boîte (la variable) Cosmos et d'y mettre le deuxième. Plusieurs chiens, un seul nom. Ridicule. Qu'à cela ne tienne, prenons une deuxième boîte, collons dessus une étiquette marquée "Neptune" (c'est une expérience de pensée, je vous assure qu'aucun chien n'a été maltraité durant le processus) et fourrons le deuxième chien dedans.

A ce stade, nous avons deux variables (deux boîtes) avec chacune un nom (l'étiquette) différent et un contenu (des chiens).

En pseudo-langage ça donne ceci :
var cosmos = new Chien();
var neptune = new Chien();

Maintenant, nous allons utiliser ces variables pour faire des trucs. Qu'est-ce qu'on peut faire avec deux chiens ? Il se trouve que j'en connaît un petit bout sur la question, étant le propriétaire des deux animaux sus-cités. Avec Neptune et Cosmos, on peut jouer à la balle.

Créons donc un programme de jeu de balle avec deux chiens.
Pour des raisons de simplicité, considérons que le lancer de balle est un événement extérieur et que le résultat du programme est la détermination aléatoire du chien qui a attrapé la balle (l'un des deux l'attrape toujours, c'est empiriquement constaté par l'expert du domaine chaque jour).

Comment dire qu'un chien a attrapé la balle ? Bah, on n'a qu'à dire que la balle va dans la boîte avec le chien. Le problème avec les boîtes (les variables), c'est que bien souvent, elle ne peuvent contenir qu'un seul truc, un chien OU une balle mais pas les deux. Et on arrive à un petit paradoxe :

function rattraper_baballe(var balle_lancee)
{
var chien_gagnant = choisir_chien(cosmos, neptune);
chien_gagnant = balle_lancee;

}


Le code ci-dessus ne veut rien dire, on s'en rend compte. Le problème c'est qu'il est parfaitement légal ! Car on a dit qu'une boîte pouvait contenir n'importe quoi, des chiens, des balles mais une seule valeur, c'est la loi. Dans notre code, la fonction choisir_chien retourne l'une des deux valeurs de chien et le programme affecte cette valeur à une variable chien_gagnant qui contient alors un chien. Le problème, c'est que la ligne du dessous affecte à cette même variable la valeur balle_lancee que nous donne l'extérieur de la fonction rattraper_baballe.

Ce faisant, on perd l'information sur le chien choisi et on se retrouve avec la seule information de la balle lancée. Plus grave, si, dans la suite du programme, on applique un autre traitement à la variable chien_gagnant en supposant que celle-ci contient un chien, on risque d'avoir une erreur (un bug) :

donne_nonosse(chien_gagnant) ;
Réponse (possible) du programme => Mauvaise valeur d'entrée !

Et oui ! La variable contient une valeur qui est une balle. Le programme a simplement vu que ça ne collait pas mais le développeur, lui, se demande ce qui se passe et, surtout, comment corriger ce danger de confondre chiens et balles dans les variables.

Le moyen que les concepteurs des langages ont trouvé s'appelle le typage. En gros, en plus de coller une étiquette avec le nom d'une variable sur une boîte, le langage impose de coller une autre étiquette avec la nature de ce que la boîte peut contenir. Là, non seulement on restreint le contenu à une chose mais aussi à une chose d'un certain type.

Notre boîte possède alors deux étiquette, une pour son nom et une pour son type. Exemple :
var Chien cosmos = new Chien();
var Chien neptune = new Chien();
var Balle baballe = new Balle();
cosmos = baballe; -- erreur de type !!!
neptune = cosmos; -- OK, même type

Les affectation sauvages entre variables de types différents vont se remarquer plus vite et, ainsi, des erreurs importantes seront évitées. Ca, c'est la théorie.

Madame Chombier, qui n'a pas les oreilles dans sa poche et à qui on ne l'a fait pas, nous fait remarquer que "il est où le rapport avec le dynamique de tout à l'heure ?".
Et bien voilà, le typage statique, veut dire en réalité : contrôle du type avant l'exécution du programme. L'erreur de type présentée dans le bout de code plus haut peut être détectée à trois moments : lors de l'écriture du code par un développeur un peu plus éveillé que la moyenne, lors de la compilation ( étape qui transforme un texte dans un langage donné en une série d'instructions absconses que l'ordinateur pourra comprendre) ou lors de l'exécution (dans cet ordre)

Le typage statique impose que toutes les informations sur le type des variables soient connues au moment de compiler le programme avant même son exécution. Ces informations permettent au compilateur (un genre de petit démon comme celui des brosses à dents) de détecter des erreurs du type de celles que nous avons évoquées.
Le typage statique impose, en plus, que les variables ne peuvent pas changer de type au cours du déroulement du programme. Le contraire signifierait que le type d'une variable est dynamique (tiens donc ?).

Est-ce que toutes les variables doivent être typées ? Ca dépend des langages. Certains autorisent des variables non typées ou possédant tous les types à la fois. pour ces boîtes là, aucun contrôle n'est effectué, le programmeur prend ses responsabilités. C'est ce qu'on appelle le typage statique faible.
D'autres langages ne supportent pas que l'on déroge aux règles et aux procédures, ils imposent un typage fort, toutes les variables doivent avoir leur étiquette.

En résumé,
typage statique = boîtes avec une étiquette indécollable écrite à l'encre indélébile.
typage dynamique = boîtes avec étiquettes décollables, écrites à l'encre sympathique.
typage faible = boîtes sans étiquette possibles
typage fort = boîtes avec étiquette obligatoires

Et notre petit démon de tout à l'heure ? Qu'est ce qu'il fait ? Eh bien, du typage dynamique, ma bonne dame. Il vous dit pendant tout le temps que vous vous brossez les dents que vous utilisez bien une brosse à dents. Et s'il vous prenez l'envie de vous peigner la moustache avec, il vous préviendrait qu'une erreur de type malencontreuse serait sur le point de se produire.

Et un petit démon qui fait du typage statique ? Celui là, il vous forcerait à écrire "brosse à dents" sur votre brosse à dents à chaque fois que vous brossez les dents. Pareil, quand vous sortez les chiens, il vous forcerait à écrire "chien" sur vos deux chiens, "balle" sur les balles des chiens avant même que vous ne puissiez mettre un pied dehors. Démoniaque, je vous dis !

Au final, nos deux démons ont la même utilité, nous prévenir quand on utilise pas le bon type pour la bonne opération et vice-versa. L'un nous le dit gentiment et ne nous empêche pas toujours de le faire et l'autre a exactement le même comportement mais il nous a forcé à étiquetter toute notre maison, nos animaux domestiques, voire pire (imaginez vous allez aux toilettes avec un démon de ce type).

Rendez-vous la semaine prochaine avec la présentation de certains de ces démons.

2 commentaires:

  1. Haha vraiment magnifiques ces allégories !

    J'attends impatiemment la suite, qui je l'espère répondra à une question que se posent pas mal d'adeptes du bon gros typage surconsommateur d'étiquettes indélibiles : ma boiboite à étiquettes décollables sait-elle gérer des structures de données complexes ?

    Et bonjour à Cosmos, que je ne connais pas :D

    RépondreSupprimer
  2. Merci, chuis en verve en ce moment.

    Pour ta question, patience, tu verras que certains démons qui ont l'air de rien foutre sont en fait de prodigieux bosseurs.

    Pour le bonjour à Cosmos, ce sera fait quand il sortira du Purgatoire. Il a bouffé les télécommandes de la télé et du DVD alors il est puni.

    RépondreSupprimer