Meine Meinung über Java

Java als Programmiersprache

Java ist eine objektorientierte Programmiersprache, die zwar von Grund auf auf dem Begriff der Klasse basiert, aber dennoch pragmatisch bleibt. In Java gibt es daher eingebaute Datentypen, die auf dem Stack gehalten werden. Auch entfernt sich Java nicht weit von der C-Syntax. Hinsichtlich der Vererbung bietet Java gegenüber C++ nicht viel Neues. Java ist daher nicht mit einer Sprache wie Eiffel oder Smalltalk zu vergleichen.

Java ist pragmatisch objektorientiert.

Interessanter ist, was in Java weggelassen wurde. Am auffälligsten ist wohl der Verzicht auf mehrfache Vererbung. So praktisch diese auch wäre, sie passt nicht in das Konzept einer einfachen Implementation. Die Interfaces bieten für die allermeisten Zwecke einen vollwertigen Ersatz. In seltenen Fällen würde sich der Code einfacher darstellen, wenn mehrfache Vererbung möglich wäre.

Gewichtiger ist womöglich der Verzicht auf Templates. Templates sind Muster, mit denen sich ähnliche Klassen und Methoden, die sich nur dadurch unterscheiden, dass sie mit einem anderen Objekt umgehen können, kompakt erstellen lassen. Als Ersatz muss man in Java dieses Objekt abstrahieren und ein Interface implementieren lassen. Mit Java 1.5 steht allerdings praktisch dieselbe Funktionalität in Form von generischen Objekten zur Verfügung.

Weggelassen wurde auch Verwaltung des Heaps durch die Anwendung. Java verwendet dazu einen Garbage-Collector, der unbenutzte Elemente vom Heap entfernt und als Prozess im Hintergrund läuft. Natürlich sind Fälle denkbar, in denen dieser Prozess mit seiner Arbeit nicht nachkommt. Auch kann seine Arbeit das Zeitverhalten einer Java-Anwendung beeinflussen. Auf der anderen Seite vermeidet er viele Probleme, die sich in C++ durch zur Unzeit freigegebenen Speicher ergeben. Jeder C++-Programmierer hat da wohl schon einmal Erfahrungen gemacht. In Fällen, in denen sehr viele Objekte in sehr kurzer Zeit erzeugt und verworfen werden, ist es in Java aber ratsam, an die Wiederverwendung von Objekten zu denken.

Oft bemängelt wird das Fehlen der Möglichkeit, Operatoren zu überladen. Klar ist, dass es sich hier um eine reine Schreibvereinfachung handelt (syntactic sugar). Ich als Mathematiker würde Operatoren hin und wieder der funktionalen Schreibweise vorziehen. Aber essentiell ist das nicht. Führt man zusätzlich automatische Typumwandlungen ein, so kann das im Desaster enden.

Weiter fehlt ein Präprozessor. Dies scheint mir schon eine größere Einschränkung zu sein. Jedoch sind ausufernde bedingte Compiler-Anweisungen nicht dazu geeignet, einen Code leichter lesbar zu machen. Trotzdem hätte ich mir hier etwas mehr Pragmatismus von Seiten der Javadesigner gewünscht. Und in Java 1.5 ist auch ein gewisses Umdenken erkennbar.

Java und Sicherheit

Da Java stark mit dem Netz arbeitet, ist das Thema Sicherheit für Java von außerordentlicher Wichtigkeit. Schließlich werden über einen einfachen Browser Programme in den lokalen Rechner geladen und dort ausgeführt. Solchen Programmen kann man nicht erlauben, beliebig auf Ressourcen und Dateien zuzugreifen. Vergleichbar ist die Situation mit den ActiveX-Elementen von Microsoft, die ebenfalls unter Windows vom Netz geladen werden können und auf dem Rechner möglicherweise Schaden anrichten.

Die bisherige Sicherheitsphilosophie von Java bestand einfach darin, ein Applet im Browser in einem abgeschlossenen Sandkasten einzusperren. Applets können daher weder auf die lokalen Dateien zugreifen, noch Netzverbindungen zu anderen Rechner als dem, von dem sie stammen, aufnehmen. Im Gegensatz dazu konnten Java-Applikationen auf dem Rechner frei schalten und walten. In zukünftigen Java-Versionen werden hoffentlich feinere Abstufungen zwischen diesen beiden Extremen möglich sein und individuell für jede Applikation und jedes Applet eingestellt werden können.

