1 Punkte von GN⁺ 6 시간 전 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Tcl/Tk ist ein BSD-lizenziertes Toolkit, mit dem sich unter Windows, Linux und macOS sowohl CLI- als auch native GUI-Anwendungen erstellen lassen; es unterstützt nicht blockierende Events und I/O sowie isoliertes Threading
  • Tcl ist eine befehlszentrierte Sprache, die das erste Wort als Befehl interpretiert und Code wie Daten als Strings behandelt; Tk abstrahiert betriebssystemspezifische UIs über Widgets und Events
  • Tcl/Tk 9.0, veröffentlicht am 13. November 2025, ergänzt 64-Bit, vollständiges Unicode, striktes Encoding, ZipFS-Packaging als einzelne Datei sowie SVG, High-DPI und Dark Mode, bringt aber für manchen bestehenden Code Kompatibilitätsänderungen mit sich
  • Es wird seit Langem unter anderem in git gui, FPGA- und EDA-Tools, Cisco IOS, ESA-Betriebsumgebungen, dem Build- und Testsystem von SQLite sowie der Decent-Espresso-App genutzt; es gibt Fälle, in denen Skripte aus den 1990er-Jahren auch mit aktuellen Versionen laufen
  • Statt für große numerische Berechnungen eignet es sich als Glue Language für eventbasierte UIs, Automatisierung, I/O, DSLs und die Koordination nativer Prozesse; Berechnungen können an externe Komponenten wie C, C# oder Python delegiert werden

Warum Tcl/Tk gewählt wurde

  • Mit Tcl/Tk lässt sich selbst inklusive gängiger Pakete eine Umgebung von etwa unter 100 MB zusammenstellen; zudem können kleine Single-File-Apps für unterstützte Plattformen und Web-Apps erstellt werden
  • Die BSD-Lizenz erlaubt Änderung, Weiterverteilung sowie den Verkauf als Ganzes oder in Teilen; die Tcl-Community pflegt Core und Releases
  • Andere geprüfte GUI-Optionen hatten folgende Einschränkungen
    • AutoHotkey v2 eignet sich für kleine Windows-Tools, ist aber nur für Windows und garantiert unter Wine keine nativen Aufrufe
    • C# WinForms hängt von der Windows-API ab, während MAUI und Avalonia viele Abhängigkeiten mitbringen und für kleine Nicht-Enterprise-Projekte umständlich sind
    • Electron-artige lokale Web-Apps müssen Frontend-/Backend-Kommunikation, Portkonflikte und Sicherheit verwalten; schon ein leerer Browser kann mehr als 100 MB verbrauchen
    • Ein einfaches Fenster mit Go Fyne oder Gio brachte etwa 40.000 indirekte Abhängigkeiten und ein statisches Binary von über 30 MB mit und sah nicht wie eine native App aus
    • Bei Qt sind MOC, Signal/Slot über native Grenzen hinweg sowie die GPL/LGPL- und kommerzielle Lizenzkonstellation komplex
  • Viele moderne GUI-Frameworks zeichnen eher direkt auf ein Canvas als über die UI-APIs des Betriebssystems und bündeln die gesamte Laufzeitumgebung pro OS und CPU, wodurch ein natives Erscheinungsbild schwer zu erreichen ist

Tcl als Glue Language entworfen

  • Das 1990 von John Ousterhout veröffentlichte Tcl wurde als architektonischer Klebstoff entworfen, der leistungsfähigen Low-Level-Code mit einer menschenlesbaren Logikschicht verbindet
    • Bridge: verbindet Code wie C++ oder Rust mit einer High-Level-UI
    • Orchestrate: steuert den Datenfluss zwischen Programmen und Modulen
    • Wrap: macht komplexe interne Abläufe als einfache Skriptbefehle zugänglich
  • Tk ist ein plattformübergreifendes GUI-Toolkit, das Tcls Kommandozeileninteraktion ergänzt und mit package require Tk geladen werden kann
  • Der kleine C-Core von Tcl unterstützt Windows, Linux, macOS sowie ARM, x86 und RISC-V
    • Für Android kann Termux für die CLI und AndroWish für die GUI genutzt werden
  • Ousterhout erhielt 1997 den ACM Software System Award für seine Beiträge zur Entwicklung nachhaltig einflussreicher Softwaresysteme

