Nach der Mauser

Nach über einem Jahr Entwicklung wurde die Version 8.1 von Tcl/Tk freigegeben. Sie zeichnet sich unter anderem durch komplette Unicode-Unterstützung und einen Message-Katalog aus.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 8 Min.
Von
  • Carsten Zerbst
Inhaltsverzeichnis

Als im Herbst 97 die Tcl-Version 8.0 erschien, war ein riesiger Sprung geschafft. Bytecode-Compiler, Namensräume und der Native Look unter Unix, Windows und Macintosh erfüllten viele Forderungen der Nutzer. Bis zur nächsten Version 8.1 dauerte es aber bis jetzt, denn die Firmengründung von J. Ousterhouts Scriptics unterbrach die bald begonnene Arbeit. Über ein Jahr nach der ersten Alpha-Version ist Tcl 8.1 jetzt verfügbar. Die ursprünglich als Bug-Release geplante Version enthält viele Neuerungen, unter anderem Thread-Unterstützung, Internationalisierung und Message-Kataloge.

Mehr Infos

Obwohl die Weiterentwicklung der Sprache nun ganz bei Scriptics liegt, verlief sie in letzter Zeit so offen wie nie. Die Entwicklungsversion ist inzwischen über CVS verfügbar, und wesentliche Änderungen wie die Stubs (siehe unten) erstellten externe Programmierer. Auf der anderen Seite denkt Scriptics auch über die vielen Tcl-Erweiterungen nach. Hierzu lud man die Autoren weitverbreiteter Erweiterungen zum Tcl Extension Summit, wo über ein einheitlicheres Modell diskutiert wurde. Themen waren unter anderem ein vereinheitlichter Installationsmechanismus und das Dokumentationsformat. Mit dieser Unterstützung der, meist freien, Erweiterungen versucht Scriptics, die Balance zwischen OpenSource-Software und Kommerz zu halten.

Durch die westeuropäische Latin1-Brille betrachtet, reicht die Sprachunterstützung von Tcl/Tk 8.0 aus, doch schon in Mittel- und Osteuropa fangen die Probleme an. Denn gleichzeitig mit Latin1 lassen sich die dort benötigten Fonts nicht benutzen.

Mehr Infos

Unicode

Unicode benutzt zur Kodierung von Zeichen 16 Bit oder 32 Bit. Gebräuchlich ist die 16bittige UTF-8 Kodierung, bei der die unteren 127 Plätze ASCII entsprechen und die weiteren Positionen nach Sprachgruppen vergeben sind. Die Kodierung ist im RFC 2279 definiert und bietet mit ihren 65 536 Zeichen genügend Platz, um die gebräuchlichsten Sprachen zu beschreiben.

Enthalten jedoch schon viele Schriften nicht alle Zeichen der Latin1-Kodierung, sind Unicode-Fonts zur Zeit noch seltener, von kompletten Familien mit allen Schnitten (fett, kursiv et cetera) ganz zu schweigen.

Für X11 sind zwei erweiterte Zeichensätze des misc-Fonts verfügbar, ucs und unifont. Eine andere Möglichkeit, geeignete Fonts zu erhalten, besteht in der Konvertierung von Truetype-Schriften. Sie lassen sich mit ttf2bmf in eine Bitmap-Schrift umwandeln oder direkt per Fontserver (xfstt oder xfsft) benutzen. Microsofts Fontpack (siehe ‘Quellen’) umfaßt diverse Truetype-Schriften, die zumindest eine Untermenge (WGL4) für alle west-, mittel- und osteuropäischen Sprachen inklusive Griechisch und Türkisch enthalten. Unter Windows müssen diese Truetype-Fonts installiert und der Multi-Language-Support eingestellt werden. Das genaue Vorgehen ist im Fontpack-FAQ erklärt.

Um die leidige Zeichensatzfrage endgültig und weltweit zu lösen, ist Tcl/Tk inzwischen auf Unicode umgestellt. Dazu waren alle String-Kommandos zu ändern und die Tk-Schriftverwaltung zu erweitern. Bisher reichte es, wenn eine Schrift die Anforderungen hinsichtlich Aussehen und Größe möglichst gut erfüllte, jetzt spielt zusätzlich die Verfügbarkeit von Zeichen eine Rolle. Hier versucht der Interpreter, wann immer es geht, eine Darstellung zu ermöglichen. Angesichts der wenigen freien Schriften mit einem vollen Unicode-Zeichensatz ist dies sinnvoll. Andererseits können lange Suchzeiten die Folge sein, wenn die gewünschte Schrift ein Zeichen nicht enthält. Das Überarbeiten der String-Funktionen nutzten die Entwickler, um gleichzeitig die Fähigkeiten regulärer Ausdrücke zu verbessern. Tcl bietet hier nun denselben Luxus wie Perl.

