Introduction à Critcl

 

Préambule

Vous savez ce qu'est Critcl sinon vous ne seriez pas sur cette page.

Bon, partons du principe que vous soyez arrivés ici par hasard ... Critcl signifie Compiled Runtime In Tcl et a été écrit par Jean Claude Wippler, que les utilisateurs de tclkit et autres starkit connaissent déjà. C'est bien mais ça ne nous dit pas à quoi ça sert.

Critcl permet simplement d'écrire du C dans du Tcl, le code C étant compilé et chargé lorsqu'on en a besoin. Afin de ne pas avoir à supporter le temps de compilation à chaque lancement du script, Critcl utilise un système de cache, basé sur la somme MD5 des sources C.

Pour pouvoir distribuer les scripts Tcl utilisant critcl sur des machines ne disposant pas de compilateur C, Critcl permet également de créer des extensions Tcl natives sans devoir installer les sources de Tcl. Ceux dans l'assistance qui ont déjà dû recompiler une extension Tcl "classique" apprécieront la beauté du geste.

Alors, pourquoi écrire du C dans Tcl ? La plupart des utilisateurs de Tcl sont justement des gens qui fuient plus ou moins le C et autres langages compilés. Tout simplement parce qu'il y a des choses qu'on ne peut pas faire "juste" en Tcl ou pour des raisons de vitesse, le Tcl étant plus connu pour sa concision que pour ses performances, il faut bien le reconnaître. Un autre "avantage" étant de pouvoir "cacher" le code critique puisque vous pourrez ne distribuer que la version compilée du code C.


Installation

 Pour linux: http://www.equi4.com/pub/tk/8.4.8/tclkit-linux-x86.gz
 Pour Mac: http://www.equi4.com/pub/tk/8.4.8/tclkit-darwin-ppc.gz
 gzip -d tclkit-*.gz
 mv tclkit-* tclkit
 chmod +x tclkit
 mv tclkit /usr/bin/

Ce dernier nous permettra de "packager" et "dépackager" les starkits.

 $ tclkit critcl.kit

        To compile and run a tcl script
            critcl [-force] [-keep] file[.tcl]

        To compile and build a shared library or package
            critcl [-force] [-keep] [-lib|-pkg] name [infiles...]

        -force      force compilation (ignores cache)
        -keep       keep intermediate C files
        -lib        generate $name.so
        -pkg        generate a package structure under lib/$name

        all options may be abbreviated to the first character

On va maintenant ajouter tout ce qui est fourni par critcl à notre environnement tcl. On commence par "unwrapper" le tout.

 $ tclkit sdx.kit unwrap critcl.kit
 48 updates applied

On obtient un répertoire critcl.vfs. Ce dernier contient un sous répertoire lib dont on va copier le contenu la où Tcl saura le trouver, c'est à dire dans un des répertoires renvoyés par la commande set auto_path.

Nota Bene: On peut optionellement garder le contenu là où il est mais il faudra commencer tout nos scripts par une commande semblable à celle donnée ci dessous, qui correspond à une "décompression" du kit dans notre répertoire de travail Tcl.

 lappend auto_path ./critcl.vfs/lib

Test

Il convient de vérifier le bon déroulement de l'installation. Pour cela on lance tclsh, tclkit ou tkcon et au prompt de l'interpréteur on tape les lignes suivantes (éventuellement après s'être placé dans le bon répertoire)

 % lappend auto_path ./critcl.vfs/lib
 /usr/bin/tclkit/lib/tcl8.4 /usr/bin/tclkit/lib ./critcl.vfs/lib
 % package require critcl
 0.34

Si vous obtenez un résultat semblable l'installation s'est déroulée correctement.


Utilisation

Dans les exemples suivants, je partirai du principe que la modification d'auto_path n'est pas nécessaire (c'est à dire que vous avez transféré le contenu de critcl.vfs/lib "là où il faut"). Si vous préférez garder critcl.vfs/lib dans votre répertoire courant, vous aurez néanmoins toujours à modifier auto_path en conséquence avant de charger le package critcl.


Une somme

On va commencer par créer une procédure pour faire des sommes. Quelque chose de simple pour commencer. Créons donc un script somme.tcl contenant ceci:

 package require critcl
 ::critcl::cproc somme {int n1 int n2} int {
	return (n1 + n2);
 }

On rencontre là ::critcl::cproc, qui permet de définir nos procédures à partir de code C.

Les arguments sont le nom de la procédure, la liste des arguments précédés de leur type, le type retourné et enfin, le code C.

Dans l'interpréteur, après avoir "sourcé" ce script, on peut utiliser la procédure somme.

 % source somme.tcl
 % set neuf [somme 4 5]
 9
 % somme
 wrong # args: should be "somme n1 n2"
 % somme A 4
 expected integer but got "A"

On peut ajouter ainsi les trois autres opérations basiques. On se rend alors compte, lors de la première utilisation d'une des procédures du temps de compilation mais aussi et surtout que ce temps est inexistant ensuite.


Voir aussi:


30 Août 2005 - Création - XG


[ Catégorie Cours | Catégorie Tutoriel ]