VASmalltalk – International Components for Unicode (ICU)

Textversion 20.07.2011 – Softwareversion 0.2.2

Geschichte und wie es dazu kam …

ICU stellt eine Programmbibliothek da, die man in Programmen einsetzen möchte, die insbesondere international eingesetzt werden sollen. Diese Programme benötigen sehr gute Unterstützung im Bereich Sprachen und Darstellung (-> Unicode), Zeit- und Datumsverwaltung. Aber auch Bereiche wie externes Resourcenmanagements oder Lesen von Dateien gehören dazu. Weiterhin natürlich das Formatieren und Einlesen von Zeit-, Datums- oder Zahlenwerten in Programmen gehört ebenfalls dazu.

Von ICU gibt es eine C-Variante, ein C++ Aufsatz und eine Java-Version – hier sprechen wir nur von der C-Variante: ICU4C. Die Bibliothek ICU wird in sehr bekannten Produkten/Projekten bereits erfolgreich einsetzt – darunter Projekte wie z.B. Apache, CouchDB

Warum nur wieder eine externe C-Bibliothek? Warum nicht z.B. die Chronos-Bibliothek portieren und dann war’s das halt. Die Antwort ist ziemlich einfach: Mainstream. Ich möchte Bibliotheken nutzen, die von mehr als nur den wenigen weltweiten Smalltalk-Nutzern genutzt werden. So kann ich auch von der Produktivität anderer, größerer Communities profitieren. Leider setzt sich diese Sichtweise unter Smalltalkern nicht durch – und man möchte halt “eigene” Smalltalk Lösungen lieber nutzen.

Die Idee ICU unter VASmalltalk einzubinden kam aber nicht so sehr aus dem Bereich Unicode, sondern ich überlegte, wie ich einen bereits 4 Jahre alten Fehler im Daylight-Saving Management des Produktes endgültig platformunabhängig lösen könnte. Patchvorschläge für Windows und Linux hatte ich ja bereits in verschiedenen Produktforen gepostet – aber eine Lösung vom Hersteller gibt es nun seit vier Jahren noch nicht.

Der plattformunabhängige Patch war schnell geschrieben – da wurde mir klar, daß der Bereich des Datum- und Zeitmanagements von VASmalltalk durch ICU erheblich verbessert werden könnte. So war schnell klar, dass Teile der Funktionalität der Chronos-Bibliothek unter Smalltalk mit ICU ebenfalls zu erschlagen war. Also wurde dann auch halt des Rest in diesem Bereich von ICU protiert.

Beim Einbinden dieser Funktionen kommt man leider sehr schnell in das Problem, daß die vielen Texte in diesen eingebundenen APIs nur Unicode-Texts (i.d.R. UTF-16) verstanden. Also was bliebt mir anderes übrig, ebenfalls eine gewisse Unterstützung für Unicode in den Varianten UTF-8, UTF-16 und UTF-32 zu programmieren. Aktuelle Arbeiten mit der CouchDB brachten mich dann zu der Überzeugung, daß sehr gute UTF8 Unterstützung wünschenswert wäre. Also mußten sinnvolle Teile des Unicode-Management gewrappt werden.

Aber nun Schluß mit den Anmerkungen und kommen wir nun zum eigentlichen Projekt.

Download

Die ICU Bibliothek kann man von icu-project.org mit dem Namen ICU4C runterladen. Aktuell ist die Version 4.8 (seit Mai 2011). Damit hat man den C-Teil des Wrappers. Diese Bibliotheken wirft man dann in das “bin”-Verzeichnis seiner VASmalltalk-Installation/Programm.

Insgesamt beträgt der Umfang dieser Dateien knapp 20 MByte. Der größte Teil ist der Datenbank geschuldet, die über die diversen Locales, Zeitzonen mitgeliefert wird: allein 14 Mbyte gehen auf das Konto der Datenbank. Es gibt daher immer wieder anfragen, wie man diese Datenbank minimieren kann – bei Bedarf bitte Google fragen.

Nun fehlt noch der Smalltalk-Quelltext. Den bekommt man von vastgoodies. Die ConfigurationMap MSKICU runterladen Diese enthält den Code für den Wrapper wie auch die aktuellen Tests. Wenn sich das Projekt irgendwann mal dem Ende nähern sollte, dann werden Tests und Runtime-Support wieder in getrennten Maps gepackt. Als Randbemerkung sei erwähnt, daß die Bibliothek zwar OpenSource ist – aber nicht in einer MIT Lizenz vorliegt. Wenn man also diese Tools in einer kommerziellen Anwendung benutzen möchte – dann bitte nur mit einer Genehmigung von mir.

In der Map ist dann noch eine weitere Bibliothek (“mskunicode.dll” – z.Z. nur für Windows) enthalten, die einigen Low-Level Support für die Character-Class beinhaltet, um diese Unicode-fähig zu machen . Diese sollte man ebenfalls in das “bin”-verzeichnis expotieren. An diese Bibliothek kommt Ihr mittels der ConfigurationMap MSKResourceManagement ran. Startet einfach den “MSKResourcemManager” aus dem Tools-Menü im System-Transcript Fenster.

Allgemeine Bemerkungen

Externe Bibliotheken bedeuten in der Regel auch externe Referenzen, also externer Speicherbedarf – die durch die virtuelle Maschine nicht verwaltet werden kann. Es obliegt also dem Benutzer, den externen Speicher wieder freizugeben. Daher gilt als allgemeine Regel: die Nutzung von Instanzen von Unterklassen von ICUGeneralObject muß manuell mittels #close abgeschlossen werden, damit der externe Speicher wieder freigegeben werden.

