Java Workshop

Urheber: Andre Adrian
Datum: 05.Sep.2010

Einleitung

Der C Workshop von mir ist gut aufgenommen worden. Vielen Dank für diese Wertschätzung durch die Leserinnen und Leser. In der Zwischenzeit ist die Programmiersprache Java älter als 10 Jahre und wächst weiterhin. In einigen Bereichen wird nur "gut abgehangene" Software eingesetzt, dies sind die Branchen der "late adopters". Diese späten Vögel passen Java in ihren oft strengen Software-Entwicklungsprozess ein. Ein Java Programmierer Guide wird entworfen, welcher dem Programmierer bestimmte Java Konstrukte verbietet und einen Katalog von Java "best practices" vorstellt. Die Test-Abteilung definiert welche Tests der Programmierer bei der Entwicklung durchzuführen hat und welche Tests bei der Software-Integration, der Werksabnahme und der örtlichen Abnahme durchzuführen sind. Wenigstens für jede ausgelieferte Software muß auf Jahre die Fehlerbeseitigung möglich bleiben. Der Kunde hat üblicherweise ein Recht auf Behebung von "latent defects". Zur Quelltextverwaltung gehören Software-Werkzeuge (Tools) für das Zusammenführen von verschiedenen Quelltextversionen (merge tool) für z.B. back ports. Mit doxygen oder javadoc wird Programmierer-Dokumentation aus den Quelltexten gewonnen. Alle diese Tools müssen bei Hinzunahme einer neuen Programmiersprache auf Eignung geprüft werden. Eventuell ist Umstieg auf andere Tools zusammen mit der Schulung der Programmuierer auf die neuen Tools nötig.

Java Marketing und Java Wirklichkeit

"Klappern gehört zum Handwerk" - dies gilt auch für die Marketing-Sprüche zum Thema Java. Zwischen Marketing-Wunsch und Programmierer-Wirklichkeit ist auch bei Java Platz für einige Elephanten. Eine leistungsfähige Programmiersprache ist wie ein gutes Küchenmesser. Man kann prima Fleisch damit schneiden. Man kann sich aber auch prima in den Finger schneiden. Java ist kein stumpfes Plastikmesser und ist deshalb genauso gefährlich wie C oder C++.

Write once, run anywhere

Seit Java 1.4 gibt es assertion. Die assertion verlangt eine Änderung im Java Compiler und eine Änderung in der Java Virtual Machine (Java Runtime Environment). Die Einführung von assertion war inkompatibel. Aber Java war schon vorher Betriebssystem abhängig. Der Zugriff auf Geräte (devices) wie der seriellen Schnittstelle ist in jeder Programmiersprache, wenigstens im Gerätenamen, abhängig vom Betriebssystem, auch bei Java.

Java kennt keine memory leaks

Bei den meisten GUI-Programmiersprachen welche GUI-Bibliotheken benutzen besteht die Speicherverwaltung aus zwei Teilen. Eine GUI-Variable wie ein Font hat ein Stück Speicher im Java-Speicherraum und ein weiteres Stück Speicher im Speicherraum der GUI Software. Ein memory leak im Java GUI Programm liegt oft an einem Fehler in der Speicherverwaltung der GUI Software. Übliche GUI Software sind Microsoft WinAPI32 oder das X Windows System. Auf dieser Software setzen Toolkits auf wie Motif oder Qt. Weder die GUI Software noch die Toolkits sind in Java programmiert.
Der Garbage Collector von Java hat auch bei fehlerfreier Implementierung nur eine begrenzte Intelligenz. Nicht jeder reservierte Speicher auf den das Java Programm nicht mehr zugreifen kann, kann auch vom Garbage Collector freigegeben werden. Das klassische Beispiel ist die Ringliste. Die Ringliste besteht aus Referenzen von einem Objekt zum nächsten Objekt. Das letzte Objekt zeigt auf der erste Objekt. Vom Programm gibt es eine Referenz auf die Ringliste. Wird diese Referenz entfernt ist die Ringliste nicht mehr vom Programm erreichbar, kann aber auch nicht vom Garbage Collector gelöscht werden.

Java ist typsicher

Die Java Collections sind nicht typsicher. Der Rückgabewert hat den Type Object. Ab Java Version 1.5 gibt es eine typsichere Erweiterung der Collections. Der Programmierer wird aber nicht gezwungen diese neue Eigenschaft zu nutzen.


Einsatz von Java