Langjährig genutzte Industriebeispiele

  • Tcl wird seit rund 40 Jahren in Umgebungen eingesetzt, in denen Zuverlässigkeit, Abwärtskompatibilität und Portabilität wichtig sind
    • Die in Git enthaltenen git gui und gitk
    • Automatisierungssprache in FPGA- und Chipdesign-Tools von Xilinx, Altera, Cadence und anderen
    • Cisco IOS Embedded Event Manager
    • Interne GUIs für Simulationsfarmen und Hardwaretester von Intel, NVIDIA und AMD
    • Calibre und Virtuoso von Siemens EDA
    • Betriebsumgebungen von ESA ESTEC und ESOC
  • Dasselbe Tcl/Tk-Tool kann ohne Neukompilierung vom Terminal eines Kernkraftwerks bis zum Raspberry Pi laufen
  • SQLite entstand ursprünglich als Tcl-Erweiterung, und die Hälfte der Tests ist in Tcl geschrieben
    • Tcl dient auch als „Assembler“, der mehr als 125 C-Eingabedateien nachbearbeitet und daraus den endgültigen SQLite-Quellcode mit über 200.000 Zeilen erzeugt

Installationsumfang und Ausführung

  • Eine typische Installation enthält folgende Komponenten
    • tclsh: CLI-Interpreter
    • wish: GUI-Shell mit Tk und Event Loop
    • Tcllib und Tklib: Bibliotheken wie http, csv, json, aes, tooltip, dateentry
    • Erweiterungspakete wie Thread, TLS und Drag-and-Drop
  • Ohne Argumente gestartet öffnet sich ein REPL; dort können Befehle eingegeben, Skripte eingefügt und Dateien per source ausgeführt werden
  • Übergibt man eine Datei wie tclsh myscript.tcl oder wish app.tkapp, läuft sie im nichtinteraktiven Batch-Modus
  • wish unter Windows ist eine GUI-Anwendung und nutzt statt einer echten Konsole die Tk Console; blockiert der UI-Thread, kann auch die Ausgabe eingefroren wirken
  • Zum Lernen wird tclsh empfohlen, da es auf allen Plattformen Standard-I/O bereitstellt und ebenfalls Tk laden kann

Die befehlszentrierte Syntax von Tcl

  • Tcl-Quellcode besteht aus durch Whitespace getrennten Wörtern; das erste Wort ist immer der Befehl, die übrigen sind Argumente
  • Die wichtigsten Syntaxelemente sind
    • set: setzt oder liest Variablen
    • $name: ersetzt durch den Wert einer Variablen
    • proc: definiert eine Prozedur, die als neuer Befehl fungiert
    • [...]: führt ein inneres Skript aus und ersetzt es durch dessen Ergebnis
    • {...}: fasst ohne Substitution zu einem Argument zusammen
    • "...": fasst zu einem Argument zusammen, führt aber Substitutionen von $, [] und \ aus
    • {*}: expandiert eine Liste zu mehreren Argumenten
    • ::: gibt globale Pfade und Namespace-Pfade an
    • Zeilenumbrüche und ;: trennen Befehle
  • In string range "Tcl Programming" 0 2 ist string ein Ensemble, das an den Unterbefehl range dispatcht und Tcl zurückgibt
  • Auch if, while und return sind keine reservierten Schlüsselwörter, sondern gewöhnliche Befehle
    • while wertet Bedingung und Body-String wiederholt aus
    • Mit uplevel lassen sich eigene Kontrollstrukturen wie repeat ... until|while ... bauen
    • return übermittelt Completion Codes wie TCL_OK, TCL_ERROR, TCL_RETURN, TCL_BREAK und TCL_CONTINUE