Es kann natürlich Umstände geben, wo man die Lebenszeit einer Instanz überhaupt nicht kennt – dann sollte man die Instanz mittels der Methode #addToBeFinalized so einstellem, daß der GC automatisch beim Abräumen ein #finalize sendet. Für die oben angesprochenen Unterklassen wird dann automatisch ein #close ausgeführt. Warum man das nicht immer machen sollte ? Dieser zusätzliche Verwaltungsarbeit belastet das System bei einer hohen Anzahl an zu verwaltenen objekten. Also bitte spärsam einsetzen.

Allgemeiner Aufbau

Wie bereits erwähnt wurden die C-Strukturen direkt gemappt. Unterklassen von ICUGeneralObject entsprechen direkt der in der Dokumentation erwähntn Strukturen.

Daneben gibt es Erweiterungen bereits bekannter Klasse – i.d.R., um diesen Klassen ähnliche Möglichkeiten zu öffnen, wie die eigentlichen ICU-Klassen und die nutzbaren Interfaces anzugleichen.

Und es gibt auch eine ICU orientierte Locale-Klasse: MSKLocale. Diese Klasse hält einige Services bereit, die man nutzen kann – dazu kommen wir später.

Laden, Starten, entladen und Stoppen

Beim Laden der ConfigurationMap oder Starten des Images wird eine globale Instanz von MSKLocale angelegt. Diese Instanz hält einige ICU-Instanzen, die man immer wiederverwenden kann. Das minimiert die Erzeugung von ICU Instanzen erheblich. Mehr dazu bei der Besprechung von MSKLocale.

MSKLocale

Wir als VAsmalltalk Entwickler haben bereits eine Klasse, die eine globale Instanz besitzt und locale Infos bereithält: Locale. Diese globale Instanz erhält man mittels Locale current. Nun ja, es sollte daher nicht verwundern, daß es mit MSKLocale genauso verhält. MSKLocale und Locale sind nicht kompatibel miteinander – vielleicht werden sie es einmal, aber nun noch nicht.

MSKLocale hält einige Informationen bereit, die auch Locale hat. Zusätzlich aber hat es einige spezielle ICU-Instanzen, die Entwickler nutzen sollten:

* dateFormat – Instanz von ICUDateFormat, um Datums-/Zeitangaben in der aktuellen Locale auszugeben (also de_DE)
* enDateFormat – Instanz von ICUDateFormat, um Datums-/Zeitangaben in englischer sprache auszugeben (also en_DE)

* enLanguage – Name der Sprache der aktuellen Locale in Englisch
* localeLanguage – Name der Sprache in der aktuellen Locale in der Sprache der Locale

* enNumberformat – Instanz von ICUNumberFormat, um Zahlen ausgeben zu können …..
* numberFormat – wie oben, aber in der aktuellen Locale (de_DE)

* enTerritory – Name des Landes in Englisch)
* localeTerritory – wie oben, jedoch in aktueller Sprache

* offsetFromUTC – Duration, die den zeitlichen abstand zur UTC beschreibt
* nowTime – Instanz von ICUCalendar, die nur benutzt werden sollte, um die aktuelle Uhrzeit abzufragen.

Aktuelle Uhrzeit abfragen

Wie schon in einem Blog-Beitrag geschrieben, ist die Erzeugung von Instanzen von ICUCalendar sehr zeitaufwendig. Um das zu umgehen, wird einfach das bereits vorhandene Objekt in der globalen Instanz von MSKLocale einfach geclont und dieser Wert genutzt – damit ist das System schneller als die eigentliche Primitive in VASmalltalk, die sonst die Uhrzeit abfragt und eine Instanz von DateAndTime erzeugt.

* MSKLocale current calendarNow -> fragt aktuelle Uhrzeit ab UND gibt die globale Instanz zurück. Sollte man nur benutzen, wenn man weiß, was man macht (Stichwort: Multitasking)
* MSKLocale current calendarNowAsDateAndTime -> fragt aktuelle Uhrzeit ab UND erzeugt eine Instanz von DateAndTime und gibt diese zurück.
* MSKLocale current calendarNowCloned -> fragt aktuelle Uhrzeit ab UND gibt einen geklonte Instanz von ICUCalendar zurück

Das geht natürlich auch über Klassenmethoden in der Klasse DateAndTime:

* DateAndTime icuCurrentLocalDateAndTime
* DateAndTime icuCurrentUTCDateAndTime

oder Klassenmethoden von UCalendar:

* UCalendar now
* UCalendar nowAsDateAndTime

In UCalendar sind auf der Instanz- und Klassenseite alle mir bekannte ANSI Methoden implementiert.

Umgang mit Zeitzonen

Ausgabe und Einlesen von Zeit- und Datumsangaben

Behandlung von Domainnames in Anwendungen

Das weite Feld von UTF-8, UTF-16 und UTF-16 und dann die CodePages

Suchen und hoffentlich Finden in Unicode-Strings

Reguläre ausdrücke in Unicode-Strings

Fehlende Features

Zu den noch nicht implmentierten Features ist sicherlich das externe Resourcenmanagement. ICU ermöglicht in einer externen Textdatei die Ablage von Texten, Zahlen, Binärdaten geordnet nach Locales.

Weiterhin fehlen die Datumsumrechnungsmethoden zwischen verschiedenen Datumssystemen

One Response to VASmalltalk – International Components for Unicode (ICU)

  1. Pingback: VASmalltalk – ICU – Wrapper Documentation | Schrievkrom

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s