Tout d'abord, prononcez (si vous voulez etre dans le coup) Tickle - Teekay et non pas Técéèle téka. Mais treve de balivernes (on fait dans la litterature populaire du debut du XXeme :-), TCL est l'abreviation de Tool Command Langage : langage de commande d'utilitaire. En fait, le TCL est un langage de script, proche des langages de scripts shell (sh, bash, ksh, csh, tcsh) mais concu avec un objectif plus general que l'organisation des commandes systeme. En fait, le TCL a ete concu a la base comme un langage generaliste pour configurer et/ou controler des applications en langage traditionnel. Mais ses evolutions successives (la version actuelle est la 7.5pl1) en ont fait un langage interprete tres puissant et surtout tres extensible.
Le caractere extensible du TCL a entraine l'elaboration de nombreuses extensions dont la plus connue et la plus utilisee est l'extension Tk. Inspiree d'HyperCard (sur les vieux Mac) dans le principe mais non dans la forme, le Tk permet de rajouter des interfaces graphiques aux outils developpes en TCL ou a l'aide du TCL (nous allons y revenir). Les interfaces ont le Look and Feel Motif, et sont tres jolies meme avec les parametres par defaut. La derniere version de Tk porte le numero 4.1 patch level 1
John K. Ousterhout est le createur du TCL et de son extension Tk, il est professeur au departement d'ingenierie electrique de l'universite de Berkeley, Californie. Il continue de regulierement faire evoluer ses bebes et ceci, depuis 1987.
Nous avons vu que le TCL etait un langage interprete, ce qui le rend certes assez lent, mais aussi tres facile a debugger. Avec l'evolution du materiel, il ne serait pas etonnant que les langages interpretes ou semi-interpretes (P-Code) prennent le large mais ne nous inquietons pas, nous pourrons encore faire du C pendant pas mal de temps :-). Le TCL est aussi un langage tres original, dans le sens ou il occupe une position a part dans la grande famille des langages de programmation. Inspire du C dans la structure du code et la syntaxe, le TCL est pourtant tres different d'un C interprete (comme le S-Lang de Jed par exemple). Le seul type de donnee utilise par le TCL est la chaine de caractere. Ainsi les variables representees par des chaines quelconques (ca peut etre deroutant d'avoir une variable "CECI EST UNE VARIABLE !" mais il est evident que l'on va se restreindre sur le choix des noms), peuvent contenir n'importe quelle suite de caractère comme : "CECI EST LA VALEUR D'UNE VARIABLE" ou 2 ou 3.1323/12. En interne, ce sont donc des chaines de caracteres et ce sont les differentes instructions (ou procedures que nous allons creer) qui interpreteront ces valeurs comme des chaines, des entier ou des reels.
Par exemple, regardez le source TCL suivant :
set PI 3.1415925 expr $PI / 2 => 1.5708La commande set permet d'initialiser une variable. L'instruction expr a interprete la chaine "3.1415925" contenue dans la variable PI comme un reel et a effectue le bon calcul. Remarquez le signe dollar $ devant le mot PI dans l'instruction expr. Ce symbole indique qu'il faut remplacer la chaine PI par la valeur de la variable du meme nom puis d'evaluer l'expression. On parle de substitution avant l'evaluation et c'est tout le principe du TCL. Pour essayer vous meme le script precedent, il suffit de lancer le programme tclsh puis de taper les instructions au prompt du shell tcl. On peut bien sur reunir de nombreuses instructions dans un fichier (portant l'extension .tcl de preference) et de lancer tclsh nomduscript.tcl.
Le principe de la substitution evoque plus haut doit etre bien maitrise en TCL. Nous avons vu que le symbole $ devant un nom de variable entrainait la substitution du nom de la variable par sa valeur. Il existe pourtant des cas ou cette subsitution ne doit pas avoir lieue, par exemple si on veut afficher la chaine Micro$oft. On utilisera tout simplement la chaine Micro\$oft avec un antislash devant le dollar. Les accolades permettent aussi d'empecher une substitution et sont utilisees pour ce que l'on appelle la substitution differee. Pour expliciter ce concept, nous allons etudier le cas de la boucle while dans l'exemple suivant :
set compteur 0 while { $compteur <= 10 } {La variable compteur est d'abord initialisee a 0 puis on construit la boucle tant que la valeur numerique de compteur est inferieure ou egale a 10. On affiche le contenu de compteur puis on increment sa valeur a chaque iteration (sinon, la boucle serait infinie). Si on n'avait pas placer les accolades pour la condition du while, on aurait a chaque iteration l'execution suivante :
while 0 <=10 ...Ce qui est toujours vrai, on aurait donc une boucle infinie. Les accolades permettent donc de differer l'evaluation de la condition qui aura lieue en interne dans la procedure while (qui est donc une procedure au sens TCL du terme).
Nous allons donc maintenant introduire les procedures TCL/TK. Voici comment on declare une procedure :
proc multiplie { x y } {La declaration de la procedure commence par proc puis on trouve le nom de la procedure (ici multiplie), la liste des arguments entre accolades (ici x et y) puis le corps de la procedure entre accolades. Les accolades dans les arguments permettent de composer une liste, nous verrons plus tard ce que c'est mais retenez que la commande proc attend trois arguments : le nom, la liste des arguments et le corps de la procedure, d'ou les accolades.
Les listes premettent de representer une suite d'elements, on peut effectuer des recherches sur ces elements, les recuperer dans une chaine de caractere, etc. On peut associer les listes TCL aux tableaux monodimensionnels du C avec une structure plus souple. Pourtant, en TCL, il y a aussi un type tableau : array. Mais les tableaux TCL sont dits associatifs, c'est a dire que l'on associe pas un index numerique au elements du tableau mais une chaine de caractere. Ainsi, on pourra declarer le tableau :
set systeme1(nom) Linux set systeme1(puissance) enorme set systeme1(prix) "rien du tout" # notez que les guillemets permettent d'ajouter des espaces dans une chaine. # et que les commentaires commencent par un dieze sur une ligne vierge set systeme2(nom) WinNT set systeme2(puissance) bof set systeme2(prix) arrrrrrgggghhhhhh puts [array get system1] nom Linux prix {rien du tout} puissance enorme puts [array get system2] nom WinNT prix arrrrrrrgggghhhhhh puissance bofla commande array get tableau permet de convertir tous les elements du tableau portant le nom tableau en une liste. Vous decouvrez l'utilisation des crochets qui permettent d'effectuer une substitution de commande ainsi la commande array get system1 sera remplacee par son resultat avant l'execution de la commande puts.
Le TCL/TK regorge de bonnes idees mais il faut avouer qu'il est un peu deroutant pour un habitue des langages "traditionnels". Cependant, on s'habitue tres vite au mecanisme des substitutions et on peut des lors realiser des scripts tres interessants et ceci tres rapidement. Le TCL couvre a peu pres tous les domaines interessant pour un langage de script (fichiers, recherches, structures de controle, etc.) mais il nous reste a decouvrir son caractere extensible.
Le TCL serait surement moins utilise sans son extension Tk qui permet d'associer des interfaces tres sympathiques a des scripts TCL ou meme a des applications C. Nous n'allons pas entrer dans les details du Tk mais sachez que l'on utilise un autre interpreteur : wish qui est 100% compatible avec tclsh mais qui dispose de toutes les nouvelles fonctionnalites de Tk. Comme toutes Interface sous X-Window qui se respecte, les elements d'interface de Tk sont des widgets (windows gardgets). Pour voir comment cela fonctionne, lancez wish et tapez les instructions suivantes:
Vous devez ensuite voir l'affichage suivant :

Comme vous pouvez le constater, il faut peu de lignes de code pour construire ces widgets. La syntaxe est toujours la suivante :
Les options pour chaque type de widget sont tres nombreuses, heureusement qu'un guide de reference tres pratique est disponible gratuitement (cherchez "Tcl/Tk+Reference+Guide"sur altavista par exemple ou recuperez-le dans les contribs du mois). Le nom commence dans notre exemple par un point car comme pour tous les widgets, ils font parti d'un hierarchi ou le widget portant le nom . correspond a la fenetre top niveau toujours presente dans Tk. On peut par exemple definir le nom .frame.bouton pour creer un bouton .bouton descendant du cadre portant le nom .frame. Ce qui permet de construire des interfaces complexes assez simplement.
La commande pack appelle le gestionnaire de fenetre integre au Tk (et tres cooperant avec les autres gestionnaires de fenetres) pour placer les widgets sur la fenetre. Les options de pack sont tres nombreuses et depassent le cadre de cette presentation. Un autre gestionnaire est le "placer" qui permet de specifier des coordonnees absolues ou relatives pour les widgets.
D'autres widgets plus compliques existent comme les boites a liste (listbox), les cadres (parents d'autres widgets), le canvas (permettant le dessin), les scrollbars, les menus ou encore un widget text tres complet comportant des capacite d'hypertexte.
Si vous discutez avec des fans de Tcl/Tk, ils vous diront qu'ont peut tout faire avec mais vous n'allez pas trouver la puissance et la rapidite du C ni l'enorme potentiel de Motif. Il faut tout de meme reconnaitre que pour certaines applications, on dispose d'un package extremement puissant et surtout tres simple d'utilisation. On utilise souvent les langages de Script pour faire des programmes de configuration, et ici, c'est le nirvana pour ce genre d'applications avec l'extension Tk, configurer avec fenetres, boutons, etc... C'est vraiment le top ! Une autre utilisation courante de Tcl/Tk consiste a interpreter des scripts depuis des programmes en C, car vous disposez aussi de deux librairies (statiques ou dynamiques) pour utiliser toutes les fonctionnalites deTcl/Tk dans les programmes C pour reunir le meilleur des deux mondes.
Pour vous montrer a quel vitesse on peut se familiariser avec Tcl/Tk, voici ma premiere application, un outil systeme de connection par PPP : tkppp qui represente a peine 500 lignes de code et deux jours de travail (sans aucune connaissance en Tcl/Tk a la base).

Tkppp permet de se connecter a un serveur PPP (ici club internet), il donne un ordre de grandeur du temps ecoule pour la derniere connection, permet en outre de configurer les connections. C'est tout simplement un frontf end au daemon pppd (voir "Configuration PPP" et les contribs du mois pour plus de details). On voit cependant que les interfaces Tk peuvent etre fort sympathiques et vous verrez, si vous allez jeter un coup d'oeil au code que le Tcl permet de gerer les fichiers de configuration de facon tres simple, un vrai plaisir meme s'il faut s'habituer a certains concepts.
Si le Tcl/Tk vous interesse, je vous conseille le livre :
Tcl and the Tk Toolkit - John K. Ousterhout (C) 1994 Addison-Wesley Publishing Company, Inc ISBN : 0 - 201 - 63337 - XC'est le livre du createur de Tcl/Tk (voir article "la bibliotheque du parfait passionne"), une reference, donc et un outil tres didactique.
Il y a beaucoup de liens Tcl/Tk : sous altavista (par exemple), entrez la recherche : "Tcl Tk links", vous devriez trouver des choses interessantes. Le newsgroup dedie est comp.lang.tcl.