Homoikonizität und sichere Substitution

  • In Tcl bestehen Code und Daten gleichermaßen aus Strings, die aus Wörtern aufgebaut sind; derselbe Wert kann daher als Liste, Daten oder auszuführender Befehl interpretiert werden
  • Wird eine Liste wie {*}$userinput expandiert, wird das erste Element zum Befehl und der Rest zu Argumenten; wenn Argumente mit Leerzeichen nicht korrekt gruppiert sind, können Probleme wie Fehler bei Kanalnamen entstehen
  • Diese Homoikonizität (homoiconicity) erleichtert DSLs und Erweiterungen von Kontrollstrukturen, schafft aber auch Integritäts- und Sicherheitsaufwand, weil Daten zu ausführbarem Code werden können
  • Callbacks sollten mit [list command $arg] aufgebaut werden, damit Argumentgrenzen auch bei Leerzeichen und Sonderzeichen erhalten bleiben
  • Ausdrücke in expr und if sollten immer in {...} eingeschlossen werden, um doppelte Substitution und Command Injection zu verhindern und Bytecode-Optimierung zu ermöglichen
  • Safe Interpreter blockieren standardmäßig den Zugriff auf Dateisystem, Sockets und externe Bibliotheken und geben über interp alias nur explizit erlaubte Funktionen frei

Änderungen in Tcl/Tk 9.0

  • Das Tcl/Tk Core Development Team hat 9.0 am 13. November 2025 veröffentlicht, 12 Jahre nach Tcl 8.6
  • Die wichtigsten Änderungen sind:
    • Vollständige Umstellung auf 64 Bit und Unterstützung des gesamten Unicode-Codepoint-Bereichs
    • ZipFS, das ZIP als virtuelles Dateisystem mountet
    • Unterstützung in Tk für SVG, High-DPI, Systembenachrichtigungen sowie Dark Mode unter Windows und macOS
    • Ein standardmäßiges strict-Profil, das bei Encoding-Abweichungen sofort einen Fehler ausgibt
  • Es gibt auch Änderungen bei der Kompatibilität
    • Durch die geänderte Pointer-Größe können Skripte ausfallen, die critcl-C-Code enthalten
    • 010 in Tcl 8.x ist die oktale 8, in Tcl 9 dagegen die dezimale 10; oktale Zahlen verwenden das Präfix 0o
    • Ein UTF-8-BOM U+FEFF wird nicht automatisch entfernt und muss bei Bedarf explizit abgeschnitten werden
  • Tcl 8.6 kann weiterhin für allgemeine CLI- und GUI-Entwicklung genutzt werden, für neue Projekte wird jedoch 9.0 mit Verbesserungen bei Sicherheit und UI empfohlen
  • Als kleine Implementierungen gibt es Jim TCL mit etwa 100–200 kB und Picol mit weniger als 1.000 Zeilen C-Code

Tk-Widgets und modernes Erscheinungsbild

  • Tk abstrahiert Win32, X11 und Cocoa nicht durch direkte Offenlegung, sondern über Widget-Befehle und Event-Bindings
  • Frühes Tk wirkte wegen seiner grauen, kantigen klassischen Widgets veraltet, doch ttk bietet Widgets, die näher an den Themes des Betriebssystems liegen
    • Die standardmäßig enthaltenen Themes sind alt, default, clam und classic
    • Ältere Apps können klassische Widgets durch ttk::treeview, ttk::notebook, ttk::progressbar usw. ersetzen
  • Das Mortgage-Calculator-Applet von 1996 lief auch unter Tcl 9.0.3; die modernisierte Fassung ergänzt grid, Eingabevalidierung, Anzahlung, DPI-Anpassung und eine responsive Canvas
    • Das Original umfasst ohne Kommentare und Leerzeilen 188 Zeilen, die modernisierte Fassung mit neuen Funktionen etwa 250 Zeilen
    • Dasselbe Skript läuft unter Windows 10, Linux Mint, auf Android-Tablets und -Smartphones sowie auf ARM-SBCs
  • Tcl/Tk 9.0 skaliert unter Windows bei 96 DPI und 144 DPI nahezu proportional; statt fester Pixel sollten relative Einheiten und Padding verwendet werden
  • Für Widget-Hierarchie, punktbasierte Pfade, Layout und Events empfiehlt sich das TkDocs-Tutorial