"Wer nur einen Hammer hat, dem erscheint die Welt als Nagel". Wer nur die Programmiersprache Java kennt, wird jede Aufgabe mit Java lösen wollen. Übliche Applikationen bestehen aus mehreren Programmen die auf verschiedenen Computern in einem Netzwerk arbeiten. Für die Benutzer-Schnittstelle ist Java gut geeignet. Für Betriebssystem nahe Prozesse welche (exotische) Geräte-Schnittstellen bedienen ist C besser geeignet. Die verschiedenen Prozesse auf den verschiedenen Rechnern können per TCP oder UDP miteinander kommunizieren. Die Kommunikation der Prozesse auf einem Rechner kann auch über TCP oder UDP erfolgen.

Inhaltsverzeichnis


Java Programmierer Guide

Dieser Programmers Guide soll die Softwarequalität von Java Programmen sicherstellen. Für jede Regel im Programmers Guide dürfte sich eine Ausnahme finden, welche die Regel widerlegt. "Die Ausnahme bestätigt die Regel" ist dann das Leitmotiv. Viele dieser Regeln sind allgemein bei der GUI Programmierung auch mit anderen Programmiersprachen empfehlenswert.

Speicherbelegung

Speicherbelegung erfolgt üblicherweise durch den new Operator. Eine Speicherbelegung innerhalb einer paint() Methode ist verboten. Das gilt auch für Methoden die von paint() aufgerufen werden. Eine Speicherbelegung sollte im Konstruktor stattfinden.

Sichtbare / nicht sichtbare Widgets

Oft ist ein bestimmtes Widget nicht während der ganzen Programmlaufzeit sichtbar. Solche Widgets werden im Programm nur einmal erzeugt und dann nach Bedarf sichtbar geschaltet oder nicht sichtbar geschaltet. Das Erzeugen von Widgets nach der Initialisierung des Programmes soll soweit als möglich vermieden werden.

Thread Synchronization

Thread Synchronization soll durch synchronized Methoden erfolgen, nicht durch synchronized Abschnitte. Die Anzahl der Threads in einem Programm ist möglichst klein zu halten. In jedem GUI-Programm gibt es nur einen Thread für die GUI-Ausgabe und die Verarbeitung von GUI-Events wie Mausklicks oder Tastatureingaben. Für Timer im GUI-Thread soll die Klasse javax.swing.Timer benutzt werden.

Interface von Taxonomie Klassen

Die Taxonomie der Lebewesen wie Fische, Säugetiere und Vögel ist eine bekannte hierarchische Klassifizierung. Die Vaterklasse eines solchen Taxonomie-Klassenbaums soll nur die Methoden als Interface zur Verfügung stellen welche auch von allen Kindklassen sinnvoll implementiert werden können. Eine UnsupportedOperationExecption wie bei den java.util Collections ist verboten. In einem Taxonomie-Klassenbaum Guide sollen die für die Kindklassen sinnvollen Methoden für das Klassen-Interface aufgeführt werden damit der Klassenbaum eine einheitliche Schnittstelle erhält.


Merge-Tools

Bei der Software-Entwicklung entsteht immer wieder die Aufgabe zwei Versionen der gleichen Quelltext-Datei zu einer neuen Version dieser Datei zu verschmelzen. Wenn ein Team von Programmierern an einem Projekt arbeitet sind "Merge-Läufe" die Regel, nicht die Ausnahme. Durch zentralisierte Versions-Kontroll-Systeme kann zwar die Notwendigkeit für ein Merge verhindert werden, aber zu Lasten der Produktivität der Programmierer. Und wenn ein Back-Port gefordert wird vom oberen Management hilft dem kleinen Peitschenschwinger über der Programmierergruppe sein zentralisiertes Versions-Kontroll-System auch nicht mehr.

WinMerge

Wie der Name nahelegt ist WinMerge ein MS-Windows Programm von Dean P. Grimm und anderen. WinMerge erlaubt Merge und Edit. MS-Windows Programmierer sollten sich dieses GNU General Public License Programm ansehen, wenn sie den Begriff "Open Source" vertragen. Als Closed-Source Progger sollte man natürlich keine Open-Source Software verwendet - das schadet mindestens der Arroganz.



tkdiff

Ein echter Oldtimer ist tkdiff von John M. Klassa. Tkdiff ist ein in Tcl/Tk programmiertes Frontend für das UNIX Programm diff. Als Tcl/Tk Programm läuft tkdiff unter MS-Windows, Linux und jedem anderen Betriebssystem mit Tcl/Tk Interpreter. Auch bei tkdiff ist Merge möglich, aber nicht Edit.



meld