Für die Ein- und Ausgabe von Strings kommt das Kommando encoding hinzu. Mit ihm läßt sich die Kodierung von Strings ändern und die des Systems abfragen oder setzen. Bei Ein- und Ausgabekanälen wandelt Tcl/Tk automatisch von UTF-8 in die extern verwendete Kodierung, so daß man bei der Programmierung von Skripten darauf keine Rücksicht nehmen muß, ob nun eine Eingabe in Latin15, KOI-8 oder euc-jp erfolgt. Die Skript-Quellen werden wie bisher als Latin1 interpretiert, mit Hilfe von encoding lassen sich jedoch andere Kodierungen benutzen.

Mit der Umstellung auf Unicode ist ein Schritt auf dem Weg zu internationalisierten Anwendungen getan. Den zweiten Schritt, die Anpassung der Meldungen und Beschriftungen an die jeweilige Landessprache, unterstützt das Paket msgcat. Es enthält eine Reihe von Kommandos zum Erzeugen und Laden von Meldungskatalogen. Inzwischen erwarten die meisten Anwender, daß Knöpfe und Menüs in ihrer Sprache beschriftet sind. Übersetzung und Anpassung an nationale Besonderheiten verursachen jedoch eine Menge Arbeit, wenn man sich im einzelnen um das Laden entsprechender Kataloge, Behandlung fehlender Einträge et cetera kümmern muß. Die neuen Funktionen von Tcl/Tk gehen über die 1:1-Übersetzung von Strings hinaus, sie unterstützen die Verwendung von Dialekten und fangen Fehler tolerant ab. Da sich die Ergebnisse wiederum in format-Befehlen nutzen lassen, sind auch Umsortierungen möglich. Damit läßt sich etwa das Datum in der jeweils landesüblichen Reihenfolge von Tag, Monat und Jahr ausgeben. Beispiele für die Verwendung des msgcat-Paketes enthält Listing 1. Abhängig von der gesetzten Sprache lädt das Skript die Kataloge für Englisch, Deutsch sowie Norddeutsch und erzeugt die Ausgabe (s. Abbildung)

Mehr Infos

LISTING 1

ø#!/bin/sh
#Beispiel für Meldungskataloge

exec tclsh8.1 "$0" $@

package require msgcat

namespace import ::msgcat::*

set month [clock format [clock seconds] -format "%m"]
set day [clock format [clock seconds] -format "%d"]
set year [clock format [clock seconds] -format "%y"]
set dayname [clock format [clock seconds] -format "%A"]

foreach locale [list en de de_hh] {
::msgcat::mclocale $locale
::msgcat::mcload [pwd]
puts "Locale $locale"
puts "[mc $dayname] [format [mc dateformat] $month $day $year]"
puts "[mc undefiniert]\n"
}

exit 0


Eingabedateien:
en.msg
mcset en dateformat "%d.%d.%d"

de.msg

::msgcat::mcset de dateformat "%2\$d.%1\$d.%3\$d"
::msgcat::mcset de Saturday Samstag

Inhalt de_hh.msg
::msgcat::mcset de_hh Saturday Sonnabend

Mit Tcl 8.1 können Programmierer mehrere Zeichensätze gleichzeitig benutzen und Anwendungen leichter an lokale Gegebenheiten anpassen.

Eher per Zufall kann man seit Version 8.02 auf das Paket opt stoßen, dem leider die Dokumentation fehlt. Der Quelltext enthält jedoch ein ausführliches Beispiel. Ähnlich der getopt-Bibliothek von GNU [1] dient es zum Auswerten von Aufrufparametern. Statt proc beginnt man eine Prozedur mit ::tcl::OptProc, danach folgt eine Aufzählung der zwingenden und der optionalen Parameter samt Typ und eventuellen Voreinstellungen. Beim Aufruf der Prozedur enthalten die Variablen die jeweiligen Parameter, bei der Verwendung falscher Übergabewerte erscheint eine Fehlermeldung. Wird die Prozedur mit dem Parameter -help aufgerufen, gibt sie die Variablen, ihre Standardwerte sowie die optionalen Hilfetexte aus. Gegenüber dem herkömmlichen Mechanismus für Übergabeparameter ist dies eine wesentliche Verbesserung, die insbesondere bei der Behandlung von Kommandozeilenübergaben eine Erleichterung für den Programmierer bedeutet. Noch ist das opt-Paket komplett in Tcl geschrieben, bei entsprechendem Bedarf will der Entwickler es jedoch in C implementieren. In Listing 2 ist eine Anwendung zu sehen, es werden verschiedene Argumente, deren Typ, Default-Wert und Hilfetext vereinbart. Die Ausgabe ist in der Abbildung zu sehen.