Event-Loop und lose Kopplung

  • Der Tcl-Event-Loop verarbeitet in einem einzelnen Thread Maus- und Tastatureingaben, Dateien/Kanäle und Callbacks in Queue-Reihenfolge; beim Laden von Tk startet er im Hintergrund
  • Treeview und Scrollbar sind Sibling-Widgets, die einander nicht enthalten, und aktualisieren ihre Positionen bidirektional, indem sie Befehlspräfixe austauschen
  • Tk kann virtuelle Events wie <<UI:Request:Submit>> mit einer dict-Payload an Widgets übergeben
  • Ein wiederverwendbarer EventManager kann Abonnentenlisten pro Event in einem Dictionary verwalten und event generate nur für vorhandene Widgets aufrufen
    • Er erfüllt eine ähnliche Rolle wie C# Events/Delegates, JavaScript CustomEvent oder Python PyPubSub/blinker
    • Validierungsergebnisse können ohne direkte Referenzen an mehrere Abonnenten wie Popups, Inspector oder Send-Button übermittelt werden
  • Auch in reinem Tcl lässt sich ein Event-Manager erstellen, der Abonnenten-Callbacks aufruft; nutzbar etwa für eine 50-ms-tick-basierte Konsolenanimation oder synchrones Scrollen mehrerer Canvas-Elemente
  • Datenzentriertes Event-Design eignet sich für MVC-artige Systeme mit getrennter UI und Logik und entspricht den PIOSEE-Schritten Event-Auswahl, Informationssammlung, Strategieentscheidung, Ausführung und Bewertung

Python und externe Prozesse anbinden

  • Pythons tkinter ist ein Tk-Wrapper, kann aber durch alte Beispiele und Standard-Themes den Eindruck erwecken, Tk selbst sei veraltet
    • Für ein modernes Erscheinungsbild müssen from tkinter import ttk sowie ttk.Label, ttk.Button usw. explizit verwendet werden
  • Empfohlen ist eine Architektur, in der Tk in dem dafür ursprünglich mitentwickelten Tcl genutzt und Python als Datenverarbeitungsschicht getrennt wird
  • Einmalige Python-Aufgaben werden mit exec angebunden, dauerhaft asynchrone Aufgaben über eine Pipe wie open "|python3 -u script.py" r+
    • Mit nichtblockierendem, zeilengepuffertem I/O und fileevent bleibt die GUI reaktionsfähig, während NumPy-/Pandas-Aufgaben laufen
  • Bindet man auf dieselbe Weise native Kindprozesse etwa in C# an, bleibt der UI-Prozess getrennt, selbst wenn der Berechnungsprozess abstürzt oder die gesamte CPU auslastet
  • Auch EOF einer Pipe ist ein readable Event; die Handler-Funktion muss daher [eof $pipe] prüfen, um Endlos-Callbacks zu verhindern

Wertrepräsentation, Datenstrukturen und Performance

  • „Everything is a String“ bedeutet, dass jeder Wert eine kanonische String-Repräsentation hat, nicht dass er immer als String gespeichert wird
  • Tcl_Obj ist ein dual-ported Objekt, das sowohl eine UTF-8-String-Repräsentation als auch interne Repräsentationen wie integer, list, dict oder byte array verwaltet
  • Das Neuerzeugen der internen Repräsentation, wenn ein anderer benötigter Typ verlangt wird, heißt shimmering
    • Für Listen sollten konsequent lappend/lindex, für Dictionaries dict und für Binärdaten binary verwendet werden, um Konvertierungskosten und Datenbeschädigung zu reduzieren
    • Mit tcl::unsupported::representation lassen sich Objekt-Pointer und interne Repräsentation diagnostizieren
  • Tcl verwendet Copy-on-Write: Bei Wertzuweisungen wird nicht sofort kopiert, sondern ein geteiltes Objekt erst bei tatsächlicher Änderung dupliziert
  • Binärdaten wie PNG sollten für Kanäle -translation binary setzen und binary encode/decode verwenden, um CR/LF- und UTF-8-Konvertierungen zu vermeiden
  • dict set erzeugt Zwischenpfade automatisch; mit dict with und dict update lassen sich verschachtelte Werte wie lokale Variablen ändern
    • Doppelte Schlüssel werden nach dem Last Writer Wins-Prinzip bereinigt, bei dem der letzte Wert erhalten bleibt
  • Listen eignen sich für geordnete Daten und matrixartige Strukturen, Dictionaries für allgemein verschachtelte Schlüssel-Wert-Daten

