1 points par GN⁺ 7 시간 전 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • Tcl/Tk est un ensemble d’outils sous licence BSD permettant de créer à la fois des CLI et des GUI de type natif sur Windows, Linux et macOS, avec prise en charge des événements et des E/S non bloquants ainsi que d’un threading isolé
  • Tcl est un langage centré sur les commandes qui interprète le premier mot comme une commande et traite le code comme les données sous forme de chaînes ; Tk abstrait l’interface propre à chaque système d’exploitation sous forme de widgets et d’événements
  • Tcl/Tk 9.0, publié le 13 novembre 2025, ajoute le 64 bits, Unicode complet, un encodage strict, le packaging en fichier unique via ZipFS, SVG, le DPI haute résolution et le Dark Mode, mais introduit des changements de compatibilité pour une partie du code existant
  • Il est utilisé depuis longtemps dans git gui, des outils FPGA/EDA, Cisco IOS, des environnements d’exploitation de l’ESA, la compilation et les tests de SQLite, l’application Decent Espresso, etc., et certains scripts des années 1990 s’exécutent encore avec les versions récentes
  • Plutôt qu’aux calculs numériques massifs, il se prête comme langage de liaison aux interfaces événementielles, à l’automatisation, aux E/S, aux DSL et à l’orchestration de processus natifs, tandis que le calcul peut être délégué à des composants externes en C, C# ou Python

Pourquoi choisir Tcl/Tk

  • Tcl/Tk permet de composer un environnement d’environ 100 Mo ou moins, même avec des packages courants, et de créer de petites applications en fichier unique selon les plateformes prises en charge, ainsi que des applications web
  • La licence BSD autorise la modification, la redistribution et la vente totale ou partielle, tandis que la communauté Tcl maintient le cœur et les versions
  • Les autres options GUI étudiées présentaient les contraintes suivantes
    • AutoHotkey v2 convient aux petits outils Windows, mais il est réservé à Windows et ne garantit pas les appels natifs sous Wine
    • C# WinForms dépend des API Windows, tandis que MAUI et Avalonia ont de lourdes dépendances et rendent le développement de petites applications non enterprise fastidieux
    • Les applications web locales de type Electron obligent à gérer la communication frontend-backend, les conflits de ports et la sécurité, et un navigateur vide peut déjà consommer plus de 100 Mo
    • Une fenêtre simple créée avec Fyne ou Gio en Go comportait environ 40 000 dépendances indirectes et un binaire statique de plus de 30 Mo, sans ressembler à une application native
    • Qt implique une configuration complexe autour de MOC, des signal/slot à la frontière native, et des licences GPL/LGPL ou commerciales
  • De nombreux frameworks GUI modernes dessinent directement sur un canvas plutôt que d’utiliser les API d’interface du système d’exploitation, et embarquent tout l’environnement d’exécution par OS et CPU, ce qui rend difficile l’obtention d’une apparence native

Tcl, conçu comme langage de liaison

  • Tcl, présenté par John Ousterhout en 1990, a été conçu comme une colle architecturale reliant du code bas niveau performant à une couche logique lisible par l’humain
    • Bridge : relie du code comme C++ ou Rust à une interface de haut niveau
    • Orchestrate : contrôle les flux de données entre programmes et modules
    • Wrap : expose des traitements internes complexes sous forme de commandes de script simples
  • Tk est une boîte à outils GUI multiplateforme qui complète les interactions en ligne de commande de Tcl, et peut être chargé avec package require Tk
  • Le petit cœur en C de Tcl prend en charge Windows, Linux, macOS ainsi que ARM, x86 et RISC-V
    • Pour Android, il est possible d’utiliser Termux pour la CLI et AndroWish pour la GUI
  • Ousterhout a reçu en 1997 l’ACM Software System Award pour le développement de systèmes logiciels ayant exercé une influence durable