Keines der wichtigen Betriebssystem bietet Sicherheit.

Man muss sich vor Augen halten, dass keines der verbreiteten Betriebssysteme irgendetwas Vergleichbares aufweist. Windows 9x hatte überhaupt kein Sicherheitseinstellungen. Es war für PCs gedacht, die nur einen Benutzer haben. Mit Windows NT lassen sich zwar Datenbereiche und der Zugriff auf den Rechner schützen, aber in der Praxis lässt sich das System von jedem Programm zerstören. Außerdem schützen die wenigsten Benutzer ihre Daten tatsächlich. Die Unix-Varianten schützen System und Benutzer effektiv voreinander; aber jedes Programm kann über das Netzwerk Außenkontakte aufnehmen und sämtliche Daten des Benutzers, von dem es gestartet wurde, lesen und beschreiben.

Eine wirklich sinnvolle Beschränkung eines laufenden Programms auf zugewiesene Verzeichnisse und freigegebene Ressourcen verspricht derzeit nur Java. Allerdings wird man hier noch warten müssen, bis Sun diesen Vorteil wirklich nutzt.

Java verspricht ein echtes Sicherheitskonzept.

Außerdem können sich Applets durch einen Signatur gegenüber dem Browser ausweisen. Akzeptiert der Benutzer diese Signatur, so kann er dem Applet eine höhere Berechtigung zuweisen.

Die Alltagstauglichkeit von Java

Dieses Thema wurde hitzig diskutiert. In der Tat waren die ersten Versionen von Java langsam und warfen den Rechner um etwa 5 Jahre zurück (Faktor 8). Außerdem gab es Bugs und andere Unzulänglichkeiten.

Mit dem Erscheinen der Version 1.1.x von Java und der Fertigstellung der ersten stabilen JIT-Compiler (just in time compiler) änderte sich die Sachlage. Diese Compiler übersetzen den Bytecode beim Laden in Maschinensprache und beschleunigen dadurch die Programmausführung. Inzwischen ist Geschwindigkeit für mich kein Thema mehr.

Java ist für normale Anwendungen schnell genug..

Der Netzcomputer und eingebettetes Java

Eine der Träume von Sun beim Design von Java war es, Java auf kleinen, mäßig ausgerüsteten Computern laufen zu lassen. Diese Computer sollten ihre Anwendungen nicht lokal installieren, sondern die benötigten Klassen bei Bedarf von Netz laden. Es handelt sich praktisch um ein fortgeschrittenes Pendant zu den alten Terminals. Durch das Netzwerk stünden diesen Terminals dennoch die gesamten Ressourcen des Netzes zur Verfügung.

Der Vorteil wäre natürlich, dass diese Anwendungen auch nur zentral gewartet werden müssen. In der Tat ist nicht zu leugnen, dass die Wartung und Installation von Anwendungen auf jedem einzelnen Arbeitsplatz ein teurer Posten ist. Die Idee ist also, diese Kosten (total cost of ownership) dadurch zu senken, dass man genormte und billige Java-Maschinen anschafft, und die eigentliche Administration nur noch zentral tätig ist. Der Rechner wird ins Netz gesteckt und funktioniert sofort als vollwertiger Teil des Netzes.

Mit Java lässt sich der perfekte Netzwerkrechner verwirklichen.

Leider wird dieser Traum nicht Wirklichkeit werden, da er den Markrealitäten entgegen läuft. Stattdessen gibt es immer mehr kleine Systeme, auf denen eine spezielle Version von Java läuft. Dazu gehören sogar schon Mobilfunktelefone. Man kann damit spezielle Dienste oder Spiele anbieten.

Java auf dem Server

Dass auch auf dem Server Java ein guter Ersatz für die bisher verwendeten Skripten sein kann, setzt sich mehr und mehr durch. Bisher startet der Server bei einer Anfrage eines Benutzers ein kleines Programm (Skript), das in einer Kommandozeilensprache oder in einer einfachen Sprache wie Perl arbeitete. Java ist nun aber durch seine Netzwerkfähigkeit und seinen Sprachumfang hervorragend dazu geeignet, diese Sprachen zu ersetzen. Falls der Server selber in Java arbeitet, so kann er sogar einzelne Klassen dynamisch nachladen um damit auf Anfragen zu antworten (so genannte Servlets).