Arrays, Namespaces und TclOO

  • Namespaces sind dynamische Container für Variablen und Befehle; mit namespace ensemble lässt sich ein Dispatcher wie Logger log erstellen
  • Variablen und Befehle verwenden getrennte Hash-Tabellen, sodass derselbe Name gleichzeitig existieren kann; mit info vars, info commands und info procs lässt sich die Laufzeitstruktur untersuchen
  • Ein Tcl Array ist eine flache Hash-Tabelle, die auf einzelne Variablen verweist
    • Es eignet sich für Collections mit dynamischen Schlüsseln wie UI-Zustand; einzelne Elemente können an Widgets gebunden oder getraced werden
    • An Prozeduren wird der Array-Name übergeben, und mit upvar muss ein Alias auf das Original verbunden werden
  • Empfohlen ist die Trennung: Namespaces für globalen oder Singleton-Zustand mit festen Schlüsseln, Arrays für Collections mit dynamischen Schlüsseln
  • TclOO, seit Tcl 8.6 im Core enthalten, bietet auf Basis von Namespaces und Befehls-Dispatch Klassen, Objekte, Vererbung sowie Konstruktoren und Destruktoren
    • Ein Objekt ist ein realer Befehl wie ::oo::Obj42 und speichert seinen Zustand in einem eigenen Namespace
    • Mit oo::define lassen sich Klassen, mit oo::objdefine bestimmte Objekte zur Laufzeit ändern
    • mymethod erzeugt einen vollständigen Objektmethoden-Callback, der etwa an after übergeben werden kann
  • TclOO hat keine Garbage Collection; Objekte müssen explizit mit $obj destroy entfernt werden
    • Die Lebensdauer lässt sich mit try/finally oder einem auf Variablen-Traces basierenden managed_create verwalten
    • Auch channel müssen mit close geschlossen werden; mit managed_channel können sie beim Verlassen des Scopes automatisch bereinigt werden
  • Auch Tk-Widgets bleiben als Befehle bestehen, doch wenn ein Eltern-Widget per destroy entfernt wird, werden alle Kinder mit entfernt

Coroutinen und Threads

  • Tcl-Coroutinen sind stackful Coroutines, die den gesamten Call Stack beibehalten und nach yield mit erhaltenen lokalen Variablen und Ausführungspunkt fortgesetzt werden
  • Kombiniert man after mit Coroutinen, lassen sich Downloads, State Machines, Animationen und Netzwerkaufgaben nicht-blockierend innerhalb der Event Loop verarbeiten
    • Reine CLI-Programme benötigen vwait, damit der Prozess weiterläuft; bei Tk-Apps hält der Window Manager die Event Loop am Leben
    • coroutine::util aus tcllib stellt coroutine-aware Wrapper für socket, gets und read bereit
  • Da Coroutinen einen einzelnen CPU-Thread teilen, friert die gesamte UI ein, wenn lange Berechnungen laufen; solche Aufgaben müssen mit dem Thread-Paket ausgelagert werden
  • Tcl Thread nutzt ein Shared-Nothing-Modell, bei dem jeder Thread einen isolierten Interpreter besitzt
    • Mit thread::send werden Nachrichten übergeben, und TSV stellt durch Mutex geschützte gemeinsame Werte bereit
    • Bei Channels wird die Ownership mit thread::transfer, detach und attach übertragen
  • Ein Thread, der in einer Endlosschleife festhängt, kehrt nicht zur Event Queue zurück und kann daher nicht sicher erzwungen beendet werden
  • Beim Erzeugen von 32 Child-Threads auf einem AMD 5950X stieg der Speicherverbrauch von 24 MB auf 44 MB, also etwa 0,6 MB pro Interpreter
  • Tcl-Threading dient eher der UI-Reaktionsfähigkeit und I/O-Orchestrierung als dem Wettbewerb um Rechenleistung
    • In einem Test mit 100 Millionen Quadratwurzel-Berechnungen benötigte AoT C# 0,24 Sekunden, Tcl 16,8 Sekunden – ein Unterschied von etwa Faktor 70

