Histoire de Tcl/Tk

 

L'histoire de Tcl/Tk par Vincent Wartelle


Au commencement...


Au commencement il y avait l'assembleur, c'est à dire le langage machine sous sa forme mnémonique. Ce langage existe toujours, et c'est toujours le plus rapide.

Ce langage n'est absolument pas portable, puisque lié à un processeur et un système d'exploitation donné. Il y a en vérité 36 langages assembleurs différents...

Puis il y eut Fortran et Cobol, premiers langages évolués répandus, longtemps maîtres de la programmation sur grands systèmes.

Dans les années soixante de nombreuses recherches théoriques furent faites sur les langages informatiques. Il en ressortit de très nombreux langages de programmation et certains d'entre eux eurent du succès dans des sphères d'applications particulières ;

Pour ne parler que des plus répandus : Fortran fut le maître des applications scientifiques, de calcul à proprement parler ; Cobol domina la gestion, spécialement sur grands systèmes ; Basic fit découvrir la programmation au grand public, étant l'unique langage accessible sur les premiers micro-ordinateurs ; Pascal investit les universités et commença à faire de l'ombre à Fortran ; sur les micro-ordinateurs, on le vit bientôt concurrencer Basic ; les langages fonctionnels tels que Lisp, Prolog, firent le bonheur des chercheurs en informatique ; et la programmation proche du système se faisait toujours en assembleur.


Bref : c'était déjà Babel. Quand, soudain... le langage C


A partir des années 70, il y eut une lueur d'espoir d'universalité. En effet, Kernighan et Ritchie avaient inventé le langage C, qui permettait la programmation système : en particulier, il avait permis d'écrire le système d'exploitation UNIX.

Le langage C était également un héritier du Pascal : il permettait la programmation structurée. Il devint le langage obligatoire des années 80, et remplaça peu ou prou l'assembleur dans la programmation système.

On peut prédire que le langage C restera encore longtemps un passage obligatoire, puisqu'à ce jour les autres langages sont tous écrits en C !

Or en plus de ses qualités intrinsèques (la possibilité d'accéder à des ressources de très bas niveau, une grande vitesse d'exécution, l'accès à des principes évolués telles que la récursion, les structures, les pointeurs vers des fonctions..), et du fait même de sa nature, on ne tarda pas à s'apercevoir que le langage C était "dur à maintenir", et ne convenait donc pas pour tous les usages.

En effet, le langage C introduisait quelques mécanismes aussi géniaux dans l'idée que piégeurs dans la pratique : l'accès direct à la représentation physique des données en mémoire, et à leur emplacement grâce à un mécanisme de pointeurs dont la syntaxe reste un modèle d'hermétisme inégalé. Pour donner un exemple pourtant simplissime : if (p == (*liste)->val.p) { *liste = (*liste)->next } la gestion de chaînes de caractères sous forme de suite d'octets terminée par un zéro binaire, différenciant subtilement leur longueur utile de la place qu'elles occupent en mémoire. La compatibilité des chaînes de caractères avec les tableaux et les pointeurs, et donc le commencement des chaînes à l'indice 0. Ainsi la chaîne "abc" occupe quatre octets, sa longueur est de trois octets, et son deuxième caractère est c. Cette seule caractéristique a formé au débogage des générations de développeurs... l'appel à la gestion de mémoire dynamique (malloc), rendant possible les erreurs de taille d'allocation, les oublis d'allocation et de désallocation ; ce qui permit d'inventer la notion de "fuite de mémoire".

Bref, ce fut quelquefois le paradis de ceux qui écrivaient pour la première fois, et très souvent l'enfer de ceux qui devaient retoucher le code : d'ailleurs c'étaient les mêmes personnes, mais pas sur les mêmes programmes.


Construction de la deuxième Babel : la voie de la structure


Pour se sortir des méandres et des sueurs froides du C, la première voie inventée fut celle de la structuration. "Puisque les fonctions de bas niveau sont dangereuses, encapsulons-les, réservons les aux experts et structurons notre code".

Découpons nos programmes en paquets indépendants dédiés à la manipulation de données typées, chaque paquet ayant sa responsabilité propre : c'est la programmation objet.

Mieux. Mettons en place les mécanismes d'héritage, de polymorphisme (etc), dans un dialecte qui conservera toutes les possibilités du C puisqu'il en sera un sur-ensemble : c'est la naissance de C++, qui fait fureur au début des années 90.

Encore mieux. Du C++ ne gardons que la couche véritablement propre et utile, affranchissons nous de toutes ces fonctions de bas niveau qui restent cause de tant de soucis : c'est la naissance de Java, qui réussit un temps (en 1995/1996) à ressusciter l'illusion du langage C ; enfin un langage universel.


Deuxième Babel par la face Sud : la voie du script


Pendant que la voie de la structuration et de l'objet se construisait, une voie opposée, celle des langages de script était mise en pratique par différents aventuriers ; Larry Wall inventait Perl, John Ousterhout inventait Tcl, Guido van Rossum inventait Python plus tard, Rasmus Lerdorf inventait Php.

Dans la voie de la structuration, on demande au concepteur de classifier et d'architecturer très précisément les données dont il a besoin, pour éviter tout risque d'erreur, de même la spécification précise et détaillée permet la délégation de responsabilité. Puisque cette fonction est précisément décrite, on peut en sous-traiter la réalisation (théoriquement...). Enfin comme le code est structuré, la maintenance est toujours possible.

À l'inverse dans la voie du script, le concepteur est libéré de la notion de classification : il doit considérer que le type des données est le problème du langage. Si je manipule "5", ce sera une chaîne de caractères si je l'affiche, un nombre si je l'utilise dans une addition, mais ce sera toujours "5" ; l'utilisation du langage de script ne libère pas de l'obligation de spécification, mais elle permettra un prototypage plus rapide ; la maintenance est rendue possible par la concision du code ; sans tomber dans l'excès, l'élégance en matière de scripting consiste à faire beaucoup plus court qu'avec un langage "en dur".

On peut se demander pourquoi la voie du script reste minoritaire auprès des professionnels de l'informatique, tant elle paraît plus efficace ; la raison tient à sa trop grande diversité ; comme on l'a vu, pas moins de quatre langages aussi proches que différents représentent cette voie. C'est pourquoi les langages de script sont souvent l'apanage des petites structures et de groupes ayant vocation de recherche, qui en font un moyen de compétitivité.


Tcl et les autres langages de script


Il n'est pas possible ici de comparer les mérites respectifs de Perl, Python, Tcl, Php. En effet, l'auteur de cette page a une préférence trop marquée pour Tcl, et une connaissance insuffisante des autres langages pour que cette comparaison soit valable...

Essayons simplement de résumer les atouts propres à Tcl. Ils sont de plusieurs ordres : c'est un langage gratuit, extensible au moyen du langage C ; il est doté de structures de stockage simples et puissantes : la liste, et le tableau (hashtable). Il a les possibilités d'un langage fonctionnel (c'est à dire schématiquement "tout est dans tout, et réciproquement..." ; je peux créer de nouvelles structures de contrôle, modifier dynamiquement mon code etc.) ; il est doté d'un toolkit graphique compact, portable et complet (notamment avec un bon mécanisme de gestion d'événements) ; sa distribution est compacte, documentée, s'installe facilement. RS: N'oubliez pas : Tcl est indépendant de la plateforme, soit-elle Macintosh, Unix ou Windows, ou plusieurs autres...