Exemples industriels d’usage au long cours

  • Tcl est utilisé depuis environ 40 ans dans des environnements où la fiabilité, la rétrocompatibilité et la portabilité sont essentielles
    • git gui et gitk, inclus dans Git
    • Langage d’automatisation pour les outils de conception FPGA et de puces de Xilinx, Altera, Cadence, etc.
    • Cisco IOS Embedded Event Manager
    • GUI internes pour les fermes de simulation et testeurs matériels d’Intel, NVIDIA et AMD
    • Calibre et Virtuoso de Siemens EDA
    • Environnements opérationnels ESTEC et ESOC de l’ESA
  • Un même outil Tcl/Tk peut s’exécuter sans recompilation depuis un terminal de centrale nucléaire jusqu’à un Raspberry Pi
  • SQLite a d’abord été créé comme extension Tcl, et la moitié de ses tests sont écrits en Tcl
    • Tcl joue aussi le rôle d’« assembleur » en post-traitant plus de 125 fichiers d’entrée C afin de produire plus de 200 000 lignes de source final SQLite

Composition de l’installation et modes d’exécution

  • Une installation classique inclut les composants suivants
    • tclsh : interpréteur CLI
    • wish : shell GUI incluant Tk et la boucle d’événements
    • Tcllib·Tklib : bibliothèques comme http, csv, json, aes, tooltip, dateentry
    • Packages d’extension comme Thread, TLS ou le glisser-déposer
  • Lancé sans argument, il ouvre un REPL permettant de saisir des commandes, de coller des scripts et d’exécuter des fichiers via source
  • En passant un fichier, par exemple tclsh myscript.tcl ou wish app.tkapp, il s’exécute en mode batch non interactif
  • Sous Windows, wish est une application GUI : il utilise donc la Tk Console au lieu d’une vraie console, et si le thread UI est bloqué, la sortie peut sembler interrompue elle aussi
  • Pour l’apprentissage, tclsh est recommandé, car il fournit les entrées/sorties standard sur toutes les plateformes et peut aussi charger Tk

La syntaxe de Tcl centrée sur les commandes

  • Le code source Tcl est composé de mots séparés par des espaces : le premier mot est toujours la commande, les autres sont ses arguments
  • Les principaux éléments syntaxiques sont les suivants
    • set : définit ou consulte une variable
    • $name : substitue la valeur d’une variable
    • proc : définit une procédure qui se comporte comme une nouvelle commande
    • [...] : exécute le script interne et substitue son résultat
    • {...} : regroupe en un seul argument sans substitution
    • "..." : regroupe en un seul argument tout en effectuant les substitutions $, [] et \
    • {*} : développe une liste en plusieurs arguments
    • :: : désigne un chemin global ou d’espace de noms
    • Les retours à la ligne et ; : séparent les commandes
  • Dans string range "Tcl Programming" 0 2, string est un ensemble qui répartit vers la sous-commande range et renvoie Tcl
  • if, while et return sont eux aussi des commandes ordinaires, pas des mots-clés réservés
    • while réévalue de façon répétée les chaînes de condition et de corps
    • Avec uplevel, on peut créer des structures de contrôle personnalisées comme repeat ... until|while ...
    • return transmet les codes de complétion TCL_OK, TCL_ERROR, TCL_RETURN, TCL_BREAK, TCL_CONTINUE

Homoiconicité et substitutions sûres

  • En Tcl, code et données sont tous deux des chaînes composées de mots, si bien qu’une même valeur peut être interprétée comme une liste, des données ou une commande à exécuter
  • Lorsqu’on développe une liste avec {*}$userinput, le premier élément devient la commande et les suivants les arguments ; si les arguments contenant des espaces ne sont pas correctement regroupés, cela peut provoquer des problèmes comme des erreurs de nom de canal
  • Cette homoiconicité facilite les DSL et l’extension des structures de contrôle, mais crée aussi une charge en matière d’intégrité et de sécurité, car les données peuvent devenir du code exécutable
  • Les callbacks doivent être construits avec [list command $arg] afin de préserver les frontières des arguments contenant des espaces et des caractères spéciaux
  • Les expressions de expr et if doivent toujours être entourées de {...} afin d’éviter les doubles substitutions et l’injection de commandes, tout en bénéficiant de l’optimisation en bytecode
  • Le Safe Interpreter bloque par défaut l’accès au système de fichiers, aux sockets et aux bibliothèques externes, et n’expose que les fonctionnalités autorisées via interp alias