Berechnungen nach C und C# auslagern

  • critcl kompiliert C- und C++-Code innerhalb eines Tcl-Skripts beim ersten Ausführen und lädt ihn als native Commands
    • Während der Entwicklung ist gcc oder clang erforderlich; nach Fertigstellung kann man ihn als .dll- oder .so-Paket vorab bauen und ausliefern
  • Performance-kritische Abschnitte wie Mandelbrot oder Fibonacci lassen sich nach C verschieben, doch die direkte Arbeit mit den Tcl/C-Speicherstrukturen ist anspruchsvoll
  • Eine Alternative ist das Sidecar Pattern: Tcl/Tk bleibt eine dünne UI, während Berechnungen an einen separaten Prozess delegiert werden
  • BFlat kompiliert C# zu eigenständigen nativen Binaries und unterstützt Windows, Linux und Android
    • Ein einfaches numerisches CLI kann unter Windows etwa 900 KB groß sein, nach UPX-Kompression unter 500 KB
    • In Kombination mit dem etwa 3 MB großen Tcl-Interpreter lassen sich plattformspezifische Apps mit rund 3 bis 4 MB erstellen

ZipFS und Single-File-Deployment

  • Vor Tcl 9 wurden Starpacks verwendet, bei denen ein Starkit an Tclkit angehängt wurde; sie waren jedoch von separaten Tools wie Metakit und SDX abhängig
  • ZipFS in Tcl 9 mountet ZIP-Dateien als schreibgeschütztes virtuelles Dateisystem unter //zipfs:/
  • Zipkit kombiniert statisch gelinkte tclsh/wish mit einem App-ZIP und führt beim Start main.tcl aus
    • Targets gibt es für Windows x86/x86_64, Intel- und Apple-Silicon-macOS, Linux x86_64/arm64/RISC-V 64 Bit sowie Solaris-Varianten
    • Durch Austausch nur des Template-Zipkits lassen sich Binaries für andere Betriebssysteme cross-packagen
  • ZipFS entstand aus der VFS-Implementierung von AndroWish, die Dateien direkt aus einem APK lesen musste, und wurde in den Tcl-Core übernommen
  • Wenn plattformspezifische .dll- oder .so-Dateien enthalten sind, muss die Laufzeitplattform erkannt und die passende Erweiterung ausgewählt werden

AndroWish und Decent Espresso

  • Die DE1-App von Decent Espresso ist auch im April 2026 eine Tcl/Tk-App, die unter AndroWish läuft
  • Das Tablet ist kein Client eines Remote-Servers, sondern nutzt eine Local-First-Architektur, in der es als Peer der Kaffeemaschine arbeitet
  • AndroWish mappt Tk-Zeichenbefehle auf SDL2-Texturen und kann so auch auf leistungsschwachen Android-Tablets hochfrequente Visualisierungen verarbeiten
    • Die Erweiterung borg stellt Bluetooth, Benachrichtigungen, Vibration, Sprache, Standort und Android-Statusereignisse bereit
    • Stand Mai 2026 wird nur Tcl/Tk 8.6 unterstützt, sodass Tcl-9-spezifische Commands nicht genutzt werden können
  • Das AndroWish SDK erstellt APKs inklusive Skripten; entfernt man unnötige Erweiterungen, lässt sich die Größe von etwa 30 MB auf 4 bis 10 MB reduzieren
  • undrowish ist ein Single-File-Interpreter zum Testen derselben SDL-Umgebung unter Windows und Linux, enthält jedoch kein Android-borg
  • Mit tkconclient kann man sich vom PC aus remote mit dem Android-Interpreter verbinden, sollte dies wegen fehlenden Passworts aber nur während der Entwicklung verwenden
  • Tk hat Einschränkungen bei der automatischen Anpassung von Rasterbildern an Android-Auflösungen und bei touch-orientierten Vollbild-UIs; Decent Espresso implementierte daher eine eigene Skin-basierte UI

