Faut il développer, harmoniser les notations en algo
J'hésite à m'immiscer dans une discussion proche où les gens contribuent, 'travaillent' sérieusement. J'ai peur d'être pris pour un provocateur, l'avocat du diable et de me faire lyncher. Je souhaiterais donc m'exprimer sur une discussion parallèle où chacun pourrait donner son point de vue pour et contre sans qu'on puisse faire état de "péché contre l'esprit".
Ne pas réinventer la roue
Je vois avec plaisir, que les "piliers" du forum que sont millie et PRomu@ld acceptent de participer à ce débat, bien qu'ils soient plus ou moins engagés dans une initiative, disons contradictoire. C'est encourageant ! Je les en remercie et j'espère qu'ils seront ultérieurement rejoints par des membres, des visiteurs quel que soit leur avis sur la question.
Je reprendrai, un peu plus tard, quelques arguments particulièrement intéressants qui ont été développés, et qui, j'en ai l'impression apportent de l'eau à mon moulin.
Je me contenterai pour l'instant de mettre l'accent sur le point suivant:
Reprenez le fil "Notation en algorithmique", message après message. On y discute de la déclaration des fonctions, des procédures, notation de l'affectation, utilisations des pointeurs, etc.. etc..
Bref, il s'agit ni plus ni moins de la reconstruction d'un langage (j'allais dire de programmation...). C'est un long travail ! De mon point de vue pas spécialement intéressant car parsemé de discussions bizantines:
Doit-on noter l'affectation avec <- ou bien avec := ou bien simplement = ? On sait fort bien que ces trois notations coexistent depuis toujours.
Qu'aura-t'on obtenu au final ?
Dans le meilleur des cas donc, un formalisme ressemblant comme deux gouttes d'eau aux langages procéduraux de la lignée Algol.
Il voudra s'en distinguer par deux caractéristiques:
Pas d'interprète ni de compilateur (toute exécution directe du code est donc exclue).
Les types utilisés correspondent à des entités mathématiques (entiers, réels, etc...) sans considération pour les limitations des types de base des différents langages et leur codage.
Le code ainsi produit, veut donc atteindre à l'universalité.
Est-il pour autant plus lisible qu'un véritable code (programme) équivalent? Je ne le crois pas.
Par ailleurs, il faudra tôt ou tard essayer l'algo, donc le traduire dans un langage pratiqué. Et là les mauvaises surprises risquent d'arriver très vite, pour différentes raisons:
Parce que le langage utilisé est très loin, dans son esprit d'un langage procédural (PROLOG, SMALLTALK, ou même ce bon vieux LISP).
Parce que dans tout système connu la représentation des réels est si approximative et si mauvaise que l'expression
a - a*b/b n'est presque jamais vraie !
Voilà donc le premier volet de mon argumentation. Une dépense d'énergie importante pour finalement rien de bien nouveau.
J'espère trouver le temps dans les jours qui suivent de développer d'autres arguments.
Ce qu'ils font ailleurs !
Juste une petite mise au point avant de commencer:
Citation:
Nous ne sommes pas des piliers du forum. D'ailleurs cette phrase est à double sens ...
Même avec beaucoup d'imagination, je ne vois pas quel peut être le sens 'caché'... Pour moi "pilier = qui soutient" point barre. Je me base uniquement sur le nombre de posts affiché pour affirmer que vous soutenez le forum.
Revenons à nos moutons. L'algorithmique, n'est pas (et n'a jamais été) une science "française". La contribution de nos chercheurs est marginale (à preuve, combien d'algos contemporains portent des noms "bien de chez nous"). Je n'en trouve aucun ... La raison est certainement complexe car les français réussisent bien dans d'autres domaines scientifiques. Elle est peut être culturelle, nos compatriotes sont trop tournés vers la théorie et ils manquent de sens pratique.
Voyons donc ce que font les américains dans leurs plus prestigieuses universités:
Commençons par le fameux M.I.T. Je cite l'ouvrage de référence "Introduction to algorithms" de Thomas Cormen, Charles Leiserson et Ronal Rivest. Ce bouquin est traduit en français sous le titre "Intoduction à l'algorithmique". C'est un pavé de plus de 1000 pages paru chez Dunod en 1994. Vous pouvez ajouter ce titre à votre biblio s'il n'y figure déjà.
Les auteurs ont choisi d'utiliser un pseudo code. Pour ce qui concerne la définiton du pseudo-code l'affaire est disons 'torchée' en un paragraphe d'une page (en 8 points) intitulé "Conventions concernant le pseudo-code. Je pourrais, si vous n'avez pas le document sous la main, vous envoyer un scan. Et ils ajoutent: "Parfois la méthode la plus claire est le langage naturel, ne vous étonnez donc pas de voir une phrase en français insérée dans une section de code 'réel' ". On ne peut pas faire plus souple.
Voyons maintenant Princeton.
Robert Sedgewick, directeur du département info, comme bon nombre de ces collègues (Patrick Henri Winston et autres) préfère utiliser un langage support, et il a choisi le 'C' parce que très populaire dans la communauté des programmeurs. Il a donc écrit "Algorithmes en langage C", un autre bouquin très intéressant également traduit chez Inter-Editions (Addison Wesley Europe), et que vous pouvez aussi ajouter à la biblio si ce n'est fait. Le langage C évolue, qu'à cela ne tienne, le même auteur publie "Algorithmes en C++" où il tire partie des nouvelles possibilités pour rendre les choses plus claires. Naturellement Sedgewick, comme il précise lui-même, refuse d'exploiter les particularités du 'C'. On peut donc utiliser un langage support pour peu qu'on refuse d'entrer dans les spécialisations et de publier du code optimisé, presque toujours parfaitement illisible.
En résumé, les Etatsuniens n'ont pas peur de coder directement dans un langage réel, et quand ils décident de s'en affranchir ils le font de façon très 'light'.
A méditer ...
Algorithmique et types de données abstraits
Ce concept apparaît à la fin des 70 et favorise l'apparition des langages dits "orientés objets".
(Voir l'article de millie 'forum Q/R à intégrer dans les FAQ'.) La plupart des langages modernes appartiennent à cette famille, mais ils gardent un aspect procédural car ils sont en fait des hybrides résultant de la migration des langages classiques par addition d'une "couche objet" (C++, Java, C#, Python, Object Pascal, etc…).
L'algorithmique peut elle ignorer cette tendance ?
En programmation procédurale classique on pense en termes de traitement, de boucles imbriquées, de tests d'affectations, etc…En P.O.O. on pense en termes d'objets (de types de données).
Que prévoient les pseudo codes classiques ?
Généralement la possibilité de construire des types structurés par agrégation de types primitifs (record ou struct). La notion de "méthode" n'existe pas, mais on peut parfaitement se contenter d'écrire des fonctions spécialisées manipulant les structures.
Quels objets sont indispensables en algorithmique contemporaine?
Tous les types de collections (tableaux dynamiques, dictionnaires, etc..)
Tous les types de données dynamiques (listes, arbres ec….)
Dynasets pour l'accès aux B.D.
J'en passe !!!
Que faire pour décrire un algorithme 'moderne' utilisant ces concepts?
La méthode classique: Redéfinir les listes chaînées et les méthodes (ajouter un élément en tête, en queue, le retirer, etc…). Une fois de plus on réinvente la roue !
Ou alors adopter une hiérarchie de classes existante:
MFC pour les copains de Bill
wxwidgets (multi-plateformes, multi-langages – ex wxwindows)
Où encore les objets java prêts à l'emploi.
Au choix !
Quel formalisme choisir ?
C'est à mon avis le vrai nouveau défi pour le formalisme de type 'pseudo-code', mais les initiatives sont bien peu nombreuses.
Voici, quelles sont, à mon avis les vraies questions.
Il est préférable de réfléchir dans cette direction plutôt que de choisir entre trois notations concurrentes pour l'affectation ou bien de décider si on doit souligner les mots clefs ou bien les écrire en gras ou en capitales.