Les nouveautés de Tcl/Tk 9.0

  • La Tcl/Tk Core Development Team a publié la version 9.0 le 13 novembre 2025, 12 ans après Tcl 8.6
  • Les principaux changements sont les suivants
    • Passage complet au 64 bits et prise en charge de l’ensemble des points de code Unicode
    • ZipFS, qui monte les fichiers ZIP comme systèmes de fichiers virtuels
    • Prise en charge par Tk de SVG, des hautes densités DPI, des notifications système et du Dark Mode Windows/macOS
    • Profil strict par défaut, qui signale immédiatement une erreur en cas d’incohérence d’encodage
  • Il existe aussi des changements de compatibilité
    • Le changement de taille des pointeurs peut casser des scripts incluant du code C critcl
    • Dans Tcl 8.x, 010 vaut 8 en octal, mais dans Tcl 9 il vaut 10 en décimal ; l’octal utilise le préfixe 0o
    • Le BOM UTF-8 U+FEFF n’est plus supprimé automatiquement, il faut donc le retirer explicitement si nécessaire
  • Tcl 8.6 peut encore être utilisé pour du développement CLI/GUI général, mais la version 9.0, avec ses améliorations de sécurité et d’UI, est recommandée pour les nouveaux projets
  • Parmi les petites implémentations, on trouve Jim TCL, d’environ 100 à 200 ko, et Picol, écrit en moins de 1 000 lignes de code C

Widgets Tk et apparence moderne

  • Tk n’expose pas directement Win32, X11 ni Cocoa, mais les abstrait via des commandes de widgets et des liaisons d’événements
  • Les premiers Tk ont laissé une impression datée à cause de leurs widgets classiques gris et anguleux, mais ttk fournit des widgets plus proches des thèmes du système d’exploitation
    • Les thèmes inclus par défaut sont alt, default, clam et classic
    • Les anciennes applications peuvent remplacer les widgets classiques par ttk::treeview, ttk::notebook, ttk::progressbar, etc.
  • L’applet de calcul de prêt immobilier de 1996 fonctionnait encore avec Tcl 9.0.3 ; sa version modernisée ajoute grid, la validation des entrées, l’apport initial, la prise en charge du DPI et un canevas réactif
    • L’original compte 188 lignes hors commentaires et lignes vides, tandis que la version modernisée atteint environ 250 lignes avec les nouvelles fonctions
    • Le même script s’exécute sur Windows 10, Linux Mint, tablette et téléphone Android, ainsi que sur SBC ARM
  • Tcl/Tk 9.0 s’agrandit de façon presque proportionnelle aux résolutions 96 DPI et 144 DPI sous Windows ; il faut privilégier les unités relatives et le padding plutôt que les pixels fixes
  • Pour apprendre la hiérarchie des widgets, les chemins à base de points, la mise en page et les événements, il est recommandé de suivre le tutoriel TkDocs

Boucle d’événements et couplage lâche

  • La boucle d’événements de Tcl traite, dans un seul thread et dans l’ordre de la file, la souris et le clavier, les fichiers et canaux, ainsi que les callbacks ; elle démarre en arrière-plan lorsque Tk est chargé
  • Le treeview et la scrollbar sont des widgets frères qui ne se contiennent pas l’un l’autre ; ils échangent des préfixes de commande pour mettre à jour leur position dans les deux sens
  • Tk peut transmettre à des widgets des événements virtuels comme <<UI:Request:Submit>>, accompagnés d’une charge utile dict
  • Un EventManager réutilisable peut gérer sous forme de dictionnaire la liste des abonnés par événement et n’appeler event generate que sur les widgets existants
    • Il joue un rôle similaire aux Events/Delegates de C#, à CustomEvent en JavaScript, ou à PyPubSub et blinker en Python
    • Il permet de transmettre les résultats de validation à plusieurs abonnés — popup, inspector, bouton Send, etc. — sans référence directe
  • Même en Tcl pur, on peut créer un gestionnaire d’événements qui appelle des callbacks d’abonnés, et l’utiliser pour une animation console basée sur un tick de 50 ms ou pour le défilement synchronisé de plusieurs canvas
  • Une conception d’événements centrée sur les données convient aux systèmes de type MVC séparant UI et logique, et correspond aux étapes de PIOSEE : sélection d’événement, collecte d’informations, décision stratégique, exécution et évaluation