Java und Sun

Ein Produkt steht nicht für sich alleine. Wichtig ist, wer dahinter steht. In diesem Fall steht mit Sun sicher ein wichtiger und mächtiger Partner hinter Java. Es ist zu erwarten, dass sich solch eine Firma nicht einfach von einem Produkt zurückzieht, insbesondere wenn man an den Erfolg von Java denkt. Sicher ist allerdings auch das nicht.

Obwohl Sun Java scheinbar frei zur Verfügung stellt, wird Sun letztendlich durch Java profitieren. Zum einen wird es kommerzielle Seitenprodukte geben, wie etwa spezielle Bibliotheken, Entwicklungswerkzeuge oder besonders effiziente Compiler. Außerdem ist der Imagegewinn, Markführer auf einem wichtigen Gebiet zu sein, nicht zu unterschätzen.

Immer wieder wird gefordert, Sun solle Java einem Entwicklungskomitee übergeben und das Produkt wirklich frei verfügbar machen. Außerdem soll Sun die Sprache normieren lassen, etwa von der ISO. Ich bin sicher, das Letzteres geschehen wird, schon allein, um sich von Verunreinigungen und Aufspaltungen zu schützen. Im Moment will jedoch Sun die Fäden bei der Entwicklung alleine in der Hand halten. Dies bringt gewichtige Vorteile und Nachteile mit sich. Einerseits entwickelt sich Java nicht chaotisch in verschiedene Richtungen, so dass die Portierbarkeit gewahrt bleibt. Andererseits hat die große Nutzergemeinde relativ wenig Einfluss auf Java und seine Bibliotheken. Außerdem zeigt sich immer wieder, dass im Netz genügend Ressourcen vorhanden sind, um wichtige Dinge schnell voranzutreiben. Ich tendiere vorerst zugunsten der zentralen Entwicklung bei Sun.

Neuere Entwicklungen

Die erste  Text, den Sie bis hierher gelesen haben, entstand schon vor einiger Zeit. Zumindest mit der Messlatte der Computerentwicklung ist er schon fast historisch. Einiges hat sich seither getan. Sun hat die neue Version Java 1.2 herausgebracht, die nun Java 2 genannt wird. Inzwischen ist auch der HotSpot Compiler fertig, der eine Leistungsbeschleunigung bringt. Auch entwickeln sich Java und Linux in ungeahnter Weise.

Man kann getrost sagen, dass sich Java in vielen Bereichen sehr gut entwickelt hat. Die Sprache ist inzwischen akademisch akzeptiert. Auf den meisten Plattformen steht Java 1.1 zur Verfügung. Wie von mir vorhergesagt, gibt es eine wachsende Sammlung kleinerer Applikationen. Größere Businessanwendungen fehlen aus den oben genannten Gründen immer noch. Auf dem Server, im WWW und im Bereich von Datenbankanwendungen ist Java inzwischen mehr als etabliert. Erstaunlich ist für mich, wie stark sich Java im Bereich der Embedded Systems (Geräte, die Java verwenden, aber keine traditionellen Computer sind) entwickelt. Sun unterstützt dies durch JINI, eine Laufzeitumgebung für solche Geräte.

Es erweist sich jedoch, dass die Java-Umgebung immer umfangreicher wird. Derzeit liegt der Umfang bei 15 MB. Sie muss zwar nur einmal installiert werden, dies mag aber für viele Anwender, die noch über eine eingeschränkte Internetverbindung verfügen, ein Hinderungsgrund sein. Die Java-Umgebung sollte daher bei Software, die auf CDs ausgeliefert wird, enthalten sein.

Eine interessante Entwicklung ist Java 3D, mit dem sich dreidimensionale texturierte Objekte darstellen lassen. Diese API wird auch Hardwarebeschleunigung unterstützen. Zusammen mit einer gewachsenen Multimedia-API könnte Java damit auch auf dem Spielesektor eine Rolle spielen.

Zurück zum Java-Kurs