Meld gehört zu den modernen Merge-Tools mit eingebautem Editor. Das Programm läuft unter Linux, als GUI-Software wird Gnome Version 2 benutzt.

mgdiff

Mgdiff ist ein graphisches Frontend für das UNIX diff Kommando. Mgdiff ist ein Oldtimer, das zeigt sich an dem benutzten Motif Toolkit. Mit Mgdiff lässt sich angenehm arbeiten, solange neben dem Merge (Zusammenführen) nicht auch Editieren verlangt wird. Mgdiff ist nur unter HP-UX, Linux und anderen UNIXen verfügbar.


CoCo/R für Java

CoCo/R ist ein Compiler-Compiler von Hanspeter Mössenböck und anderen von der Universität Linz. CoCo/R ist vergleichbar mit ANTLR und JavaCC. Alle diese Werkzeuge erzeugen aus einer Quelltextdatei mit einer EBNF (Extended Backus Naur Form) Grammatik einen zweiten Quelltext. Dieser Quelltext realisiert den Scanner (Sprachsymbole-Erkenner) und den Parser (Sprache-Erkenner) für eine Computersprache. Aus der EBNF Grammatik kann mit CoCo/R ein C#, ein C++ oder ein Java Quelltext erzeugt werden. In dem Buch "Compiling with C# and Java" von Pat Terry wird der Einsatz von CoCo/R erklärt. Das gemeinsame Wirken der Professoren Mössenböck aus Österreich und Terry aus Südafrika hat ein übersichtliches, gut brauchbares Software-Werkzeug geschaffen.
CoCo/R erzeugt eine LL(1) Grammatik. Eine solche Grammatik wird auch "rekursiv absteigender Parser mit 1 Sprachsymbol Vorschau" (recursive decent parser with 1 token lookahead) genannt. Der rekursive Abstieg besteht aus Funktionen (Methoden) die sich gegenseitig aufrufen. Neben der LL(1) Grammatik ist die LALR(1) Grammatik durch die Softwarewerkzeuge yacc und bison bekannt. Diese Werkzeuge benutzen Tabellen um der Parser zu steuern. Der von yacc und bison erzeugte Quelltext ist sehr schwer (fast unmöglich) nachträglich um neue Sprachkonstrukte oder um bessere Fehlerbehandlung zu erweitern. Die Erweiterung des von CoCo/R erzeugten Quelltextes ist leichter möglich.
Seit einiger Zeit gibt es ein CoCo/R Plugin für Eclipse, welches die Arbeit weiter erleichtert. Wird die CoCo/R Grammatik-Datei mit der Dateiendung .atg gespeichert, werden automatisch die beiden Java-Dateien Scanner.java und Parser.java neu erzeugt.


Installation CoCo/R Plugin für Eclipse

Zuerst wird das CoCo/R Plugin von der Universität Linz installiert. Hierzu muß der Entwicklungsrechner eine Verbindung zum Internet haben.



Im zweiten Schritt wird ein Java Projekt wie üblich in Eclipse angelegt. Über Rechts-Klick auf den Projektnamen lässt sich die CoCo/R Erweiterung für dieser Projekt einschalten.



Im dritten Schritt wird eine ATG Datei neu erzeugt. In diese Datei wird die EBNF Grammatik eingegeben. Hierzu nach Klick auf das Icon "New" im Menü den Punkt "Other..." klicken. Es erscheint das "Select a wizard" Fenster. Hier wird "Coco/R Parser and Scanner" ausgewählt.



Die ATG Datei muss in das src Verzeichnis des Projektes gelegt werden. Dieser Container ist leider nicht der Default.



Neben der ATG Datei ist für einen lauffähigen Parser noch eine Java Datei mit der main() Methode nötig. So sieht das Projekt Asm6502 unter Eclipse aus:




Über den Urheber

Der erste praktische Kontakt mit GUI-Programmierung erfolgte durch Digital Research GEM zusammen mit Lattice-C Compiler auf dem Atari ST in den 1980er Jahren. Durch Kontakt mit Parcplace Smalltalk-80 und Digitalk Smalltalk/V wurden gute Grundlagen gelegt für alle folgenden GUI-Projekte unter MS-Windows und Linux. Seit 2001 verfügen die GUI-Programme in der Regel über eine Touchscreen Bedienung. Der Autor bevorzugt die Touchscreen Bedienung über Finger gegenüber der Bedienung mit Stift. Der Finger ist immer dabei und wird gut behandelt. Der Stift ist ein empfindliches Stück Hightech im Plastikgehäuse und hat bei einigen Benutzern nur ein kurzes Leben.

Literatur