Connexion avec Python et les processus externes

  • tkinter en Python est un wrapper de Tk, mais ses exemples anciens et son thème par défaut peuvent donner l’impression que Tk lui-même est dépassé
    • Pour une apparence moderne, il faut utiliser explicitement from tkinter import ttk ainsi que ttk.Label, ttk.Button, etc.
  • Il est recommandé d’utiliser Tk dans Tcl, pour lequel il a été conçu à l’origine, et de séparer Python dans une couche de traitement des données
  • Les tâches Python ponctuelles se connectent avec exec, tandis que les tâches asynchrones persistantes se connectent via un pipe open "|python3 -u script.py" r+
    • Avec du non-bloquant, du line buffering et fileevent, l’interface graphique reste réactive pendant l’exécution de traitements NumPy/Pandas
  • En connectant de la même manière des processus enfants natifs, par exemple en C#, le processus d’interface reste isolé même si le processus de calcul plante ou consomme tout le CPU
  • L’EOF d’un pipe étant lui aussi un événement readable, la fonction de traitement doit vérifier [eof $pipe] afin d’éviter les callbacks infinis

Représentation des valeurs, structures de données et performances

  • « Everything is a String » signifie que toute valeur possède une représentation canonique sous forme de chaîne, pas qu’elle est toujours stockée comme chaîne
  • Tcl_Obj est un objet dual-ported qui gère à la fois une représentation chaîne UTF-8 et une représentation interne comme integer, list, dict ou byte array
  • La régénération de la représentation interne lorsque le type nécessaire change s’appelle le shimmering
    • Pour réduire le coût des conversions et éviter la corruption des données, il faut continuer à utiliser lappend/lindex pour les listes, dict pour les dictionnaires et binary pour le binaire
    • tcl::unsupported::representation permet de diagnostiquer le pointeur d’objet et la représentation interne
  • Tcl utilise le Copy-on-Write : lors d’une affectation de valeur, il ne copie pas immédiatement, mais duplique l’objet partagé au moment de sa modification réelle
  • Pour les binaires comme les PNG, il faut définir -translation binary sur le canal et utiliser binary encode/decode afin d’éviter les conversions CR/LF et UTF-8
  • dict set crée automatiquement les chemins intermédiaires, et dict with ainsi que dict update permettent de modifier des valeurs imbriquées comme des variables locales
    • Les clés dupliquées sont résolues selon le principe Last Writer Wins, où la dernière valeur est conservée
  • Les listes conviennent aux données ordonnées et aux structures de type matrice, tandis que les dictionnaires sont adaptés aux données clé-valeur imbriquées générales

Tableaux, namespaces et TclOO

  • Les namespaces sont des conteneurs dynamiques de variables et de commandes ; namespace ensemble permet de créer des dispatchers comme Logger log
  • Les variables et les commandes utilisent des tables de hachage distinctes, ce qui permet à un même nom d’exister simultanément dans les deux espaces ; info vars, info commands et info procs permettent d’inspecter la structure à l’exécution
  • Un Array Tcl est une table de hachage plate pointant vers des variables individuelles
    • Il convient aux collections à clés dynamiques, comme l’état d’une UI, et permet de lier ou de tracer des éléments individuels à des widgets
    • Pour une procédure, il faut passer le nom du tableau et relier un alias à l’original avec upvar
  • Il est recommandé d’utiliser des namespaces pour les états globaux/singletons à clés fixes, et des tableaux pour les collections à clés dynamiques
  • TclOO, inclus dans le cœur depuis Tcl 8.6, fournit classes, objets, héritage, constructeurs et destructeurs sur la base des namespaces et du dispatch de commandes
    • Un objet est une véritable commande comme ::oo::Obj42 et stocke son état dans un namespace dédié
    • oo::define permet de modifier une classe à l’exécution, et oo::objdefine un objet particulier
    • mymethod crée un callback de méthode d’objet complet à passer à after, etc.
  • TclOO ne dispose pas de ramasse-miettes : les objets doivent être supprimés explicitement avec $obj destroy
    • On peut gérer leur durée de vie avec try/finally ou un managed_create basé sur des traces de variables
    • Les channels doivent eux aussi être fermés avec close, et managed_channel permet de les nettoyer automatiquement à la sortie du scope
  • Les widgets Tk restent également des commandes, mais détruire un widget parent avec destroy supprime aussi tous ses enfants