Wapp, DSLs und Sandboxen

  • Wapp ist ein von D. Richard Hipp entwickeltes Tcl-Webframework mit Fokus auf Single-File-Apps
    • Es unterstützt einen eigenen Socket-Server sowie CGI und SCGI und verarbeitet URI-Decoding und Parameterbereinigung standardmäßig
    • Es wird in der Checklist-App zur Verwaltung des SQLite-Release-Prozesses und in der Fossil-Web-UI eingesetzt
    • Kombiniert man htmx mit etwas CSS, lassen sich Web-Apps rund um Tcl-Prozeduren ohne JavaScript erstellen
  • Wenn Remote- oder Mobile-Zugriff unverzichtbar ist, empfiehlt sich Wapp; für lokale Tools ist Tk ratsam, da es direkt mit dem Betriebssystem integriert ist
  • Tcl eignet sich gut für DSLs, da selbst Schleifen und Bedingungen Commands sind
    • Mit unknown, uplevel und upvar lassen sich fachliche Commands wie checkout 1000 USD erstellen
    • Indem man in einem Safe Interpreter nur erlaubte Commands freigibt, lassen sich eingeschränkte Skriptumgebungen für Banken oder EDA aufbauen
  • Man kann auch makroartige Commands erstellen, die Schritte zur String-Nachbearbeitung oder anwendungsspezifische Ausführungsabläufe erzeugen

Native Betriebssystemfunktionen

  • Tcl/Tk ruft nicht nur gemeinsame Commands auf, sondern über Erweiterungen auch plattformspezifische APIs
  • TWAPI unter Windows bietet Low-Level-APIs nahe am Windows SDK sowie komfortable Schnittstellen
    • Mit twapi::shell_execute -verb runas kann eine UAC-Rechteerhöhung angefordert werden
    • Man kann auf Erstellungs- und Änderungszeiten von Dateien, globale Hotkeys, Dienste und Windows-Funktionen zugreifen
  • In einem Beispiel mit einem Hilfswerkzeug für Adobe DNG Converter wurden aktuelle RAW-Dateien in CS6-kompatible DNGs konvertiert und anschließend die Erstellungs- und Änderungszeiten der Originaldateien mit TWAPI wiederhergestellt
    • Reines Tcl kann nur Änderungs- und Zugriffszeiten behandeln; zum Wiederherstellen der Windows-Erstellungszeit ist TWAPI nötig

Einschränkungen und Entwicklungsdisziplin

  • Tcl legt die Verantwortung für Korrektheit stärker auf die Disziplin der Entwickler als auf den Compiler
    • Wer den Unterschied bei der Substitution zwischen {} und "" falsch versteht, kann doppelte Substitutionen und Sicherheitslücken verursachen
    • Verschachtelte dict get, expr und format sollten in schrittweise Variablen aufgeteilt werden, damit der Code lesbar bleibt
    • Wird die Sprache zu stark neu definiert, kann ein schwer wartbares System benutzerdefinierter Commands entstehen
  • Tcl unterscheidet statt null zwischen der Existenz einer Variablen und einem leeren String und prüft dies mit info exists
    • Übergibt man einen leeren String an einen arithmetischen Ausdruck, wird er nicht automatisch in 0 oder NaN umgewandelt, sondern erzeugt einen Fehler
  • Für Echtzeit-3D, Audio und große Matrixberechnungen ist Tcl nicht geeignet
    • Tcl3D, Canvas3d und externe Audio-Commands sind zwar nutzbar, gehören aber nicht zu den Kernanwendungsfällen
    • Wird eine 1-GB-Matrix als String oder Liste verarbeitet, steigen die Kosten für die Objektverwaltung stark; eine C-Bibliothek oder ein separater Berechnungsprozess ist geeigneter
  • Die Stärken von Tcl liegen in coroutine- und threadbasierter Koordination, I/O und Events, Tk- und CLI-Präsentationsschichten sowie Tests und Automatisierung

