Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 5. Auflage |
<< | < | > | >> | API | Kapitel 1 - Was ist Java? |
Wie bereits im Vorwort erwähnt, wollen wir uns der Java-Euphorie gerne anschließen, sie aber nicht vollkommen kritiklos übernehmen. In diesem Abschnitt soll der Versuch unternommen werden, eine kurze Bewertung zu geben und einige der häufigsten Missverständnisse auszuräumen. Wir wollen dabei zunächst zu einigen Thesen Stellung nehmen, die immer wieder artikuliert werden und häufig zu überzogenen oder falschen Annahmen über das Wesen von Java führen.
JavaScript ist eine von Netscape entwickelte Script-Sprache zur Erweiterung von HTML-Seiten. Sie ist syntaktisch an Java angelehnt, bietet aber bei weitem nicht so viele Features. Sie wird nicht in Bytecode kompiliert, sondern vom Browser interpretiert und erlaubt weder die Konstruktion von Applets noch von eigenständigen Applikationen. Als Script-Sprache ist sie vorwiegend für einfache Manipulationen am Layout und der Interaktionsfähigkeit von HTML-Seiten gedacht.
Diese gern wiederholte These aus der Sprachbeschreibung ist nur bedingt richtig. Java ist eine objektorientierte Programmiersprache mit fortschrittlichen Eigenschaften und muss wie eine solche erlernt werden. Sie ist einfacher zu beherrschen als C oder C++, und es gibt weniger Raum für »Anfängerfehler«. Auch die Klassenbibliothek ist leichter zu verwenden, denn sie wurde neu entworfen und kommt ohne die Altlasten nicht-objektorientierter Vorgänger daher. Die Kompatibilitätsanforderungen von mittlerweile sechs JDK-Folgeversionen (1.1-1.4, 5.0 und 6.0) merkt man ihr aber durchaus an. Vor allem wegen des großen Umfangs der Klassenbibliotheken erfordert der Umgang mit Java ein nicht zu unterschätzendes Maß an Einarbeitungszeit, bevor man als Entwickler zu produktiven Ergebnissen kommt.
Die Quellcode-Portabilität von Java-Programmen ist auf der reinen Sprachebene etwas höher als die von C- oder C++-Programmen. Das ist hauptsächlich dem Verzicht auf explizite Pointer sowie maschinennahe Datentypen und Operatoren zu verdanken. Auch die genaue Spezifikation der elementaren Datentypen trägt zu dieser Tatsache bei.
Bezieht man dagegen die riesige Klassenbibliothek mit ihren auf allen Plattformen standardmäßig vorhandenen Funktionen in die Betrachtung ein, fallen C und C++ im Portabilitätsvergleich weit zurück. Funktionalitäten wie Datenbankzugriffe, Netzwerkprogrammierung, Multithreading, Serialisierung, Grafikprogrammierung und viele andere mehr sind in Java bereits in der Standardversion enthalten und stehen auf allen Plattformen in praktisch identischer Weise zur Verfügung.
Ein weiterer Portabilitätsvorteil von Java besteht zudem darin, dass die kompilierten Programme binärkompatibel sind. Ein einmal übersetztes Programm wird auf jeder Plattform laufen, die eine Java-VM und die erforderliche Laufzeitumgebung zur Verfügung stellt. Ein Rekompilieren, wie es bei C- oder C++-Programmen erforderlich ist, benötigen Java-Programme daher nicht.
Da Java-Programme in Bytecode übersetzt werden, der nicht direkt vom Prozessor ausgeführt werden kann, muss ein Interpreter diese Aufgabe übernehmen. Dadurch können CPU-lastige Java-Programme um den Faktor 10 bis 20 langsamer sein als vergleichbare C/C++-Programme.
Dieses Argument wird auch heute noch gern von der C-/C++-Fraktion angeführt. In der Praxis relativiert es sich durch mehrere Faktoren. Einerseits sind nur wenige Programme ausgesprochen CPU-intensiv. Die meisten interaktiven Programme verbringen nämlich einen Großteil ihrer Zeit damit, auf Eingaben des Benutzers oder langsame Datenbank- oder Festplattenzugriffe zu warten. Zudem wurde das Laufzeitverhalten von Java-Programmen durch die Entwicklung von Just-In-Time-Compilern (JIT-Compiler), Native-Code-Compilern oder Java-Prozessoren in den letzten Jahren stetig verbessert und nähert sich zunehmend dem von kompiliertem C/C++-Code an. Die seit dem JDK 1.3 zum Umfang des JDK gehörenden HotSpot-Compiler analysieren zur Laufzeit des Programms den interpretierten Bytecode und übersetzen besonders rechenintensive Teile in direkt ausführbaren Maschinencode.
Das Performance-Problem kann daher als temporäres Problem angesehen werden - falls es für den speziellen Typ Anwendung überhaupt noch existiert. Viele Beobachter gehen heute davon aus, dass Java-Programme in den meisten praktisch relevanten Situationen mit derselben Geschwindigkeit laufen wie kompilierte C/C++-Programme, und Benchmarks bestätigen diese Ergebnisse bereits. Auch die anfänglichen Performance-Probleme der Swing-Oberflächen wurden mit dem JDK 1.3 und seinen Nachfolgeversionen weitgehend unschädlich gemacht. Auch der nach wie vor anhaltende Fortschritt bei der Hardware-Entwicklung hat seinen Beitrag geleistet. Während die ersten Java-Versuche meist auf PCs der Kategorie Pentium-I mit 75 MHz und 8 MByte RAM abliefen, haben die aktuellen CPUs die 3GHz-Marke überschritten, und 512 MB Hauptspeicher zählen zum guten Ton.
Dennoch kann der unachtsame Entwickler in Java leicht zu einer schlechten Gesamtperformance beitragen. Wer die abstrakten Designmöglichkeiten von Strings, Readern oder Writern, Collection-Klassen und vielen anderen Bestandteilen der Klassenbibliothek bedenkenlos verwendet, kann das Laufzeitverhalten seines Programms stark beeinträchtigen. Schon mit der Kenntnis einiger Details über den Aufbau wichtiger JDK-Klassen lassen sich die vorhandenen Bibliotheken weit effizienter nutzen, und die Performance der Programme steigt an. In Kapitel 50 gehen wir auf einige dieser Details ein und zeigen, wie man Java-Programme schreibt, deren Performance für viele Anwendungen adäquat ist.
Diese Behauptung resultiert vor allem aus drei Beobachtungen. Zum einen hatten viele der zunächst in Java entwickelten Anwendungen Spielzeug- oder Demo-Charakter. Meist als Applet realisiert, hatten sie lediglich die Aufgabe, eine Homepage zu verschönern oder die Java-Kentnisse ihrer Entwickler im zweckfreien Raum zu demonstrieren. Echten Nutzwert boten dagegen nur wenige. Und größere Applikationen, die komplett in Java geschrieben wurden, waren zunächst kaum auf dem Markt. Dies hat sich mittlerweile vollständig geändert. Es gibt tausende von ausgewachsenen Java-Applikationen aus allen nur erdenklichen Anwendungsgebieten.
Zweitens war das Look-and-Feel von Java-Programmen nicht ausgereift. Tatsächlich bildet das AWT nur einen geringen Anteil der in den jeweiligen plattformspezifischen Fenstersystemen verfügbaren Möglichkeiten ab. Die wenigen Dialogelemente stehen allerdings portabel zur Verfügung. Mit Hilfe des Swing-Toolsets kann dieses Problem als gelöst angesehen werden. Swing bietet einen umfassenden Satz komplexer Dialogelemente und stellt ihn plattformübergreifend zur Verfügung. Dabei ist es möglich, das Look-and-Feel der jeweiligen Anwendung zur Laufzeit umzustellen und so dem Geschmack und den Kenntnissen des jeweiligen Benutzers anzupassen.
Die dritte Beobachtung besagt, dass Java voller Fehler steckt. Während dies weniger für die Sprache selbst, ihre Werkzeuge oder die elementaren Eigenschaften der Klassenbibliothek galt, konnten die frühen Grafikbibliotheken ein gewisses Maß an Fehlerhaftigkeit nicht verhehlen. Zwar gibt es nach wie vor Fehler im JDK (alle bekannten Bugs sind in der als Bug Parade bezeichneten Fehlerdatenbank gespeichert), doch sind diese in aller Regel nicht so schwerwiegend, dass nicht ein Workaround gefunden werden könnte. Zudem stecken die Fehler meist in den Klassenbibliotheken. Der Compiler und die virtuelle Maschine, auf der die ausführbaren Programme laufen, können für die meisten Anwendungen als hinreichend stabil angesehen werden. Auch hier gibt es Ausnahmen, insbesondere bei JDK-Portierungen auf weniger gebräuchliche Betriebssysteme. Auf den meisten Systemen ist das JDK in der täglichen Praxis jedoch ein ausgesprochen stabiles, zuverlässiges und mittlerweile auch sehr performantes Entwicklungswerkzeug.
Wenn man das Anwenderinteresse zugrunde legt, ist Java die mit Abstand erfolgreichste Programmiersprache der letzten Jahre. Wie oben gezeigt, hat die Sprache in den wenigen Jahren seit Ausgabe der Version 1.0 eine immense Verbreitung erfahren. Java war Anlaß für Tausende von Büchern und Zeitschriftenartikeln, und es gibt auch einige Zeitschriften, die sich ausschließlich mit Java beschäftigen. Zudem entstanden eine Reihe von stark frequentierten Newsgroups, die das Interesse an Java deutlich machen. Alle größeren Softwarehersteller unterstützen die Sprache und haben konkrete Produkte realisiert. In den meisten einschlägigen Stellenanzeigen werden Java-Kenntnisse verlangt.
Zeitgleich zur Diskussion um die Eignung Javas als Entwicklungswerkzeug für grafische Oberflächen hat sich ein Wandel auf der Serverseite vollzogen. Mit dem Servlet-API und den Java Server Pages haben sich beispielsweise im Bereich der Generierung dynamischer Webseiten Techniken etabliert, die dem traditionellen CGI-Scripting Konkurrenz machen. Daneben setzen große Softwarehersteller auf mehrschichtige Client-Server-Architekturen mit Java-Unterstützung (Oracle Financials, Star Office) oder statten ihre Datenbank- oder Web-Server mit Java-Fähigkeiten aus (Oracle 8, Lotus Domino, SUN Java Web Server, Apache jserv). In vielen Unternehmen gibt es bereits verteilte Anwendungen, die auf die plattformübergreifenden Fähigkeiten und die Binärkompatibilität von Java-Anwendungen setzen.
Auch auf der Client-Seite ist seit einiger Zeit ein Trend zu Java zu beobachten. So gibt es »kleine« Java-Anwendungen, die auf dem Palm Pilot, dem Psion 5 oder in Mobiltelefonen laufen. Aber auch komplexe Standalone-Programme wie - beispielsweise aus dem Bereich der Entwicklungswerkzeuge - IntelliJ IDEA, JBuilder, NetBeans (Forte) oder OptimizeIt werden mittlerweile in Java entwickelt. Viele Unternehmen setzen Java ein, um die Produktivität bei der Entwicklung grafischer Oberflächen zu erhöhen, oder verbinden in Java geschriebene Frontends mit den vorhandenen batchorientierten Applikations- und Datenbankservern. Nicht selten führt der Umstieg von C/C++ auf Java zu drastischen Effizienzsteigerungen bei der Entwicklung und Portierung komplexer Anwendungssysteme.
Neben der plattformübergreifenden Portabilität von Bytecode und grafischer Oberfläche bietet Java Dinge wie Datenbankanbindung, Multithreading oder Netzwerkprogrammierung ohne architektonische Brüche. Mit der »Pflicht«, objektorientiert zu programmieren (im Gegensatz zu C++ gibt es in Java keine legitimierte Möglichkeit, rein prozedurale Programme zu schreiben), muss der Entwickler einen weiteren Schritt in der Evolution seiner eigenen Fähigkeiten vollziehen. Applets, Servlets und der Austausch von Bytecode zwischen Anwendungen wurde erst mit Java salonfähig. Mit weltweit mehreren Millionen Java-Entwicklern ist die kritische Masse zur Etablierung dieser neuen Techniken erreicht.
Natürlich kann heute niemand sagen, ob Java auch langfristig erfolgreich sein und als Programmiersprache auch in zehn oder zwanzig Jahren eine Rolle spielen wird. Das derzeitige und nach mittlerweile fast 10 Jahren immer noch anhaltende Entwicklerinteresse spricht allerdings sehr dafür. Programmiersprachen und -methoden werden nicht von heute auf morgen ausgewechselt, denn Paradigmenwechsel brauchen ihre Zeit. Vorhandener, mit viel Aufwand erstellter Quellcode wird nicht einfach weggeworfen. Auch 20 Jahre alte COBOL-, RPG- und FORTRAN-Programme werden heute noch gewartet, denn Investitionen in Hard-, Soft- und Brainware sind nicht von heute auf morgen austauschbar. Java hat seinen Zenit noch nicht erreicht, und neuer Code auf Basis von Java wird in nach wie vor zunehmendem Maße entwickelt. So kann die Prognose gewagt werden, dass Java auch im Jahre 2010 und darüber hinaus nennenswerte Bedeutung haben wird. Wer also auf Erfahrungen in Java-Programmierung zurückgreifen kann, hat möglicherweise den entscheidenden Vorteil im Wettbewerb mit der Konkurrenz.
Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 5. Auflage, Addison Wesley, Version 5.0.1 |
<< | < | > | >> | API | © 1998, 2007 Guido Krüger & Thomas Stark, http://www.javabuch.de |