Coroutines et threads

  • Les coroutines Tcl sont des coroutines avec pile qui conservent toute la pile d’appels et reprennent après un yield en préservant les variables locales et le point d’exécution
  • En combinant after et les coroutines, on peut gérer de façon non bloquante, dans la boucle d’événements, les téléchargements, les machines à états, les animations et les opérations réseau
    • En CLI pure, vwait est nécessaire pour maintenir le processus en vie, tandis que dans une appli Tk, le gestionnaire de fenêtres maintient la boucle d’événements
    • coroutine::util de tcllib fournit des wrappers compatibles coroutines pour socket, gets et read
  • Les coroutines partageant un seul thread CPU, un calcul long bloque toute l’UI ; ce type de tâche doit être séparé via le package Thread
  • Tcl Thread repose sur un modèle shared-nothing, avec un interpréteur isolé par thread
    • Les messages sont transmis avec thread::send, et TSV fournit des valeurs partagées protégées par mutex
    • La propriété des canaux est transférée avec thread::transfer, detach et attach
  • Un thread pris dans une boucle infinie ne revient pas à la file d’événements et ne peut pas être arrêté de force de manière sûre
  • Sur un AMD 5950X, la création de 32 threads enfants a fait passer la mémoire de 24 Mo à 44 Mo, soit environ 0,6 Mo par interpréteur
  • Le threading Tcl sert davantage à la réactivité de l’UI et à l’orchestration des E/S qu’à concurrencer les performances de calcul
    • Dans un test de 100 millions de calculs de racine carrée, C# compilé AoT a pris 0,24 s, contre 16,8 s pour Tcl, soit environ 70 fois plus

Séparer les calculs avec C·C#

  • critcl compile, lors de la première exécution, du code C·C++ intégré dans un script Tcl et le charge comme commande native
    • En développement, gcc ou clang est nécessaire ; une fois terminé, on peut précompiler et distribuer le tout sous forme de package .dll·.so
  • Les sections critiques pour les performances, comme Mandelbrot ou Fibonacci, peuvent être déplacées en C, mais manipuler directement les structures mémoire Tcl/C est délicat
  • Une alternative consiste à garder Tcl/Tk comme fine couche d’UI et à confier les calculs à un processus séparé : c’est le sidecar pattern
  • BFlat compile C# en binaire natif autonome et prend en charge Windows, Linux et Android
    • Une CLI de calcul numérique de base peut faire environ 900 Ko sous Windows, et moins de 500 Ko après compression UPX
    • En la combinant à l’interpréteur Tcl d’environ 3 Mo, on peut constituer une appli par plateforme d’environ 3 à 4 Mo

ZipFS et distribution en fichier unique

  • Avant Tcl 9, on utilisait les Starpack, qui associaient un Starkit à Tclkit, mais ils dépendaient d’outils séparés comme Metakit et SDX
  • ZipFS dans Tcl 9 monte un ZIP comme système de fichiers virtuel en lecture seule //zipfs:/
  • Zipkit combine un tclsh·wish lié statiquement avec un ZIP d’application, et exécute main.tcl au démarrage
    • Des cibles sont fournies pour Windows x86/x86_64, macOS Intel·Apple Silicon, Linux x86_64/arm64/RISC-V 64 bits et les familles Solaris
    • Il suffit de remplacer le Zipkit modèle pour cross-packager un binaire destiné à un autre OS
  • ZipFS est né de l’implémentation VFS d’AndroWish, qui devait lire directement les fichiers à l’intérieur des APK, avant d’être fusionné dans le cœur de Tcl
  • Si l’on inclut des .dll·.so propres à une plateforme, il faut détecter la plateforme d’exécution et choisir la bonne extension