Pakete und Entwicklungsumgebung

  • Für Tcl gibt es keinen allgemein etablierten zentralen Paketmanager wie npm oder pip; ActiveTcls teacup und teapot sind größtenteils Legacy geworden
  • Batteries-Included-Distributionen liefern geprüfte Pakete mit
    • Magicsplat bietet eine kuratierte Auswahl von Tcl/Tk-9-Paketen mit Schwerpunkt auf Windows
    • BAWT ist ein maximalistisches Build-Framework, das Distributionen mit Erweiterungen für mehrere Plattformen und CPUs erstellt
    • Je nach Konfiguration lassen sich die wichtigsten Ökosystem-Pakete in etwa 35 MB bündeln
  • Das Fehlen eines zentralen Managers macht es nicht automatisch sicherer, hat aber den Vorteil, dass man die gesamte Dependency-Kette festschreiben und einmalig analysieren kann
  • Wegen der dynamischen Befehlserzeugung in Tcl sind statische Analyse und Autovervollständigung schwierig; auch Nagelfar kann unbekannte Befehle oder Laufzeit-Neudefinitionen nicht vollständig prüfen
  • In VSCode und VSCodium können Tcl by bitwisecook, Tcl Navigation and Tools und Code Runner verwendet werden

Plattformspezifische Installation

  • Unter Windows kann man Magicsplat Tcl/Tk systemweit installieren und dabei PATH sowie die Verknüpfungen für .tclapp und .tkapp einrichten
  • Auf Debian- und Ubuntu-basierten Systemen lassen sich Tcl, Tk, SQLite, TLS, Images und Thread mit folgenden Paketen installieren
    • sudo apt-get install tcl tk libsqlite3-tcl sqlite-tcl tcltls tcllib libtk-img tcl-thread
  • Viele Linux-LTS-Repositorys stellen Tcl 8.6 bereit; Builds mit Tcl-9-Erweiterungen bietet tcl-builds-with-libxft
  • Tk läuft nicht nur unter X11, sondern wurde auch in Wayland-Umgebungen wie Zorin OS 18 erfolgreich eingesetzt
  • Das standardmäßig mit macOS gelieferte Tcl 8.5 dient der Legacy-Kompatibilität und sollte für moderne Tcl/Tk-Entwicklung möglichst vermieden werden
    • Tcl/Tk 9 lässt sich über Homebrew, MacPorts oder experimentelle BAWT-Builds installieren
    • Auf Apple Silicon sollte /opt/homebrew/opt/tcl-tk/bin früh im PATH stehen, damit es Vorrang vor dem System-Tcl hat

Lernmaterialien und abschließende Bewertung

  • The Tcl 9 Programming Language ist ein fortgeschrittenes Material, das reines Tcl 9 ausführlich behandelt; um den gesamten Funktionsumfang zu verstehen, empfiehlt es sich, es mehrfach zu lesen und die Beispiele selbst nachzuvollziehen
  • TkDocs behandelt modernes Tk, grid, die Event Loop und veraltete Techniken, die man vermeiden sollte
  • Die Materialien von Tutorialspoint enthalten veraltete Installationsmethoden und Praktiken wie expr ohne geschweifte Klammern und werden daher nicht empfohlen
  • Die REPLs von tclsh und wish zeigen bei falschen Argumenten die Verwendung an und können zusammen mit der Dokumentation als experimentelles Lernwerkzeug dienen
  • Tcl/Tk ist kein trendiges Ökosystem mit großer Community, bleibt aber ein allgemeines Toolset für kleine Teams und missionskritische Branchen, in denen langfristige Kompatibilität und Konsistenz wichtig sind
  • Es eignet sich, wenn man statt eines sich schnell wandelnden Stacks „boring technology“ möchte, die über Jahrzehnte funktioniert, und wenn man statt einer Rechen-Engine eher eine CLI-, GUI-, Automatisierungs- oder Orchestrierungsschicht benötigt

Noch keine Kommentare.

Noch keine Kommentare.