Mehr Infos

LISTING 2

#!/bin/sh
#Beispiel für neue opt-Funktion

exec tclsh8.1 "$0" $@

package require opt

::tcl::OptProc main {
{erforderlichesArgument -int "erforderliches Argument"}
{-flag "ein Flag"}
{-vint -int 7 "ein Integer"}
{-vbool -boolean false "eine boolsche Variable"}
{-vchoice -choice {A B} "eine Auswahl"}
} {
puts "Übergebene Parameter:"
foreach v [list erforderlichesArgument flag vint vbool vchoice] {
puts [format "%20s %s" $v [set $v]]
}
exit 0
}

if [catch {eval main $argv} error] {
puts $error
exit 1
}

Schon seit der Tk-Version 4.0 können Interpreter per send-Kommando über einen RPC-ähnlichen Mechanismus kommunizieren. Da send jedoch auf X11 aufbaute, lief es nur unter Unix. Unter Windows basiert send mittlerweile auf DDE (Dynamic Data Exchange) und ist damit auch dort einsetzbar. Als Nebeneffekt läßt sich DDE nun direkt von Tcl aus verwenden, mögliche Anwendungen sind Netscape-Aufrufe zum Anzeigen von Hilfetexten oder das Einfügen einer Programmgruppe in das Startmenü. Zusammen mit dem registry-Kommando können Tcl-Programme damit tief in Windows eingreifen.

Die bisher erwähnten Neuerungen wirken sich nur auf Skripte aus. Veränderungen hat jedoch auch die C-API erfahren. Obwohl Tcl-Erfinder Ousterhout kein Freund von Threads ist, kommt auch Tcl an diesem Thema nicht vorbei. Bei Tcl 8.0 durfte pro Thread nur je ein Interpreter laufen, außerdem ließen sich keine Funktionen aus anderen Threads starten. Dennoch konnte man damit schon sinnvolle Anwendungen schreiben. Mit der neuen Version entfallen einige Einschränkungen. Nun darf man in jedem Thread beliebig viele Interpreter starten, die ihrerseits auf andere Threads zugreifen können. Die C-API enthält die entsprechenden Schnittstellen schon, bis auf ein Testkommando lassen sich Threads jedoch noch nicht von Skripten aus bedienen.

Eine weitere Änderung betrifft die C-API für Erweiterungen. Bisher dienten zum dynamischen Laden von Erweiterungen die Mechanismen des jeweiligen Betriebssystems. Dies verursacht Schwierigkeiten bei Versions- oder Compilerwechsel und führt unter anderem dazu, daß Tk unter AIX nicht dynamisch ladbar ist. Abhilfe soll das von Paul Duffin entworfene Stubs-Interface schaffen. Sein Herzstück ist ein Array mit Funktionspointern, das die neuen Kommandos exportiert. Dieses Interface erschien erst Mitte Januar, deshalb ist die Dokumentation noch recht spärlich. Tk selber kann nun mit den Stubs kompiliert werden, es gibt schon eine Reihe von anderen Autoren, die es für ihre Erweiterungen einsetzen.

Mit den in der aktuellen Version durchgeführten Verbesserungen ist ein großer Teil der Wunschliste abgearbeitet. Das verkürzt sie allerdings nicht wesentlich, ganz oben stehen dort für Tk noch Meta-Widgets, Unterstützung für Drag & Drop sowie Drucker, für XML-Bearbeitung mit Tcl sowie Anbindung von CORBA und Audio. Zwar gibt es für fast alle dieser Aufgaben bereits Erweiterungen, diese haben allerdings nicht den Ritterschlag von Scriptics. Dazu gehören Snack (plattformübergreifende Audiounterstützung), TclXML und TclMico (CORBA). Es ist jedoch wegen der zunehmenden Größe von Tcl umstritten, ob diese Features in die Kern-Release gehören. Viele Tcl/Tk-Fans fordern deshalb, die offizielle Release lieber paketweise zu erweitern. Hier ist die Diskussion noch nicht abgeschlossen.

Tcl ist wieder ein Stück erwachsener geworden. In der nächsten Zeit wird sich zeigen müssen, in welchem Tempo die vielen Erweiterungen und Programme die neuen Möglichkeiten nutzen, insbesondere wie die Entwickler das Stub-Interface annehmen.

CARSTEN ZERBST
ist wissenschaftlicher Mitarbeiter der TU Hamburg-Harburg und beschäftigt sich mit der Berechnung des Ladungsverhaltens an Bord von Seeschiffen.

Literatur

[1] Michael Uelschen; Flotter Dreier; readline, getopt und regex; iX 9/98, S. 136 ff. (ck)