par Marc Thirion thirion@verilog.fr
Tcl (Tool Command Language) a été inventé en 1987 par John K. Ousterhout pour piloter des applications de conception de circuits intégrés. Il s'est en effet aperçu qu'une part non négligeable du développement de ces applications consistait à réinventer le langage de commande de l'application. Depuis 1995, JKO travaille pour Sun, mais la licence du noyau Tcl est (et restera) du type Berkeley : on fait ce qu'on veut avec le code, à condition que l'on explicite que le produit final contient ce code. La version courante du noyau est la 7.5, qui fonctionne sur MS Windows (3.1, 95 et NT) et sur MacOs (en plus de fonctionner sur les vrais systèmes d'exploitation :-). Cette fonctionnalité permet en outre le chargement dynamique des extensions (pour ELF sur linux).
Tcl est un langage de script. C'est surtout un interpréteur de commandes extensible et intégrable. Extensible : on peut ajouter des commandes écrites en C qui seront appelables depuis les scripts Tcl. Ces commandes peuvent être regroupées par fonctionnalités pour former des paquetages (ou extensions). Intégrable : l'intepréteur est une fonction C qui peut être invoquée par une application. Pour le programmeur lambda, Tcl vaut surtout par l'abondance d'extensions déjà écrites, dont les plus connues sont Tk (qui en fait fait partie du noyau - version courante 4.1) qui permet de fabriquer des interfaces graphiques au look Motif interprétées, itcl qui est une extension de programmation orientée objet, Tix (widgets au dessus de Tk), et expect (contrôle de dialogue avec des applications interactives textuelles).
Un script est une chaîne de caractères représentant une suite de commandes séparées par des points-virgules ou des sauts de ligne. Ceci est analogue à bash, aussi oyons rapidement les différences:
De plus, certaines commandes Tcl du noyau connaissent une structure de données conventionnelle, la liste : il s'agit d'une chaîne de caractères dont les élements sont séparés par des espaces et les sous-listes encadrées par et . Attention, le novice est souvent (toujours ?) perturbé par l'identité des caractères encadrant une sous-liste et une chaîne non substituée; il faut prendre l'habitude de distinguer ce qui est vu par l'interpréteur de ce qui est vu par la commande.
Positionnement de la valeur d'une variable :
set a dire
Positionnement de la valeur d'un élément de tableau :
set y'a(bon) banania(y'a est le nom du tableau).
Positionnement de la valeur d'une variable avec une liste :
set a {b {c d} e}
ou (équivalent) :
set a "b {c d} e"
(liste de 3 éléments dont le second est une liste de deux éléments). Procédure Tcl :
proc print {a b} { puts "$a $b" }
(usage: proc nom-de-commande liste-d'arguments script) Cette procédure écrit sur la sortie standard les valeurs de ses deux arguments séparées par un espace et terminées par un saut de ligne.
Outre l'écriture rapide de petites applications, je vois trois usages principaux à Tcl :
Sur Unsenet, les groupes comp.lang.tcl (lisez les FAQs !) et comp.lang.tcl.announce.
Le livre de J.K. Ousterhout : Tcl and the Tk Toolkit (Addison-Wesley) décrit tcl7.3 et tk3.6
Le livre de Welsh: Practical programming with Tcl and Tk (je ne connais pas l'éditeur) qui décrit tcl7.4 et tk4.0.
Le repositoire Tcl à ftp.neosoft.com, qui contient les distributions Tcl et presque toutes les extensions.
À Verilog (c'est là que je travaille) deux produits incluent Tcl (pas Tk) : "ils tombent dans la catégorie parties paramétrables par l'utilisateur". Tous deux sont des extensions de Tcl qui permettent d'interroger des structures de données d'applications : une dans le but de vérifier des règles de programmation en C, l'autre pour générer de la documentation à partir d'un outil soutenant la notation OMT (le tout à base de tcl7.3). Ceci a permis de constater que Tcl est très souple d'emploi, mais qu'une attention scrupuleuse doit être apportée à l'interface proposée par l'extension. En effet, Tcl est un langage inefficace du point de vue du temps d'exécution; aussi faut-il apporter beaucoup de soin à ce que les interfaces permettent d'effectuer les opérations courantes directement en C.
(Cet article est très largement inspiré d'une présention technique interne que j'ai effectuée à Verilog).