AndroWish et Decent Espresso

  • L’application DE1 de Decent Espresso est, en avril 2026 encore, une application Tcl/Tk exécutée dans AndroWish
  • La tablette n’est pas un client de serveur distant : elle utilise une architecture local-first où elle agit comme pair de la machine à café
  • AndroWish mappe les commandes de dessin Tk vers des textures SDL2 afin de gérer des visualisations à haute fréquence même sur des tablettes Android modestes
    • L’extension borg fournit le Bluetooth, les notifications, les vibrations, la voix, la localisation et les événements d’état Android
    • En mai 2026, seul Tcl/Tk 8.6 est pris en charge, donc les commandes propres à Tcl 9 ne sont pas utilisables
  • Le SDK AndroWish crée des APK incluant les scripts ; en supprimant les extensions inutiles, on peut réduire environ 30 Mo à 4–10 Mo
  • undrowish est un interpréteur en fichier unique permettant de tester le même environnement SDL sous Windows·Linux, mais il n’inclut pas borg d’Android
  • tkconclient permet de se connecter à distance depuis un PC à l’interpréteur Android, mais il n’a pas de mot de passe et ne doit donc être utilisé qu’en développement
  • Tk a des limites pour l’adaptation automatique des images raster selon les résolutions Android et pour les UI tactiles plein écran ; Decent Espresso a donc implémenté sa propre UI à base de skins

Wapp, DSL et sandbox

  • Wapp est un framework web Tcl centré sur un fichier unique, créé par D. Richard Hipp
    • Il prend en charge son propre serveur de sockets, CGI·SCGI, et gère par défaut le décodage des URI ainsi que le nettoyage des paramètres
    • Il est utilisé par l’application de checklist qui gère le processus de publication de SQLite et par l’UI web de Fossil
    • En combinant htmx avec un peu de CSS, on peut créer des applications web centrées sur des procédures Tcl sans JavaScript
  • Si l’accès distant·mobile est indispensable, Wapp est recommandé ; pour les outils locaux, Tk, qui s’intègre directement au système d’exploitation, est conseillé
  • Tcl est bien adapté à la création de DSL, car même les boucles et les conditions sont des commandes
    • Avec unknown, uplevel et upvar, on peut créer des commandes métier comme checkout 1000 USD
    • En n’exposant que les commandes autorisées dans un Safe Interpreter, on peut construire des environnements de script restreints pour la banque ou l’EDA
  • On peut aussi créer des commandes de type macro pour générer des étapes de post-traitement de chaînes ou des flux d’exécution propres à une application

Fonctionnalités natives des systèmes d’exploitation

  • Tcl/Tk appelle non seulement des commandes communes, mais aussi des API propres aux plateformes via des extensions
  • TWAPI sous Windows fournit des API bas niveau proches du Windows SDK ainsi que des interfaces de commodité
    • twapi::shell_execute -verb runas permet de demander une élévation de privilèges UAC
    • Il donne accès aux dates de création·modification des fichiers, aux raccourcis clavier globaux, aux services et aux fonctions Windows
  • Dans l’exemple d’un utilitaire assistant pour Adobe DNG Converter, les RAW récents sont convertis en DNG compatibles CS6, puis les dates de création·modification des fichiers d’origine sont restaurées avec TWAPI
    • Tcl pur ne peut gérer que les dates de modification·accès ; TWAPI est donc nécessaire pour restaurer la date de création sous Windows

Contraintes et discipline de développement

  • Tcl fait davantage peser la charge de l’exactitude sur la discipline du développeur que sur le compilateur
    • Une mauvaise compréhension de la différence de substitution entre {} et "" peut entraîner une double substitution et des vulnérabilités de sécurité
    • Les dict get, expr et format imbriqués doivent être décomposés en variables intermédiaires pour rester lisibles
    • Redéfinir excessivement le langage peut aboutir à un système de commandes personnalisé difficile à maintenir
  • Tcl distingue l’existence d’une variable et la chaîne vide plutôt que d’utiliser null, et le vérifie avec info exists
    • Insérer une chaîne vide dans une expression arithmétique provoque une erreur, au lieu d’être automatiquement converti en 0 ou en NaN
  • Il n’est pas adapté à la 3D temps réel, à l’audio ni aux grands calculs matriciels
    • Tcl3D·Canvas3d et des commandes audio externes sont utilisables, mais ce n’est pas son usage principal
    • Traiter une matrice de 1 Go sous forme de chaînes·listes entraîne des coûts élevés de gestion des objets ; une bibliothèque C ou un processus de calcul séparé est plus approprié
  • Les points forts de Tcl sont l’orchestration à base de coroutines·threads, les E/S et les événements, les couches de présentation Tk·CLI, les tests et l’automatisation

Paquets et environnement de développement

  • Tcl ne dispose pas d’un gestionnaire central de paquets universel équivalent à npm ou pip, et teacup/teapot d’ActiveTcl sont pour l’essentiel devenus legacy
  • La distribution Batteries Included fournit des paquets validés avec l’environnement
    • Magicsplat propose une sélection de paquets Tcl/Tk 9 principalement centrée sur Windows
    • BAWT est un framework de build maximaliste qui produit des distributions incluant des extensions pour plusieurs plateformes et CPU
    • Selon la configuration, il est possible de regrouper les principaux paquets de l’écosystème dans environ 35 Mo
  • L’absence de gestionnaire central ne rend pas automatiquement l’ensemble plus sûr, mais elle offre l’avantage de pouvoir figer toutes les dépendances et les analyser une fois pour toutes
  • En raison de la génération dynamique de commandes dans Tcl, l’analyse statique et l’autocomplétion sont difficiles, et Nagelfar ne peut pas vérifier complètement les commandes inconnues ni les redéfinitions à l’exécution
  • Dans VSCode et VSCodium, on peut utiliser Tcl by bitwisecook, Tcl Navigation and Tools et Code Runner

Installation par plateforme

  • Sous Windows, installer Magicsplat Tcl/Tk à l’échelle du système permet de configurer le PATH ainsi que les associations .tclapp et .tkapp
  • Sur les distributions Debian/Ubuntu, les paquets suivants permettent d’installer Tcl, Tk, SQLite, TLS, les images et Thread
    • sudo apt-get install tcl tk libsqlite3-tcl sqlite-tcl tcltls tcllib libtk-img tcl-thread
  • De nombreux dépôts Linux LTS fournissent Tcl 8.6, tandis que des builds incluant des extensions Tcl 9 sont disponibles via tcl-builds-with-libxft
  • Tk a déjà été observé en fonctionnement non seulement avec X11, mais aussi dans des environnements Wayland comme Zorin OS 18
  • Le Tcl 8.5 fourni par défaut avec macOS étant destiné à la compatibilité legacy, il est recommandé de l’éviter pour le développement Tcl/Tk moderne
    • Tcl/Tk 9 peut être installé via Homebrew, MacPorts ou des builds expérimentaux BAWT
    • Sur Apple Silicon, il faut placer /opt/homebrew/opt/tcl-tk/bin au début du PATH afin qu’il soit prioritaire sur le Tcl du système

Ressources d’apprentissage et appréciation finale

  • The Tcl 9 Programming Language est une ressource avancée qui traite en profondeur de Tcl 9 pur ; pour en comprendre toutes les fonctionnalités, il est recommandé de la relire plusieurs fois et de suivre soi-même les exemples
  • TkDocs couvre Tk moderne, grid, la boucle d’événements et les anciennes techniques à éviter
  • Les ressources Tutorialspoint ne sont pas recommandées, car elles incluent des méthodes d’installation obsolètes et des pratiques comme expr sans accolades
  • Les REPL de tclsh et wish affichent l’usage attendu lorsqu’un mauvais argument est saisi, ce qui permet de les utiliser, avec la documentation, comme outils d’apprentissage par l’expérimentation
  • Tcl/Tk n’est pas un écosystème à la mode ni doté d’une grande communauté, mais il reste une boîte à outils généraliste pour les petites équipes et les industries critiques qui privilégient la compatibilité et la cohérence à long terme
  • Il convient aux cas où l’on recherche une « boring technology » capable de fonctionner pendant des décennies plutôt qu’une stack qui évolue rapidement, et où l’on a besoin d’une couche CLI, GUI, automatisation ou orchestration plutôt que d’un moteur de calcul

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.