2 Schnuppertour Java

Obwohl Java noch nicht alt ist, hat es bereits eine bewegte Vergangenheit hinter sich. So hat Java Gegner zu gemeinsamen Projekten vereint, die ohne diese revolutionäre Technik sich wahrscheinlich nie an einen Tisch gesetzt hätten. Apple und Microsoft kooperieren beispielsweise seit geraumer Zeit bei der Entwicklung ihrer virtuellen Java-Maschinen. Aber Java erzeugt auch Unfrieden. Bekanntlich laufen diverse Klagen zwischen Sun und Microsoft. Diversen Quellen zufolge ist der Java-Erfinder Sun Gegner Nummer 1 von Microsoft. Dies macht sicher deutlich, wie mächtig Java ist, welches gewaltige Sprengpotenzial sich hinter diesem kleinen Wort verbirgt.

Ob in Kooperation oder ohne Partner - zahlreiche Giganten der Computerbranche setzen mittlerweile auf Java. Die Liste liest sich wie das »Who is who« der EDV-Welt. Aber auch außerhalb der EDV-Kernbranche gibt es mehr und mehr Java-Projekte: Industrie, Banken, Versicherungen, Kreditkartenfirmen. Es gibt wahrscheinlich keine Branche, wo keine großen Java-Projekte laufen. Insbesondere nach der Jahrtausendwende und dem Freiwerden der davor in Altprojekten gebundenen Ressourcen haben Java-Projekte erheblich zugenommen. Java hat sich als eine der wichtigsten Programmiertechniken der Gegenwart etabliert. Und obwohl niemand in die Zukunft sehen kann, riskiert man wohl keine Fehlaussage, wenn man Java als die Programmiersprache der Zukunft bezeichnet.

Bevor wir mit Java als Programmiersprache beginnen, soll auf die Java-Welt und das Java-Umfeld im weiteren Sinn eingegangen werden. Java unterscheidet sich in vielerlei Hinsicht von anderen Programmiersprachen wie COBOL, FORTRAN, BASIC, PASCAL oder aber auch SMALL TALK und C/C++. Die Unterschiede beschränken sich nicht auf die oft als Hauptkriterium genannte Objektorientierung von Java. Die Objektorientierung gilt zwar als eine der herausragenden Eigenschaften von Java und dürfte ein entscheidender Grund für den phänomenalen Erfolg von Java sein. Die Differenzen umfassen jedoch die komplette Java-Welt und das Java-Umfeld selbst. Immerhin gab es auch schon vor Java objektorientierte Sprachen wie Lisp oder Small Talk, die allerdings nie über ein »Mauerblümchendasein« hinaus kamen. Java muss also mehr bieten als nur Objektorientierung. Java ist für eine heterogene Welt, sei es das Internet mit seinen diversen Rechnermodellen, sei es ein PC, ein Mac, ein Unix-Rechner, sei es nur eine Kaffeemaschine oder ein Videorecorder, entwickelt worden. Die damit zusammenhängende Plattformunabhängigkeit ist das zweite wichtige Kriterium, um die Bedeutung von Java einschätzen zu können. Deshalb ist die Beschäftigung mit der Java-Welt sicher ein guter und gewinnbringender Einstieg in die Materie.

2.1 Was ist Java?

Java ist eng mit dem Begriff Internet verbunden. Vielfach wird Java sogar als eine reine Internet-Sprache bezeichnet. So stimmt das aber nicht, zumal Java ursprünglich gar nicht auf das Internet zielte. Internet-Sprache als Charakterisierung für Java fasst einfach nicht das ungeheure Potenzial, das in der Technologie steckt. Das oft zitierte Beispiel eines Java-Betriebssystems für eine Kaffeemaschine oder eine Waschmaschine macht die allgemeinere Bedeutung sicher deutlich.

Trotzdem nimmt das Internet eine zentrale Stelle in der Java-Welt ein. Vielleicht kann man das Internet etwas unseriös als »Hebamme« für die Geburt von Java bezeichnen. Wir wollen uns Java aus diesem Grund über die Geschichte des Internets näheren.

2.1.1 Das Internet

Das Internet und seine Firmenableger - die Intranets - wachsen permanent. Das Internet boomt! Der Computer als eigenständige, unabhängige Recheneinheit gehört selbst im Privatbereich der Vergangenheit an. Kontakt zu einem Netzwerk und/oder zum Internet ist die Regel. Insbesondere sind über das Internet unzählige Rechner unterschiedlichster Bauart und mit den verschiedensten Betriebssystemen zusammengeschlossen. Das World Wide Web und die anderen Internet-Dienste sind ein riesiges, geniales, dezentrales, dynamisches, unstrukturiertes und- im besten Sinn des Wortes - chaotisches System, das sämtliche Bereiche des täglichen Lebens durchdrungen hat. Eine E-Mail-Adresse und eine Homepage sind für jedes wichtigere Unternehmen Pflicht, aber auch im Privatbereich selbstverständlich. Besonders beeindruckend ist vor allem das immer noch anhaltende rasende Wachstum des Internets. Und ein Ende ist noch nicht abzusehen.

Da das Internet immer mehr von Nichtfachleuten genutzt wird, kennen auch prozentual gesehen immer weniger Anwender Details davon. Früher nutzten das Internet hauptsächlich Experten. Heute sind die Experten absolut in der Minderheit. Und so kommt es, dass das Internet von Laien oft mit dem World Wide Web (WWW) gleichgesetzt wird (so wie viele Amerikaner Bayern mit Deutschland gleichsetzen und viele Deutsche Holland mit den Niederlanden :-)). Dies kommt nicht zuletzt daher, dass die Geschichte und die anderen Dienste des Internets kaum bekannt sind. Obwohl das WWW inzwischen unbestreitbar die wichtigste Säule ist, besteht das Internet natürlich aus mehr Diensten, ist mehr als nur das populäre WWW. Das Internet ist ein gigantisches, weltweites Computernetzwerk, das die unterschiedlichsten Dienstleistungen anbietet, die vielfach weit älter sind als das WWW.

Abbildung 2.1:  Das News-Fenster des Netscape Navigators

Elektronische Post, Möglichkeiten von weltweiter Werbung und Repräsentation, Diskussionsforen, das Suchen von Informationen in einer riesengroßen Informationsquelle, das Ausführen von Programmen auf entfernten Computern oder das Laden von Dateien und Programmen von - über die ganze Welt verteilten - Rechnern auf den eigenen Computer und wieder zurück sind nur einige dieser Dienste. Dazu kommen Internet-Telefonie, die Verzahnung von Arbeit auf dem lokalen Rechner und permanenten Zugriffen auf Internet-Server, Online-Bankgeschäfte und einkaufen per Internet. Wer will, kann sein ganzes Leben rund um das Internet aufbauen. Viele dieser Möglichkeiten haben primär nichts mit dem WWW zu tun (obwohl sie oft darüber mittels Verweisen genutzt werden können).

Im Internet gibt es natürlich nicht nur Licht. Diverse Probleme werfen dort Schatten. Gerade die Heterogenität der Plattformen und Rechner ist sicher ein Hauptproblem für Software im Internet. Andere wesentliche Probleme betreffen die Interaktion zwischen Anwendern an ihren Clients und den Servern sowie Sicherheitsfragen. Java bietet dafür und für viele andere Internet-Fragen einen wichtigen Lösungsansatz.

2.1.2 Ein kurzer Abriss der Internet-Geschichte

Die Geschichte des Internets zeigt eines der wenigen nützlichen Resultate des kalten Kriegs der vergangenen Jahre. Die Furcht amerikanischer Militärs vor einem Atomschlag durch die ehemalige UdSSR veranlasste in den späten Sechzigerjahren die Vereinigten Staaten von Amerika, eine Organisation namens Advanced Research Projects Agency (ARPA) zu beauftragen, für das US-Verteidigungsministerium mit großem finanziellem Aufwand ein Rechnersystem zu entwickeln, das selbst nach einem atomaren Erstschlag der UdSSR noch funktionieren sollte und den Gegenschlag organisieren konnte.

Erstes Resultat war im Jahre 1969 ein Forschungsnetzwerk aus vier miteinander verbundenen Großrechnersystemen. Ein zentraler Großrechner als Mittelpunkt dieses Rechnersystems kam nicht in Frage, weil bei seinem Versagen ein Gesamtausfall des Rechnersystems die Folge gewesen wäre.

Kleinere und unabhängig voneinander aufgebaute Rechnersysteme mussten entwickelt werden. Dabei war es unmöglich, nur homogene Rechnersysteme zu fordern. Die Verbindung von heterogenen Rechnersystemen war notwendig. Diese Verbindung zwischen den einzelnen Systemen sollte unter allen Umständen funktionieren - sogar beim Ausfall eines beliebigen Rechners im Netz. Da feste Standleitungen mit Sicherheit bei einer solchen Katastrophe wie einem Atomschlag zerstört würden, reichten diese als einzige Verbindung nicht aus. Zusätzlich musste das Netzwerk - ursprünglicher Name ARPANET bzw. gelegentlich ARPNET genannt - über flexible Leitungen, etwa Telefonleitungen, kommunizieren können. Für eine maximale Fehlertoleranz und Sicherheit des Netzes sollten immer mehrere Wege zwischen sämtlichen Computern im Netzwerk möglich sein. Nachrichten im Netz mussten in der Lage sein, quasi selbstständig den Weg zum Adressaten zu finden. An jedem Knotenpunkt von Informationswegen sollte eine Nachricht selbstständig den optimalen freien Weg zum nächsten Knotenpunkt finden. Dies erzwang als eine Konsequenz die Zerlegung von Informationen in kleinere Datenpakete, die unabhängig voneinander verschickt werden konnten.

Für die Datenhaltung auf den einzelnen Rechnern sah das ursprüngliche Konzept folgende Logik vor: Die Daten und Funktionalitäten sollten nicht nur auf einem Rechner, sondern auf allen unabhängigen Rechnern gehalten werden (eine Art Backup-Verfahren). In regelmäßigen Abständen sollten die Daten abgeglichen werden. Dabei wurden in der Anfangsphase immer nur komprimierte Datenpakete übermittelt, die man dann offline auswerten musste. Online-Übertragung mit direkter Verwendung der Daten, wie sie heute etwa im WWW praktiziert wird, kannte man in der Anfangszeit des Internets noch nicht. Online-Anwendungen kamen erst später hinzu.

In der Anfangsphase wuchs das ARPANET langsam (was auf Grund der zu dieser Zeit immensen Kosten sicher verständlich ist) und bestand 1972 aus ungefähr 50 Systemen. Insbesondere zwang der Kostendruck die Militärs, das Netz für zivile Zwecke zu öffnen. Besonders die National Science Foundation (NSF), eine Dachorganisation verschiedener Bildungseinrichtungen in den USA, zeigte Interesse am Internet und sorgte dafür, dass im Laufe der Zeit zahlreiche Universitäten und andere Forschungseinrichtungen an das Internet angeschlossen wurden. Damit erlangten immer mehr Personen Zugang zum Netz, die nicht unbedingt als militärisch zuverlässig zu betrachten waren. Die Militärs begannen um die Sicherheit ihrer Geheimnisse zu bangen. Große Teile des militärischen Bereichs wurden deshalb Anfang der Achtzigerjahre in ein eigenes Netz, das MILNET, ausgegliedert. Der zivile Teil wurde Internet genannt.

Woher der Name »Internet« kommt, ist nicht ganz unumstritten. Es gibt einige Varianten. Folgende ist aber die wahrscheinlichste: Das Internet wird oft als das »Netz der Netze« bezeichnet. Warum gerade »Netz der Netze« und nicht »Zusammenschluss vieler Netzwerke« oder ähnlich? Der Begriff Internet steht für Interconnected Networks. Übersetzt heißt das »Netz der verbundenen Netze«.

Da zentrale Ideen des Internets flexible Möglichkeiten der Datenübertragung und die Unterstützung heterogener Rechnerplattformen waren, mussten verschiedene Protokolle entwickelt werden, über die sich die Rechner verständigen konnten und die unabhängig von der eigentlichen Rechnerarchitektur und dem normalen Befehlssatz des jeweiligen Betriebssystems waren.

Ein Protokoll ist allgemein als eine Vereinbarung zu verstehen, wie bestimmte Prozesse ablaufen. Das kann sowohl auf der Ebene von zwischenmenschlichen Beziehungen (etwa einem Staatsempfang) notwendig sein, aber erst recht, wenn verschiedene Computersysteme an einer Aufgabe beteiligt sind.

Andere Protokolle mussten die Verbindung zwischen den Systemen regeln. Es war ja durchaus vorgesehen, dass Verbindungen über unterschiedlichste Wege aufgebaut werden, etwa einen Telefonanschluss. Und da muss beispielsweise ein kontaktierter Rechner einen Anruf eines anderen Rechners von einem Telex-, Fax- oder Sprachanruf unterscheiden können. Zusätzlich Vereinbarungen innerhalb von Protokollen regeln die konkrete Datenübertragung und überprüfen die übertragenen Daten auf Fehlerfreiheit. Da bei jeder Datenübertragung Fehler entstehen können, sind bessere Protokolle ebenfalls in der Lage, fehlerhafte Daten zu erkennen und gegebenenfalls während der Übertragung vom Sender noch einmal anzufordern.

Viele im Internet gebräuchliche Protokolle basieren auf Unix-Protokollen. Grund ist, dass das ursprünglich im ARPANET hauptsächlich verwendete Betriebssystem Unix war und so waren die am Anfang verwendeten Protokolle natürlich Unix-Datenübertragungsprotokolle. 1973 wurde mit IP (Internet Protocol) ein Transportprotokoll präsentiert, das plattformunabhängigen Transport von Daten garantieren sollte. Bereits Anfang 1974 erschien eine Verbesserung - das auf IP basierende Erweiterungsprotokoll TCP (Transmission Control Protocol), das eine noch fehlerfreiere Übertragung gewährleistete.

TCP funktioniert nur mit IP als Unterbau, gibt aber diesem erst seine Übertragungssicherheit. Und so kommt es, dass heute beide Protokolle meist nur noch in Verbindung verwendet werden (TCP/IP). Seit 1983 ist TCP/IP das Internet-Standard-Protokoll für Direktverbindungen und dient sogar zur Definition der Begriffe Internet/Intranet (alle auf dem TCP/IP-Protokoll basierenden Netzwerke). Es löste das bis dahin verwendete Internet-Standard-Protokoll NCP (Network Control Protocol) ab.

TCP/IP ist ein sehr leistungsfähiges Transportprotokoll, aber eben nur ein reines Transportprotokoll. Man kann sich die Situation ganz gut vorstellen, wenn man sie mit dem Eisenbahnverkehr vergleicht. TCP/IP ist in dieser Vorstellung das Schienennetz, über das der eigentliche Verkehr rollt. Auf diesen Schienen rollen in unserem Gedankenmodell also Züge, die als Dienstprotokolle oder Internet-Dienste bezeichnet werden. Je nach Aufgabe gibt es Personenzüge, Güterzüge, Postzüge, Wartungszüge oder kombinierte Varianten. Für verschiedene Aufgaben werden verschiedene Zugarten (Dienste) eingesetzt. Aber so, wie man in einem Personenzug auch Waren transportieren kann, so können manche Dienste im Internet auch vielfältig eingesetzt werden. Vielleicht nicht so effektiv wie die Spezialvariante, aber dennoch mit Einschränkungen möglich.

Auf das Internet bezogen stellt man sich TCP/IP als untere Schicht, Dienstprotokolle als eine Schicht darüber vor.

Man spricht im Zusammenhang mit dem Internet-TCP/IP-Protokoll auch von einem so genannten Schichtprotokoll.

Die Dienstprotokolle, die auf dem TCP/IP-»Schienennetz« aufsetzen, sind Dienste wie Telnet, FTP oder auch das WWW. Das aus HTML aufgebaute World Wide Web wurde im Mai 1991 auf den Rechnern des Kernforschungszentrums CERN (European Organisation for Nuclear Research, Genf) erstmals offiziell vorgestellt. Die ersten Ansätze dieses Projekts gehen allerdings bereits bis in den März 1989 zurück. Damals schlug ein Mitarbeiter von CERN, Tim Berners-Lee, ein Hypertext-Projekt für das Internet vor, um darüber verteilte Inhalte miteinander zu verbinden. Es sollte ein vernetztes Hypertext-System geschaffen werden, in dem die vielen Informationsquellen von CERN über eine gemeinsame und vor allem einfach zu bedienende Oberfläche verfügbar sein sollten. Eigens für dieses Projekt wurde eine Organisation namens W3C (http://www.w3.org) gegründet, deren ursprüngliches Ziel es also war, Wissenschaftlern aller Fachbereiche eine leicht zu bedienende Struktur zu schaffen.

Viele Wissenschaftler aus EDV-fremden Sparten waren Ende der Achtzigerjahre nicht in der Lage oder gewillt, sich mit der relativ komplizierten Befehlsstruktur von FTP, Telnet oder den anderen Diensten auseinander zu setzen. Das WWW sollte auch Nicht-EDV-Freaks unter den Wissenschaftlern die Möglichkeit eröffnen, Daten und Informationen auszutauschen und in weltweiten Datenbeständen zu recherchieren. Dabei war von vornherein vorgesehen, über reinen Text hinausgehende Daten mit einzubeziehen. Basis für eine Sprache zu Beschreibung eines solchen Hypertext-Systems war SGML (Standard Generalized Markup Language - siehe: http://www.w3.org/MarkUp/SGML/), eine bereits seit den Sechzigerjahren verwendete Beschreibungssprache zur Darstellung von Inhalten auf unterschiedlichen Plattformen. Daraus entstand die neue Beschreibungssprache HTML (Hypertext Markup Language), die mit einer geeigneten Darstellungssoftware (dem so genannten Browser) diesen Anforderungen genügte. Mit der ersten Version von HTML präsentierte das W3C zwar nur einen aus heutiger Sicht sehr einfachen Standard, in dem zunächst nur die Möglichkeit bestand, relativ simple HyperText-Systeme im Internet aufzubauen. Diese konnten jedoch bereits wie geplant neben einfachem Text und Hyperlinks bereits Grafiken enthalten. Insbesondere war damit das daraus und dem zusätzlich entwickelten Protokoll HTTP (Hypertext Transfer Protocol) entstehende WWW bereits den bisherigen Internet-Diensten in Bezug auf Anwenderfreundlichkeit überlegen.

Richtig populär wurde das Internet freilich erst durch den Mosaic-Browser, den ersten WWW-Browser mit einer grafischen Oberfläche. Die gemeinsame Erfolgsstory von WWW und dem Browser begann im Jahr 1993, als dieser von Marc Andreessen am National Center for Supercomputing Applications (NCSA - http://www.ncsa.uiuc.edu/) an der Universität von Illinois zum ersten Test freigegeben wurde. Erstmals nahm neben den bisherigen Internet-Anwendern (Militärs, Wissenschaftler und EDV-Experten) eine private Öffentlichkeit Notiz vom Internet und begann eine erste Erkundungstour mit diesem Browser. Lange Zeit stand der NSCA-Mosaic als Synonym für die Darstellungssoftware des WWW. Insbesondere ist er der Vorfahr des Netscape Navigators, den Marc Andreessen 1994 entwickelt hatte, nachdem er NSCA verlassen und mit Jim Clark die Firma Netscape gegründet hatte.

2.1.3 HTML

HTML ist wie gesagt die Abkürzung für Hypertext Markup Language und wurde aus der in der ISO-Norm 8779:1986 festgeschriebenen Sprache SGML (Standard Generalized Markup Language) entwickelt. HTML ist als Ableger von SGML im Gegensatz zu SGML speziell auf Hypertext-Funktionen ausgerichtet (wie man bereits aus dem Namen ableiten kann).

HTML ist für die Arbeit mit Java eine zentrale Grundlage, denn die Funktionalität von Java- Applets basiert auf einer Verknüpfung mit HTML.

HTML ist keine (!) Programmiersprache wie Java, PASCAL oder C/C++, sondern eine so genannte Dokument-Beschreibungssprache (oder Dokumentenformat genannt). Mit einer Dokument-Beschreibungssprache werden die logischen Strukturen eines Dokuments beschrieben und kein Programm im eigentlichen Sinn erstellt. Insbesondere fehlen HTML Variablen und Programmfluss-Anweisungen, die zentrale Bestandteile einer Programmiersprache sind. Im Grunde gibt ein Dokumentenformat nur unverbindliche Empfehlungen an eine Darstellungssoftware (bei HTML Browser genannt), wie eine bestimmte Dokumentenstruktur darzustellen ist, damit sie dem geplanten Layout und der vorgesehenen Funktionalität entspricht. Es gibt allerdings keine absolute Darstellungsvorschrift, weswegen sich Darstellungen von HTML-Seiten in verschiedenen Browsern oft erheblich unterscheiden können (eine Folge der geplanten Plattformunabhängigkeit).

Zu einer durch HTML beschriebenen logischen Dokumentenstruktur gehören Verweise, aber auch Kapitel, Unterkapitel, Absätze usw. HTML-Dateien bestehen dabei aus reinem Klartext. Dadurch bleiben HTML-Dokumente plattformunabhängig. Wie später bei Java war diese Plattformunabhängigkeit neben der extrem einfachen Benutzerführung per Hyperlinks in einer so heterogenen Welt wie dem Internet der wichtigste Schlüssel für den Erfolg des WWW. Plattformabhängig ist im WWW immer nur die Software zum Interpretieren der HTML-Dateien (der Browser).

Da von Anfang an ein in HTML geschriebenes Dokument mit den Texten, Grafiken sowie einigen weiteren multimedialen Elementen (Sound, Video usw.) verknüpft werden sollte, mussten entsprechende Techniken entwickelt werden. Elemente, die jenseits von Textanweisungen zu sehen sind, werden in einer Webseite als Referenz auf eine entsprechende externe Datei notiert. Wenn diese in einer Webseite dargestellt werden soll, muss natürlich die Präsentations-Software entsprechende Softwaremodule und die Hardware die zugehörigen Komponenten (beispielsweise eine Soundkarte für akustische Daten) verfügbar haben.

Eine weitere wichtige Eigenschaft von HTML ist, Verbindungen zu anderen Internet-Diensten in eine Webseite aufnehmen zu können. Diese werden als Referenz in einer Webseite notiert, weshalb unter der Oberfläche des WWW viele Dienste wie E-Mail oder FTP verfügbar gemacht werden können. Es ist sogar eingeschränkt möglich, mit HTML Datenbankabfragen zu formulieren, die Resultate optisch aufzubereiten und Menüstrukturen aufzubauen. Auch Interaktion mit Anwendern ist - allerdings mit erheblichen Einschränkungen - in purem HTML zu realisieren.

Hinter der Normung von HTML stand und steht auch heute noch das World Wide Web- Consortium (W3C - http://www.w3.org) mit Sitz in Genf.

HTML beinhaltete in der Version 1.0 nur wenige der heute im Web zu findenden Möglichkeiten. Da bereits der Mosaic-Browser diverse eigene Features implementiert hatte, die von dem einfachen HTML-1.0-Standard stark abwichen, und sich der Browser (und noch einige andere grafische Browser) rasend schnell verbreitete, versuchte das W3C relativ zügig, einen um einige dieser neuen Möglichkeiten erweiterten HTML-Standard zu schaffen.

Der im November 1993 gestartete Versuch - ein Diskussionspapier mit dem Namen »HTML + Discussion Document« - konnte sich allerdings nicht als neuer Standard durchsetzen. Das W3C hatte sich bereits als Forum von unterschiedlichsten Interessengruppen von einer effektiven Arbeit verabschiedet. Erst im September 1995 konnte der nächste HTML-Standard, die Version 2.0, verabschiedet werden.

Dieser 2.0-Standard enthielt eine ganze Menge Gestaltungsmöglichkeiten für das WWW, die sich seit dem 1.0-Standard schon in diversen Browsern als zusätzliche Features etabliert hatten. Dazu gehörten unter anderem die Elemente der äußeren Dokumentenstruktur (zum Beispiel Kopfteil mit Meta- und Titelzeile, die Body-Struktur), verschiedene Arten der Überschrift, Hyperlinks, Hervorhebungen, Befehlsstrukturen zu einer flexiblen Grafikeinbindung, aber auch bereits Tabellen, Listen und Formulare. Dies waren nur ein Teil der potenziellen HTML-Möglichkeiten, denn durch die Trägheit des W3C (in Bezug auf das unglaublich dynamische Internet) hatten sich derweil verschiedenste Browser-spezifische Dialekte gebildet, unter denen eine Standardisierung des WWW auch heute noch krankt. Die nächste HTML-Version (3.0) wurde wegen der mangelnden Konsensfähigkeit der am W3C beteiligten Organisationen und Unternehmen nie offiziell verabschiedet. Allerdings war die Version 3.0 durch viele mehrfach vorhandene, aber syntaktisch unterschiedliche Anweisungen so aufgebläht, dass die in der Ende 1996 offiziell verabschiedete Version 3.2 vorgenommene Straffung dringend notwendig war. Zwar hatte HTML 3.> nicht mehr alle in 3.0 versuchten Möglichkeiten. Dafür wurde nun offiziell die Fähigkeit integriert, Objekte aus anderen Internet-Techniken in eine Webseite einzubauen. Insbesondere lassen sich seit dem 3.2-Standard Java-Applets in jede beliebige Webseite integrieren.

Der HTML-Standard 3.2 hatte ungefähr ein Jahr Bestand. Ende 1997 fand die offizielle Verabschiedung eines neuen HTML-4.0-Standards statt, der auch heute noch aktuell ist. Dieser neue HTML-Standard beinhaltet einige interessante Details, die in großen Teilen von der Java-Entwicklung beeinflusst wurden oder zumindest parallel dazu gehen.

Abbildung 2.2:  Der HTML-4.0-Standard wird auf den W3C-Seiten erstmals postuliert.

2.1.4 Die Organisation des Internets

Das Internet ist im besten Sinne ein chaotisches System. Das bedeutet, es gibt keine oberste Instanz, kein Kontrollorgan, keine Organisation zur Zensur. Zwar gehören einzelne Teile des Internets (Hosts, WANs, LANs, der private Rechner,...) irgendwelchen Besitzern, jedoch das ganze Netz selbst gehört niemandem. Es gibt keine zentrale Gesellschaft, die das Internet überwacht und lenkt.

Es existieren jedoch einige Gruppen und Organisationen, die sich mit Entwicklungen im Internet befassen, versuchen Standards zu definieren, Absprachen zur Kontrolle zu treffen und das Internet (in gewissen Grenzen) lenken. Sie sind allerdings auf relativ freiwillige Kooperation der Internet-Teilnehmer (vor allem der einflussreichen kommerziellen Unternehmen) angewiesen. Hier ist eine kleine Liste von wichtigen Organisationen (ohne Anspruch auf Vollständigkeit).

Bezeichnung Bedeutung Beschreibung
ISOC Internet Society Eine nicht-kommerzielle Vereinigung von freiwilligen Mitgliedern. Sie beschäftigt sich im Rahmen von diversen Unterorganisationen mit den unterschiedlichsten Aspekten des Internets. De facto ist sie das Management des Internets (http://www.isoc.org).
IAB Internet Architecture Board Diese Organisation (http://www.iab.org) hat die technische Entwicklung des Internets im Auge und ist in mehrere Gruppierungen unterteilt. Neue Technologien werden beobachtet und ggf. gefördert, neue Standards werden festgelegt. Dazu zählt als eine der wichtigsten Aktionen die Vergabe der IP-Adressen (vgl. folgenden Abschnitt).
DE-NIC Deutsches Network Information Center Für eine eindeutige Vergabe von Rechneradressen ist in jedem Land eine eigene Organisation verantwortlich. In Deutschland ist dies DE-NIC (http://www.denic.de).
W3C World Wide Web-Consortium Das W3C (http://www.w3c.org) mit Sitz in Genf ist für die Standards im WWW verantwortlich und hat sich mit diesem und HTML ein (Internet-)Denkmal geschaffen. Allerdings ist das W3C in vielen Bereichen eine zahnloser Tiger, denn die Browser-Hersteller kümmern sich oft nicht um die Empfehlungen des W3C.
NIC bzw. -InterNIC Internet Network Information Center Dies ist die internationale Dachorganisation der regionalen Vertretungen und die oberste Ebene zur Verwaltung von Domainnamen (http://www.internic.net).

Tabelle 2.1:   Organisationen   im Internet

2.1.5 Die Adressierung im Internet

Unbestritten ist das Internet ein äußerst großes und komplexes Gebilde. Mainframes, eigenständige Netzwerke, einzelne Rechner - alle sind zu dem Netz der Netze zusammengeschlossen. Wie finden Daten in solch einem scheinbaren Chaos den Weg vom Sender zum Empfänger? Und bei einer Anfrage den Weg wieder zurück? Für diese Weiterleitung von Daten gibt es im Internet spezielle Server mit Adressinformationen und einer Weiterleitungsfunktionalität - so genannte Router. Router erledigen die Weiterleitung von Daten durch das Netz, indem sie ein Datenpaket jeweils in die optimale Richtung schicken, damit das Datenpaket dem Ziel »näherkommt«. Wenn die kürzeste Wegstrecke jedoch verstopft ist (also fast immer :-)), kann die optimale Wegstrecke ein Datenpaket physikalisch vom Ziel entfernen. »Näherkommen« ist also in Bezug auf die Ankunftszeit zu sehen und irgendwann kommen die meisten Daten beim Adressat dann doch an. Wie aber sieht die Verarbeitung von Adressinformationen auf den Routern aus? In einem derartig komplizierten Computernetzwerk ist eine Orientierung und Navigation nur dann möglich, wenn es dort ein eindeutiges Adresskonzept gibt. Dabei müssen sowohl die einzelnen Rechner, aber auch die Softwarebestandteile eindeutige Adressen haben.

2.1.6 Die IP-Nummern

Zunächst zu den Computern selbst: Für jeden einzelnen Rechner innerhalb eines Netzwerks muss eine eindeutige Zuordnung existieren. Dies gilt selbstverständlich auf für das Internet. Diese Zuordnung geschieht im Internet über eine eindeutige Adresse, die unter dem Transportprotokoll TCP/IP genau vier Byte lang ist. Sie wird als IP-Nummer bezeichnet. Da in einem Byte 256 verschiedene Zeichen binär dargestellt werden können (2 hoch 8 = 256), lässt sich in jedem der vier Byte eine Zahl zwischen 0 und 255 verschlüsseln. Insgesamt sind so also rein theoretisch 4.294.967.296 (256 hoch 4) Computer im Internet adressierbar. Gewöhnlich werden die IP-Nummern im Dezimalsystem darstellt und jedes Byte mit einem Punkt abgetrennt (zur besseren Lesbarkeit).

Eine fiktive IP-Nummer eines Host wäre also so darstellbar: 123.187.111.189

Das Adresskonzept der IP-Nummern sieht eine Gliederung der vier Byte in logische Abschnitte vor. Die Gliederung ist hierarchisch und in zwei wesentliche logische Abschnitte unterteilt. Der erste Teil der vier Byte ist die eindeutige Adresse eines Netzwerks, das mit dem Internet verbunden ist (der so genannte Netzwerkidentifikator). Der zweite Teil ist die eindeutige Adresse des einzelnen Rechners innerhalb dieses von dem ersten Byte eindeutig bestimmten lokalen Netzwerks (Hostidentifikator). Ein Datenpaket wird nur dann in einem lokalen Netzwerk weitergeroutet, wenn der Netzwerkidentifikator korrekt ist.

Wie viele Bytes dabei für die Adresse des Netzwerks und wie viele Bytes für die Adresse des einzelnen Rechners verwendet werden, ist vom Typ des Netzwerks, d.h. der Größe des lokalen Netzwerks, abhängig. Ein weltweit gültiges Regelwerk sorgt für die eindeutige Zuordnung und Klassifizierung. Zwar klingt das im ersten Moment ziemlich kompliziert und willkürlich, es ist dennoch gut durchdacht und bei näherem Hinsehen logisch. Lokale Netzwerke werden im Internet in drei Klassen unterteilt.

  • Klasse-C-Netz: Das kleinste Netzwerk. Für die Adresse dieses Netzwerks im Internet werden die ersten drei Bytes der IP-Nummer herangezogen. Da dann nur noch ein Byte für die Adressen der einzelnen Rechner innerhalb dieses lokalen Netzwerks übrig ist, ergibt sich zwingend die maximale Größe diese Netzwerktyps. Maximal 256 Rechner sind innerhalb eines C-Netzes theoretisch adressierbar. Davon gehen dann zwei reservierte Nummern noch ab.
  • Klasse-B-Netz. Das B-Netz benutzt die ersten zwei Bytes für Adresse des Netzwerks innerhalb des Internets. Die übrigen zwei Bytes werden für eine Adressierung im lokalen Netz verwendet. Also stehen darin dann maximal 65.536 (256 * 256) eigenständige Rechneradressen im Rahmen der lokalen Netzwerks zur Verfügung (wieder abzüglich zweier reservierter Nummern, was die verfügbaren Hosts auf 65.534 reduziert).
  • Klasse-A-Netz: Das A-Netz kann die größte Anzahl von Rechnern beinhalten. Hier wird als konkrete Netzwerkadresse nur noch ein Byte genommen. Damit stehen drei Bytes zur lokalen Adressierung zur Verfügung (in der Realität bedeutet das 16.777.214 verfügbare Hostadressen pro Netzwerk).

Wann eine IP-Adresse welchem Typ zuzuordnen ist, wird durch ein Konzept von Zahlengruppen festgelegt, die das erste Byte betreffen. Es muss ja eindeutig festgelegt sein, ob das zweite und dritte Byte bereits den lokalen Rechner adressiert. Das erste Byte von einem Klasse-A-Netz hat immer einen Wert zwischen 1 und 126. Dementsprechend gibt es maximal 126 verfügbare Netzwerke dieser Klasse. Der B-Netz-Bereich geht von 128 bis 191 (daraus resultieren maximal 16.3841 verfügbare Adressen für B-Netzwerke) und der Wert des ersten Byte von einem C-Netz liegt zwischen 192 und 223, was maximal über zwei Millionen verfügbare Adressen für C-Netzwerke bedeutet. Außer den Nummernkreisen ist keine andere Zuordnung festgelegt.

Die Lücken in den Nummernkreisen sind für diverse Sondernetze reserviert. So entspricht die IP-Nummer 127.0.0.0 immer dem lokalen Host in einem Netzwerk. Aber auch einige Nummern, die mit einem der gerade beschriebenen Werten anfangen, werden nicht im Internet verwendet. IP-Nummern, die mit 192.168 beginnen, sind für lokale Adressierungen innerhalb eines Intranets reserviert.

Durch die hierarchische Struktur der IP-Nummern wird ein Datenblock auf seinem Weg vom Sender zum Empfänger von einem Router zuerst nur in eine Grobrichtung weitergeleitet, die sich aus der ersten logischen Adressangabe (je nach Klasse dem ersten, den ersten beiden oder den ersten drei Bytes) ergibt. Erst wenn der Datenblock an dem Router angekommen ist, zu dem das lokale Netzwerk gehört, werden die genauen Adressangaben von innerhalb des Netzes liegenden Adress-Servern ausgewertet.

Es gibt Überlegungen, das Adressierungskonzept zu erweitern, denn die Anzahl der Rechner und sonstigen Geräte mit Internetkontakt droht den Adressvorrat zu sprengen. Diskutiert wird eine abwärtskompatible Erweiterung der IP-Nummern auf 128 Bit.

2.1.7 Das DNS-Konzept

Bei fast allen Datenübermittlungen im Internet werden IP-Nummern verwendet, obwohl Anwender sie selten sehen. IP-Nummern sind zwar hervorragend dazu geeignet, in kompakter und eindeutiger Form eine Adressierung von Rechnern vorzunehmen, jedoch für Menschen sind diese abstrakten Zahlenkolonnen oft lästig. Aus diesem Grund wurde den Zahlencodes zusätzlich ein eindeutiger Alias-Name zugeordnet und diese Zuordnung weltweit auf speziellen Namensservern dokumentiert.

In Gegensatz zu der Zuordnung der IP-Nummern auf Grund der Größe der Netzwerktopologie erfolgt die Vergabe der eindeutigen Namen nicht über irgendwelche Größenangaben oder sonstige topologische Eigenschaften, sondern ist ein System von logisch und inhaltlich zusammengehörigen Rechnergruppen.

Dennoch ist auch dieses Namensystem hierarchisch geordnet. Logisch zusammengehörende Bereiche werden Domain genannt, woraus sich der Name für dieses Namenssystem ableiten lässt: Domain-Name-System, kurz DNS. Genau wie bei den IP-Nummern werden die einzelnen Bestandteile eines DNS-Namens mit Punkten getrennt, die hierarchische Wertigkeit der Stufen ist jedoch umgekehrt, also von hinten nach vorne zu lesen. Der hinterste Teil eines solchen Alias-Namens stellt die gröbste logische beziehungsweise inhaltliche Einteilung da (die so genannte Top Level Domain), etwa eine Nation oder eine Organisationsform. Der unter Umständen zweiteilige Mittelteil (die so genannte Local Level Domain (Teil 1 des Mittelteils) und die Second Level Domain (Teil 2 des Mittelteils - von hinten gelesen) ist eine genaue Beschreibung des Rechnerverbandes bzw. des Rechners selbst. Der vorderste Teil bezeichnet direkt den einzelnen Server auf einem Rechner bzw. Rechnerverband.

Wenn Sie in einem Browser bei der Kontaktaufnahme zu einem Server die Statuszeile im Auge behalten, werden Sie dort kurz die IP-Nummer sehen, auch wenn Sie im Adresseingabefeld des Browsers oder beim Klick auf den Hyperlink nur den DNS-Namen verwendet haben.

Gültige Alias-Namen (rein fiktiv) für eine Adressangabe in diesem DNS-Konzept sind:

ftp.cs.tu-muenchen.de
www.rjs.de
webscripting.de
java.sun.com
www.mut.de

Der hinterste Teil des DNS-Namens wird für Rechner, die ihren Standort in den USA haben, seit Beginn des Internets nach einem eigenen Regelwerk ausgewählt. In der Regel erfolgt kein direkter Hinweis auf die Nation. Es gibt in diesem nur in den USA gültigen (was bedeuten soll, die Rechner sind dort registriert, adressiert werden können sie von überall her und auch die physikalische Präsens ist davon unberührt) Regelwerk nur sechs (sieben mit dem nachfolgend letztgenannten Spezialfall) logische Bereiche, in die alle Computer in den USA unterteilt werden (daher ist die Nation implizit klar). In der folgenden Tabelle sind sie alphabetisch aufgelistet.

Name des -Bereichs Abkürzung für Bedeutung
com commercial Alle von kommerziellen Unternehmen betriebenen Rechner
edu educational Rechner von Ausbildungsinstitutionen (Universitäten, Schulen usw.)
gov government Regierungsbehörden
mil military Militärische Computer
org organization Rechner von nicht kommerziellen Organisationen
net network Organisationen, die ein eigenes Netzwerk betreiben
arpa Advanced Research Projects Agency Die Gründungsorganisation des Internets hat eine eigene Sonderform für ihre Top Level Domain. Sie gilt nur für diese Organisation.

Tabelle 2.2:   Top-Level in   den USA

Beispiele für gültige Namen für Rechner in den USA sind:

altavista.digital.com
www.webcrawler.com
ourworld.compuserve.com

Ende 2000 wurde eine Erweiterung der Top-Level-Domains vorgenommen. Beschlossen wurden info (einzig offene neue Erweiterung. Markennamen werden bevorzugt), name (Domain-Erweiterung für Namen von privaten Personen, nur in Verbindung von Vor- und Nachname), pro (Freiberufler), biz (kommerzielle Unternehmen; Alternative zu com), museum (Museen), aero (Unternehmen der Luftfahrt) und coop (genossenschaftliche Unternehmen)

Außerhalb den USA werden die Top Level Domain-Namen als Abkürzungen für die Ländernamen genommen. Diese Ländercodes sind in der ISO-3166-Norm (http://www.din.de/gremien/nas/nabd/iso3166ma/) festgelegt. Ein paar wichtige Beispiele folgen:

Top Level Domain Abkürzung für
at Österreich
au Australien
be Belgien
br Brasilien
ca Kanada
ch Schweiz
de Deutschland
dk Dänemark
es Spanien
fr Frankreich
gr Griechenland
hk Hongkong
il Israel
mx Mexiko
nl Niederlande
no Norwegen
pl Polen
pt Portugal
ru Russland
se Schweden
tr Türkei
uk Großbritannien
za Südafrika

Tabelle 2.3:   Top-Level außerhalb der USA

Für die USA ist die Top Level Domain us reserviert, obwohl dort ein anderes Konzept priorisiert wird.

Wie wir bereits diskutiert haben, verwendet das TCP/IP-Protokoll IP-Nummern zur Adressierung. Die DNS-Namen müssen durch spezielle Namens-Server erst in die zugehörigen IP-Nummern übersetzt werden. Da das Internet so groß und komplex ist, übersteigen die gesamten Alias-Namen die Kapazität eines einzelnen Namens-Servers. Sofern ein Alias-Name nicht auf dem zuerst kontaktierten Namens-Server zuzuordnen ist, wird entsprechend der Namenshierarchie in einem komplexen Verfahren der Übersetzungsauftrag an andere Namens-Server weitergeroutet, bis die IP-Nummer vollständig ermittelt ist.

2.1.8 Uniform Resource Locator

Computer sind über die IP-Nummern beziehungsweise ihre Alias-Namen eindeutig adressiert. Innerhalb des Internets müssen aber alle Daten und Programme in Form von unverwechselbaren Internetadressen adressiert werden. Dabei werden neben der Rechneradresse zusätzlich einige andere Angaben notwendig.

Der Name dieser Internetadressen für konkrete Adressanfragen an Dokumente (im weitesten Sinn) im Internet lautet URL und steht für Uniform Resource Locator, was übersetzt ins Deutsche ungefähr »einheitliches Adressierungsschema für Objekte im Internet« bedeutet (ziemlich ungünstige Übersetzung, aber leider üblich und abgesehen vom Klang recht treffend). Einheitlich deshalb, weil mit einer URL sowohl verschiedenen Dienste wie WWW, FTP, Gopher usw. als auch Rechner selbst oder direkt Dokumente beschrieben werden können.

Der Begriff Objekt steht in diesem Zusammenhang für so ziemlich alles, was Sie im Netz finden. Die exakte Schreibweise ist je nach Dienstprotokoll leicht unterschiedlich, sieht jedoch in der Regel folgendermaßen aus:

<Dienstprotokoll>://<host.domain:port></pfad></datei>

  • Dienstprotokoll steht beispielsweise für http, ftp, gopher, news, mailto oder wais. Danach folgt ein Doppelpunkt und fast immer zwei Schrägstriche zur Abtrennung (eine Ausnahme ist mailto).
  • Mit host.domain wird ein Server im Internet adressiert. Dabei kann direkt die IP-Nummer eingegeben werden, was jedoch nicht üblich ist. Meist nimmt man dafür den DNS-Namen in der Form
    Server.{LocalDomain}.SecondLevelDomain.TopLevelDomain
  • Auf einem Internet-Rechner kann unter einem Namen (also der DNS-Angabe ohne den Server) eine ganze Reihe von verschiedenen Diensten parallel betrieben werden (üblich sind z.B. ein FTP-Server und ein HTTP-Server). Um auf einem ausgewählten Rechner den gewünschten Dienst zu erreichen, benötigt man oft eine weitere Information, den so genannten Port bzw. Kanal. Innerhalb des TCP-Headers steht ein zwei Byte großes Flag für Port-Nummern zur Verfügung. Damit sind 65.536 numerische Werte möglich (2 hoch 16). Die Port-Adressen 0 bis 1.023 sind dabei reserviert. Sie sind vordefinierten Diensten zugewiesen (well-known ports). Port-Adressen über 1023 sind aber durchaus möglich. Welcher Dienst darüber angesprochen werden soll liegt in der Verantwortung des Anbieters. Das bedeutet, nahezu jeder Internet-Dienst hat einen Defaultwert, der immer dann verwendet wird, wenn man in einem URL keinen Port notiert. In der Regel braucht deshalb der Port nicht explizit angegeben zu werden. Der Default-Port für zum Beispiel einen HTTP-Server ist 80, ein FTP-Server hat den Port 21, Gopher benutzt den Port 70. Es ist allerdings möglich, die Ports für bestimmte Zwecke zu manipulieren, d.h. es ist optional möglich, in dem URL mit :port festzulegen, auf welchem Kanal dieser Server angesprochen werden soll.
  • Das genaue Objekt, das mit einer DNS-Angabe referenziert werden soll, verbirgt sich hinter der Angabe </pfad></datei>. Dies ist eine übliche Pfad- und Dateiangabe im Rahmen der Verzeichnisstrukturen eines Rechners. Beachten Sie, dass diese gesamten Angaben von Unix abstammen und deshalb als Trennzeichen kein Backslash (wie unter DOS oder Windows), sondern Slash verwendet wird.

2.2 Die Geschichte von Java

Die Geschichte von Java geht bis ins Jahr 1990 zurück, in die Labors der amerikanischen Firma Sun Microsystem. Sun war (und ist) einer der führenden Hersteller von Workstations. Die Sun-Workstations basieren auf dem Unix-Betriebssystem Solaris und Sparc-Prozessoren.

Abbildung 2.3:  Die Sun-Homepage

Die Geschäfte der Firma Sun mit Workstations und Mainframes liefen zu dieser Zeit zwar gut, aber Sun-PCs waren eigentlich nicht richtig konkurrenzfähig. Als Reaktion auf den drohenden Einbruch im PC-Markt rief Scott McNealy, der Sun-Chef, auf Anraten eines seiner Programmierer - Patrick Naughton - eine Entwicklergruppe mit Namen »Green« ins Leben, dessen zentrale Mitarbeiter neben Naughton James Gosling und Mike Sheridan waren. In dem hochgeheimen Projekt - niemand außer den obersten Führungskräften von Sun wusste in der Anfangsphase Bescheid - sollte der zukünftige Bedarf an EDV analysiert werden, um einen zukunftsträchtigen Markt für Sun zu lokalisieren. Haupterkenntnis des Green-Projektes war, dass die Computerzukunft nicht im Bereich der Großrechner (soweit nichts Besonderes, denn dies ahnten auch damals schon andere), jedoch auch nicht unbedingt bei den PCs zu sehen ist (und dies war neu und nicht unumstritten). Der Consumerbereich der allgemeinen Elektronik (Telefone, Videorecorder, Waschmaschinen, Kaffeemaschinen und eigentlich alle elektrischen Maschinen, die Daten benötigten) war nach Ansicht des Green-Projektes der Zukunftsmarkt der EDV. Wichtigste Forderungen an ein neues, vollkommen plattformunabhängiges Betriebssystem für dieses Einsatzfeld waren eine erheblich größere Fehlertoleranz, eine leichtere Bedienbarkeit und eine bedeutend bessere Stabilität als bei bisherigen Betriebssystemen.

Im Frühjahr 1991 entwickelte sich aus den Planungen ein konkretes Projekt zur Generierung eines Prototyps für ein solches universales Betriebssystem. Ab August 1991 wurde - hauptsächlich von James Gosling - nach einer geeigneten Programmiersprache dafür gesucht. Allerdings entschieden sich die Green-Entwickler nicht für eine bereits existierende Programmiersprache, denn diese wiesen zu große Schwächen in Hinblick auf die Stabilität auf. Gerade bei Bedienerfehlern - und diese gestand man beim Green-Projekt der potenziellen Zielgruppe, Consumer, im Gegensatz zur gängigen Praxis bei Computeranwendern einfach zu - waren diese Programme einfach zu intolerant. Eine neue, plattformunabhängige und objektorientierte Sprache musste entwickelt werden. Der Name für diese neue Sprache? Nein, noch nicht Java. Oak - zu deutsch Eiche. Warum Oak? Bekannt ist das Gerücht, dass James Gosling einfach kein passender Name einfiel und er beim Brüten über neue Namen permanent auf eine imposante Eiche vor seinem Büro geblickt haben soll. Eine etwas andere Variante verlegt die Eiche in ein an der Wand hängendes Bild. Dieses ist aber alles inoffiziell und sicher nicht so wichtig. Eine seriöse Erklärung für Oak ist, dass es die Abkürzung für »Object Application Kernel« war. Allerdings findet man diesen Begriff in offiziellen Sun-Quellen nicht sofort, was wohl damit zusammenhängt, dass Sun sich nicht so gerne an Oak erinnert (dazu gleich mehr). 1992 präsentierte das Green-Team der Sun-Führung mit Duke, einer kleinen Trickfigur in einem virtuellen Haus, das erste Ergebnis. Und Duke überzeugte. Ein Sun-Tochterunternehmen namens First Person (im Prinzip das Green-Projekt, aber als unabhängige Firma) wurde gegründet, um das Projekt weiter zu entwickeln und der Öffentlichkeit sowie der Elektronik- und Unterhaltungsindustrie bekannt zu machen. Die Zeit war allerdings noch nicht reif für die neue Technik, die ersten Kontakte verliefen im Sand und First Person verzettelte sich zusätzlich in viele Kleinexperimente. 1994 verschwanden Oak und First Person wieder in der Versenkung und das Green-Team kehrte zurück zu Sun. Dann aber bewahrte ein anderes Ereignis Oak vor dem völligen Vergessen - der legendäre Mosaic-Browser. Dieser hatte sich mittlerweile als eine feste Größe im Internet etabliert und mit seinen Möglichkeiten wurde plötzlich das heterogene Internet zu einer möglichen Zielplattform für Oak. William Joy, einem Mitbegründer von Sun, ist es zu verdanken, dass Oak Ende 1994 für das Internet umgearbeitet wurde und zudem entsprechend dem gerade vorexerzierten Netscape-Geschäftsmodell über das Netz frei und umsonst verteilt wurde. Die geniale Theorie hinter diesem besagten Netscape-Geschäftsmodell heißt, Marktanteile ohne Gewinn zu erobern, um dann einen Standard festlegen zu können. Kassiert wird danach. 1995 war es soweit - Oak war zum großen Auftritt im Internet bereit. Allerdings musste aus zwei Gründen ein neuer Name gefunden werden. Marketinggründe waren der eine. Oak war ob der gescheiterten Experimente zu negativ belastet. Es gab gleichfalls juristische Schwierigkeiten, denn der Name Oak war einem anderen Produkt zu ähnlich. Und wieder war die Namensgebung eine schwierige Geburt. Man konnte sich nicht auf einen Namen einigen. Dem Gerücht nach wurde der Name dann außerhalb des eigentlichen Brainstormings in der Cafeteria gefunden. JAVA! Der Name Java ist in Amerika - wie inzwischen wohl allgemein bekannt - eine Bezeichnung (eigentlich altenglisch) für das wichtigste Grundnahrungsmittel von Programmierern: Kaffee, heißen, sehr heißen Kaffee (und ist natürlich ebenfalls eine Insel in Indonesien).

2.2.1 Erstes Java-Auftreten, HotJava und das JDK 1.0

Im März 1995 präsentierte Sun Java und das zugehörige Paket von Entwicklungs-Tools (das JDK) der breiten Internet-Öffentlichkeit. Java schlug dort bekanntlich wie eine Bombe ein. In einem Atemzug mit Java wird bei diesem Datum oft der Begriff HotJava genannt.

Erst die Kombination mit HotJava verschaffte Java die gebührende Aufmerksamkeit. HotJava war die erste komplexe und vollständig in Java geschriebene Anwendung und naheliegenderweise der erste Java-fähige Browser. Und damit die Präsentationsplattform für die ersten Java-Applets. Zudem war er eine wesentliche Ergänzung der ersten Java-Entwicklungstools von Sun - dem Java Development Kit 1.0 oder kurz JDK 1.0 (HotJava gehörte und gehört immer noch nicht zu dem JDK). Dieses Development Kit soll in der neuesten Version2 natürlich noch ausführliches Thema dieses Buchs sein.

Kurz nach Präsentation des JDK 1.0 wurde von der Sun-Tochter Sunsoft mit dem Java-Workshop ein kommerzielles Entwicklungspaket nachgeschoben. Dieser war wie der HotJava-Browser vollständig in Java geschrieben und damit plattformunabhängig. Außerdem bot der Java-Workshop gegenüber dem frei verfügbaren Java Developement Kit statt einer kommandozeilenorientierten Shell, rudimentären Test- und Debug-Möglichkeiten sowie einem Referenzcompiler bereits eine integrierte Entwicklungsumgebung mit Editor, Browser, Project-, Portfolio- und Build-Manager, Debugger, Project-Tester und Online-Hilfe.

Abbildung 2.4:  Der 1. Java-Workshop von Sunsoft

Andere Hersteller sollten schnell folgen und heute gibt es eine Vielzahl von integrierten Java-Entwicklungsumgebungen. Alle basieren jedoch auf dem JDK. Meist direkt, indem sie die Tools des JDK einfach aufrufen, oder indirekt, indem sie die Funktionalitäten nachbilden. Natürlich gab es im ersten JDK diverse kleinere Kinderkrankheiten. Einige betrafen die Sicherheit, andere fehlende Funktionalitäten.

Dies ist für ein vollkommen neues Produkt verständlich (und leider in der Softwarebranche üblich, wie die permanenten Schnellschüsse Windows oder die verschiedenen Office-Pakete sehr drastisch zeigen) und dürfen auf keinen Fall als Kritikpunkte an Java missbraucht werden. 1997 folgte deshalb nach einigen kleinen Zwischenversionen das erste bedeutende Update mit der Version 1.1 des JDK, der diverse kleinere Verbesserungen folgen sollten. Neben den für Updates üblichen Fehlerbereinigungen enthielten die Versionen 1.1.x einige entscheidende Neuerungen. Diese machten eine ganze Reihe von neuen Tools für das Java-SDK (Software Development Kit) nötig. Bestehende Tools wurde vielfach überarbeitet und sowohl im Layout als auch im Funktionsumfang verändert.

Bereits Ende 1997 gab es dann die ersten Betaversionen zum JDK 1.2 und Java 1.2, wie nach den damaligen Veröffentlichungen die komplette Plattform heißen sollte. Das Final wurde für das erste, spätestens aber das zweite Quartal 1998 angekündigt. Daraus wurde jedoch nichts. Die Einführung von Java 1.2 und JDK 1.2 wurde immer wieder verschoben. Insgesamt vier Betaversionen fanden den Weg in die Öffentlichkeit. Diese erwiesen sich als recht stabil und allgemein wurde fast täglich die Freigabe der Finalversion erwartet. Aber erst im Dezember 1998 ließ Sun gleich zweimal eine Bombe platzen. Am 4. Dezember 1998 hatte Sun endlich die Finalversion des JDK 1.2 freigegeben. Pikanterweise erfolgte dies unmittelbar, nachdem im Rahmen des Rechtsstreits mit Microsoft um Java die Redmonder eine erneute Niederlage hinnehmen mussten. Ein Schelm, wer vermutet, Sun nutzte die Aufmerksamkeit, um die Beachtung der neuen Java-Plattform zu erhöhen. Die zweite Bombe explodierte kurz danach auf der Java Business Expo. Nicht nur ein neues JDK, sondern ein vollständiges Plattform-Update unter dem Namen Java 2.0 wurde dort offenbart. Entgegen der allgemeinen Erwartung wurde das vollständige Update nicht als Version 1.2 in Umlauf gebracht. Mitte 2000 erschien dann das JDK 1.3, das das JDK 1.2 im Rahmen der Java-2-Plattform ablöste. Die gesamte Plattform wird aber immer noch Java 2 genannt.

2.2.2 Was macht Java so einzigartig?

Im Gegensatz zu HTML ist Java das Produkt einer Organisation, nicht eines Konsortiums von unterschiedlichsten Interessengruppen. Zudem ist Java vollkommen neu entwickelt worden und muss sich nicht mit Altlasten rumplagen, wie es beispielsweise C++ tun muss. Statt sich immer auf den kleinsten Nenner einigen zu müssen, konnten relativ leicht innovative Ideen und Denkansätze verfolgt und realisiert werden. Dies ist sicher ein Baustein für Erfolg und Leistungsfähigkeit von Java.

Ein weiterer Baustein ist das Umfeld, in dem Java das erste Mal präsentiert wurde. Beim Auftreten von Java gab es einige Merkmale für den einschlagenden Triumph. Dabei waren es für verschiedene Gruppen von Leuten durchaus unterschiedliche Aspekte, die Java zu dem durchschlagenden Erfolg verhalfen.

Für die reinen Anwender waren es sicher im Wesentlichen zwei Dinge: grafische, dreidimensionale Animationen und Interaktionsmöglichkeiten von Internet-Anwendern. Das Auftreten von Java und etwas später seinem Skript-Ableger JavaScript kam für Internet-Anwender einer Revolution gleich. Dem WWW (von den zeilen- oder Menü-orientieren Diensten ganz zu schweigen) fehlten, mit dem bis zu diesem Zeitpunkt realisierten Stand von HTML, einige ganz entscheidende Merkmale: eine dreidimensionale Darstellung von Objekten, eine bewegte Animation und die Möglichkeit einer vernünftigen Interaktion mit dem Anwender. Java rannte mit seinen Multimedia- und Interaktionseigenschaften schon lange geöffnete Türen ein.

Die ziemlich eingeschränkten Interaktionsmöglichkeiten von WWW-Surfern beruhten bis dahin im Wesentlichen auf so genannten Hotspots, sensitiven Elementen auf HTML-Seiten, die beim Anklicken eine Aktion auslösten. Bei der Mausaktion »Klick« muss bei Hotspots die Cursorposition ausgewertet und zum Server zurückgeschickt werden (wie auch immer technisch realisiert). Aber auch eine Tastatureingabe des Anwenders auf einer Webseite musste zum Server übermittelt werden. Auf dem Server wurde die Eingabe verarbeitet und eine neue HTML-Seite zurück zum Client geschickt. Dieser Mechanismus wird CGI (Common Gateway Interface) genannt. Die größte Arbeitslast liegt bei den Servern und den Leitungen des Internets. Der Client steht relativ ungenutzt herum und wartet (meist sehr, sehr lange).

Der Ansatz von Java für die Optimierung dieser Vorgänge lag darin, dem Prozessor des Clients einen Teil der Arbeit zu übertragen. Denn obwohl die Rechner der Internet-Anwender immer leistungsfähiger wurden, lagen sie für die Internet-Arbeit normalerweise ziemlich brach. Der Client wurde zum dummen Terminal aus grauer Großrechner-Urzeit degradiert. Es war eigentlich absolut unlogisch, einen Hochleistungs-PC oder einen vergleichbaren Rechner als Client zu verwenden und ihn mit Aufgaben zu betrauen, die ein ZX81 (Kultrechner Anfang bis Mitte der 80er-Jahre mit Folientastatur und 1-16 KByte Hauptspeicher) zur Not noch zu Wege gebracht hätte. Java-Applets sorgten also mit einer Arbeitsverlagerung auf den Client für Aufsehen.

Das zweite Java-Highlight für die Anwender - die neuen Darstellungsmöglichkeiten - sorgte zum ersten Mal für echtes Multimedia im Internet. Als Java der Öffentlichkeit präsentiert wurde, fanden Anwender bis dahin beim Surfen nur passive Seiten (zudem noch zweidimensional) vor, die weitgehend in HTML 1.0 oder 2.0 geschrieben waren. Selbst wenn es Texte mit Hyperlinks waren und recht komfortabel Effekte wie Grafiken oder Sounds eingebunden werden konnten, die Einschränkung »Text« blieb. Insbesondere die dreidimensionale Darstellung von Objekten war damit nicht zu realisieren. Genauso wenig eine bewegte Animation. Mit Java änderte sich die Situation schlagartig, die dritte Dimension hielt bewegend Einzug ins Netz.

Für die EDV-Spezialisten gab es neben diesen beiden offensichtlichen Knallern jedoch noch andere Gründe. Ein oft genannter Grund ist, dass Java ohne Mitwirkung des »Reichs des Bösen« (liebevoller Kosename für Microsoft - zumindest von allen Nicht-Microsoft-Abhängigen) entstanden ist. Da gab es etwas Neues, Revolutionäres, Innovatives und Bill Gates war nicht dabei. Nicht nur das, Microsoft schätzte als einziges wichtiges EDV-Unternehmen die Internetentwicklung zu dieser Zeit vollkommen falsch ein und ignorierte die ungeheuren Zukunftsperspektiven. Eine in der Computerwelt zu diesem Zeitpunkt einmalige Chance für andere/neue Unternehmen, EDV-Entwicklung zu gestalten, ohne von Microsoft die Richtung angezeigt zu bekommen. Firmen wie Sun oder Netscape nutzten die Gunst der Stunde.

Bald aber hatte Microsoft seine erste Fehleinschätzung revidiert und sich mit Vehemenz in Entwicklungsprojekte rund um das Internet gestürzt. Allerdings schien es lange so, als ob sich Microsoft bei Java ziemlich kooperativ verhalten wollte. Die Partnerschaft mit Apple bzgl. der JVM- und JRE-Entwicklung (JRE - Java Runtime Environment) signalisierten Kooperationsbereitschaft mit anderen Unternehmen. Diverse Aktionen von Microsoft in der jüngeren Vergangenheit verstärkten jedoch wieder die Befürchtungen der Anti-MS-Gemeinde, Bill Gates wolle doch Java und das Internet umarmen und verschlingen. Dazu zählt beispielsweise die Weigerung von Microsoft, die Java Foundation Classes, die Klassenbibliothek zur Erstellung grafischer Oberflächen, als Bestandteil der Sprache Java anzusehen. Damit wähnt sich Microsoft natürlich frei von etwaigen Lizenzbestimmungen, die Microsoft dazu verpflichten würden, die JFC mit jeder Java-VM auszuliefern - und damit in den Internet Explorer und Windows zu integrieren. Microsoft entwickelte statt dessen zwei Gegenentwürfe: Die eigenen AWT-Klassen und J/Direct (Teil der Direct-Technologie von Microsoft), das es Java-Programmen erlaubt, Windows-Routinen zu nutzen. Beides natürlich plattformabhängig an Windows gebunden. Dies und diverse andere Aktionen führten zu mehreren Rechtsstreitigkeiten zwischen Sun und Microsoft, wobei Sun die meisten gewonnen hat. Insbesondere hat Sun erreicht, dass bestimmte Microsoft-Produkte das Java-Logo nicht führen dürfen, wenn sie nicht den Sun-Vorgaben entsprechen.

Aber zurück zu den Erfolgsfaktoren von Java: Die Java-Eigenschaften Objektorientiertheit und Plattformunabhängigkeit waren die weiteren und wohl wichtigsten Gründe für den Erfolg. Und last but not least - die extreme Stabilität von Java.

2.2.3 Die Herkunft von Java

Java hat - wie jedes gute Kind - offiziell zwei Elternteile. Die Syntax ist im Wesentlichen eine an C/C++ angelehnte Programmiersprache, die Konzeption und die Objektorientiertheit stammen eher von dem anderen Elternteil - Small Talk. Als »Trauzeugen« werden ab und zu noch Eiffel und Objective-C genannt.

Warum aber ist Java so erfolgreich? Eigentlich war es ein einfaches Rezept: Es wurden die Stärken der Vorfahren genommen, die Schwächen ausgemerzt und dann fehlende, sinnvolle Innovationen hinzugefügt. Zwar war einer der Java-Ahnen sowieso objektorientiert (Small Talk), jedoch kaum verbreitet. Dies liegt wohl in der vollständigen Andersartigkeit von Small Talk (gegenüber anderen Programmiersprachen wie C, PASCAL, Basic, COBOL oder FORTRAN). Small Talk ist zwar sehr leicht zu erlernen, jedoch einfach nicht mit gewohnten Befehlsstrukturen vergleichbar. Zumindest aus damaliger Sicht. Java macht nicht den Fehler von Small Talk und vermeidet ein gänzlich neues Befehlskonzept, sondern definiert sich von der Syntax eigentlich als eine Art bessere Untermenge von C++. Der Umstieg von C/C++ auf Java stellt also für die meisten Entwickler keinen großen Aufwand dar.

Von dem anderen Elternteil C/C++ hat sich Java zwar die Syntax geliehen, aber diverser C/C++-Altlasten entledigt und ist erheblich einfacher geworden, ohne viel an Leistungsfähigkeit gegenüber C/C++ zu verlieren. Dies betrifft einmal die Objektorientierung. Obwohl man mit C/C++ objektorientiert programmieren kann, hatte die überwiegende Mehrzahl der Programmierer C/C++ nie so eingesetzt. Die Möglichkeit des prozeduralen (altbekannten) Programmierens untergräbt bei C/C++ den strengen objektorientierten Gedanken. Java lässt einem Programmierer diese Wahl nicht. Man kann nur objektorientiert programmieren. Aber im Gegensatz zu C++ wurde keine Mehrfachvererbung realisiert, was Java-Programme viel besser wartbar macht. Ein weiterer Vorteil von Java gegenüber C/C++ ist, dass die Java-Syntax weniger kompliziert ist. Dies betrifft im Wesentlichen ziemlich üble C/C++-Möglichkeiten wie Zeiger, Operator-Overloading, manuelle Speicherverwaltung (d.h. das Speichermanagement, also das Beschaffen und das Freigeben von Speicher durch den Programmierer), automatische Konvertierung von Datentypen, Headerdateien, Pre-Prozessoren, Strukturen, Variant-Datentypen und multidimensionale Arrays. Auf die genauen Unterschiede soll an einer anderen Stelle im Buch eingegangen werden.

Insbesondere sollte Java nach Erwartung der Java-Väter (und Mütter) einige der wichtigsten Probleme moderner Programmierung lösen. Kernprinzipien von Java sollten die Eigenschaften kompakt, zuverlässig, portierbar, dezentral, echtzeitfähig und integriert sein. Die offizielle Definition von Sun Microsystems zu Java lautet folgendermaßen:

Java: eine einfache, objektorientierte, dezentrale, interpretierte, stabil laufende, sichere, architekturneutrale, portierbare und dynamische Sprache, die Hochgeschwindigkeits- Anwendungen und Multithreading unterstützt.

Im Einzelnen bedeutet dies:

  • Java ist einfach, obwohl sehr nahe an der (ziemlich komplizierten) C/C++-Syntax entworfen wurde. Dadurch soll Java für C/C++-Progammierer schon auf den ersten Blick vertraut und verständlich sein und damit die Einarbeitungszeit kurz halten. Dass Java einfach zu erlernen ist (wie Sun behauptet), dem werden jedoch vor allem Programmieranfänger wohl trotzdem kaum zustimmen. Dazu ist Java auch zu mächtig. Aber da auf viele C/C++-Spezialitäten verzichtet wurde, hat Java unter der Prämisse »Weniger ist mehr« erheblich gewonnen. Hinzugefügt wurden dafür selektive und bisher nicht in C/C++ implementierte Funktionalitäten, die die Entwicklung, Implementation und Instandhaltung der Software erleichtern sollen. Obwohl beispielsweise Operatoren-Überladung weggelassen wurde, wurde das Überladen von Methoden beibehalten. Oder für das Speichermanagement, eine der Hauptfehlerquellen bei C/C++-Programmen, verfügt Java über eine automatische Garbage Collection (automatische Speicherbereinigung). Da Java über diesen automatischen Garbage Collection-Mechanismus verfügt, vereinfacht es nicht nur die Programmierung, sondern verringert daneben die Anzahl der Fehler und beseitigt das alte C/C++-Problem des manuellen Speichermanagements.
  • Java ist klein, was unter anderem ein angenehmer Nebeneffekt der Einfachheit ist. Eines der ursprünglichen Ziele von Java war, die Entwicklung von Software zu erleichtern, die »stand alone« auf kleinen Rechnern (ab mindestens 4 MByte RAM) oder sogar in Kaffeemaschinen oder Videorecordern läuft. Die Größe des Basisinterpreters und die Klassenunterstützung betragen in etwa 40 KByte RAM. Zusätzliche Standardbibliotheken und Thread-Unterstützung benötigen weitere 175 KByte. Diese 215 KByte sind wesentlich kleiner als jede andere vergleichbare Programmiersprache oder -umgebung.
  • Java ist objektorientiert. Es zählt zu einer Familie von Sprachen, die Daten als Objekte definieren und Methoden verwenden, um diese Objekte zu bearbeiten. Einfach gesagt, beschreiben objektorientierte Sprachen (OO ist die Abkürzung für Object Orientation) Interaktionen zwischen Datenobjekten. Allerdings hat Java gegenüber einigen anderen objektorientieren Sprachen eine entscheidende Einschränkung - es gibt keine Mehrfachvererbung. Dafür werden jedoch abstrakte Klassen und ein Schnittstellenkonzept unterstützt. Damit ist es möglich, bedeutend transparenter die Möglichkeiten der Mehrfachvererbung zu kompensieren. Damit werden einige der zentralen Probleme umgangen, die die tatsächliche Mehrfachvererbung aufwirft, wohingegen die meisten der Vorteile bewahrt werden. Mehr dazu später.
  • Java ist dezentral, denn Java erfüllt ein wesentliches Charakteristikum von Client/Server-Anwendungen: die Fähigkeit, Informationen und die Last für die Berechnung der Daten zu verteilen. Der Begriff »dezentral« beschreibt dabei die Beziehung zwischen Systemobjekten, gleichgültig, ob sich diese Objekte nun auf lokalen oder auf entfernten Systemen befinden. Einer der großen Vorteile von Java-Applets und -Anwendungen ist, dass sie Objekte über URLs im gesamten Web genauso wie auf dem lokalen Rechner öffnen und auf diese zugreifen können. Dabei können bereits wichtige Teile der Anwendung bzw. der Daten lokal vorhanden sein, andere werden hingegen erst bei Bedarf geladen. Der schon beschriebene Mangel bei anderen Internetsystemen bzw. -sprachen wie HTML (der Client ist im Prinzip zur Arbeit bereitet, hat aber nichts zu tun und Server und Netzleitungen schaffen sich fast tot) wird umgangen. Dabei steht dem Java-Programmierer eine implementierte, umfangreiche Programm-Routinen-Bibliothek für die Zusammenarbeit mit TCP/IP-Diensten wie HTTP und FTP zur Verfügung. Das neue RMI-Konzept ist ein weiterer Schritt in diese Richtung.
  • Java ist interpretiert, denn ein gewisser Teil des Java-Codes (zwar nur ca. 20 % - das sind jedoch die kritischen 20 %) werden vom Container, z.B. dem Browser, interpretiert. Manchmal sagt man deshalb sogar, dass Java interpretiert und kompiliert zur gleichen Zeit ist, was auf den ersten Blick ja ein Widerspruch zu sein scheint. Sowohl die wesentlichen Aspekte der Java-Sicherheit, als auch die Fähigkeit, auf verschiedenen Systemen zu laufen, rühren von der Tatsache her, dass die letzten Schritte der Kompilierung lokal abgearbeitet werden. Vorher wurde der Java-Quellcode mit dem Java-Compiler in Bytecode kompiliert. Bei dem Bytecode handelt es sich um ein architekturneutrales Object-Codeformat. Ferner ist er binär und so lange nicht vollständig und lauffähig, bis er von der Java-Laufzeitumgebung interpretiert wird. Da jede Java-Laufzeitumgebung plattformspezifisch ist, arbeitet das endgültige ausgeführte Programm auf dieser spezifischen Plattform. Diese Kombination von Kompilierung und Interpretation ist vorteilhaft, da zunächst einmal Sicherheit und Stabilität erhöht werden. Die Java-Umgebung enthält ein Element namens »Linker«, das die in ihr System eingehenden Daten überprüft, um sicherzustellen, dass sie weder schädigende Daten enthalten (Sicherheit) noch Daten, die den Systembetrieb ihres Computers unterbrechen könnten (Stabilität). Außerdem wird die Pflege von Versionsnummern erleichtert. Die Tatsache, dass der letzte Teil der Übersetzung des Bytecodes von einem plattformspezifischen Programm auf der Plattform des Endanwenders ausgeführt wird, nimmt dem Entwickler die Verantwortung, verschiedene Quellen für verschiedene Plattformen halten zu müssen. Die Interpretation erlaubt zudem, Daten zur Laufzeit zu laden, was die Grundlage für das dynamische Verhalten von Java ist.
  • Java ist stabil in der Bedeutung von »zuverlässig«. Je stabiler eine Sprache ist, desto unwahrscheinlicher ist es, dass in dieser Sprache geschriebene Programme abstürzen. Ein wesentliches Kriterium für die Stabilität einer Programmiersprache ist, dass bereits während der Kompilierungsphase der größte Teil der Datentyp-Überprüfung ausgeführt wird, nicht erst zur Laufzeit wie bei nicht so stabilen Sprachen. Man nennt dies »stark typisiert«. Eine stark typisierte Sprache wie Java ermöglicht also bereits ein intensives Überprüfen des Codes während der Kompilierungsphase. Damit können Fehler relativ früh gefunden werden. Ein weiteres Stabilitätskriterium von Java-Programmen ist, dass sie - im Gegensatz zu Programmen, die in vielen anderen Sprachen geschrieben sind - keinen Zugriff auf den vollständigen Speicherbereich eines Computers, insbesondere den Systemspeicher, haben. Java besitzt eine eingebaute Begrenzung der Zugriffsmöglichkeiten. Damit verringert sich die Absturzwahrscheinlichkeit eines Java-Programms erheblich. Schlimmstes Negativbeispiel für eine Programmiersprache, die den umgekehrten Weg verfolgt und Programmieren weitgehend ungeprüfte Zugriffe auf sämtliche Speicherbereiche des Rechners ermöglicht, ist C/C++. Die Stichworte Zeigerarithmetik und implizite Deklarationen sind mit höchster Gefahr gleichzusetzen. Bei C/C++ liegt eindeutig der Schwerpunkt auf maximaler Geschwindigkeit, plattformnaher Programmierung und Flexibilität, bei Java auf Stabilität und Sicherheit. Ein weiterer Stabilitätsaspekt von Java ist die abschließende Sicherheitsüberprüfung durch einen Linker. Der Linker ist Teil der Laufzeitumgebung. Er versteht das Typensystem und wiederholt während der Laufzeit viele der Typenüberprüfungen, die der Compiler durchführt.
  • Java gilt als sehr sicher. So ist die Unterbindung von beliebigen Speicherzugriffe durch Java nicht nur ein Stabilitätskriterium, sondern trägt gleichfalls zur Sicherheit bei. Da Java-Programme zuerst in Bytecode-Anweisungen und Proto-Programme übersetzt werden, lassen diese sich dann recht gut überprüfen. Bytecode-Anweisungen sind nicht plattformspezifisch und enthalten zusätzliche Typinformationen. Diese Typinformation kann für die Überprüfung des legalen Status und von möglichen Sicherheitsverletzungen verwendet werden. Mehr zur Sicherheit folgt noch an anderer Stelle.
  • Java ist architekturneutral, d.h., es ist auf verschiedenen Systemen mit unterschiedlichen Prozessoren und Betriebssystemarchitekturen lauffähig. Der kompilierte Java-Bytecode kann auf jedem Prozessor ausgeführt werden, der einen Java-fähigen Browser bzw. die virtuelle Maschine von Java im Allgemeinen unterstützt. Der Java-Compiler erzeugt niemals plattformabhängigen Binärcode, sondern neutralen Java-Bytecode. Dieser wird erst während der Laufzeit in systemeigenen Maschinencode übersetzt. Und dennoch ist Java eine vollständige Programmiersprache.
  • Java ist portierbar, was eine wesentliche Folge der Architekturunabhängigkeit ist. Darüber hinaus fallen implementationsabhängige Aspekte, wie man sie in C und C++ findet, bei Java durch die Standards für Datentypen weg. In Java wird die Größe einfacher Datentypen genau spezifiziert, und auch, wie sich die Arithmetik gegenüber diesen Datentypen verhält. Fast alle wichtigen Prozessoren unterstützen diese Java-Spezifikation und außerdem beinhalten die Java-Bibliotheken portierbare Schnittstellen für die wichtigsten Plattformen.
  • Java ist sehr leistungsfähig, denn in Tests von Sun auf einer Sparc Station 10 hat sich gezeigt, dass die Performance von Java-Bytecode, der in Maschinencode umgewandelt wurde, von native C oder C++ bei vielen Funktionen nicht zu unterscheiden ist. Allerdings ist dabei die Zeit für die Laufzeit-Kompilierung nicht mit einbezogen. Der Start der virtuellen Maschine beim Aufruf einer Java-Applikation ist zudem zeitaufwändig. Bei allem Java-Lob muss man in dem Punkt Performance realistisch bleiben. Nicht umsonst zählt die absolut mangelhafte Performance früher Java-Versionen zu den Hauptkritikpunkten. Die Java-2-Plattform beinhaltet diverse Neuerungen zur Steigerung der Performance (wir sind im ersten Kapitel darauf eingegangen). Die Geschwindigkeit von interpretiertem Java-Bytecode ist dennoch auf leistungsschwachen Plattformen recht niedrig, aber für die meisten Aufgaben ausreichend. Und für den Fall, dass eine höhere Performance notwendig ist, kann native Code integriert werden (wovon jedoch aus Sicherheitsgründen dringend abzuraten ist). Ein Ansatz zur Steigerung der Performance ist die Entwicklung von Just-in-Time-Compilern (JIT) durch diverse Hersteller von Java-Entwicklungsumgebungen. Insbesondere gehört in der Java-2-Plattform ein JIT-Compiler zum Lieferumfang. Nach Angaben einiger Hersteller von Entwicklungstools kann die Leistungsfähigkeit von Java-Applikationen und Applets um das Fünf- bis Zehnfache erhöht werden - unabhängig davon, mit welchem Tool sie erstellt wurden. Ein JIT (Just-in-Time-Compiler) hat grob gesagt die Funktion, ein Java-Applet oder - Programm vor seiner Ausführung bereits zu übersetzen, um damit eine bessere Performance zu erreichen. Genauer genommen übersetzt der JIT nur häufig benötigte Funktionalitäten, d.h., beim ersten Aufruf einer Methode wird deren Bytecode in Maschinenbefehle übersetzt und im RAM gehalten. Beim erneuten Aufruf dieser Methode wird dann der bereits kompilierte Code verwendet. Zudem steigt durch die »Just-in-Time«-Funktionalität die Geschwindigkeit bei der parallelen Abwicklung mehrerer rechenintensiver Softwareapplikationen. Ein JIT-Compiler ist aber kein Allheilmittel, denn in der Praxis zeigt sich unter ungünstigen Umständen, dass durch Laden des JIT sogar eine Verringerung der Ausführungsgeschwindigkeit die Folge sein kann. In der Regel ist jedoch eine Steigerung der Performance wirklich oft zu beobachten. Die im JDK 1.3 eingeführte Hotspot-Technologie ist ein neuer Ansatz, die Leistungsfähigkeit von Java erheblich zu steigern.
  • Java unterstützt Multithreading. Multithreading bedeutet zunächst nur, dass mehrere Aufgaben oder Prozesse quasi gleichzeitig ausgeführt werden können. Einfachstes (und bestes) Beispiel für ein Multithreadingsystem ist ein Mensch, der viele Dinge gleichzeitig erledigt. Bei Computersystemen werden solch natürliche Dinge wie Multithreading zu einem großen Problem. Viele ältere Betriebssysteme wie DOS waren nie in der Lage, Multithreading auch nur ansatzweise auszuführen. Nicht einmal Multitasking (das parallele Abarbeiten von mehreren Programmen) war bei diesen Betriebssystemen möglich. Auch das Multitasking von Windows 3.x war nie echtes Multitasking, geschweige denn Multithreading. Neben den Betriebssystemen unterstützten zudem die Konzepte bisheriger Programmiersprachen den Multithreading-Vorgang gar nicht oder nur sehr eingeschränkt. C/C++ ist ebenfalls auf Single-Threaded-Programme ausgerichtet. Bei Java ist die Beschränkung auf Single-Threading aufgehoben. Allerdings gilt vor übereilter Euphonie über Multithreading, dass die Vorteile von Multithreading (bessere interaktive Antwortfähigkeit, besseres Laufzeitverhalten) stark von der zugrunde liegenden Plattform abhängen. Selbst wenn eine Plattform Multithreading unterstützt, Java-Multithreading-Anwendungen sind hauptsächlich für eine Multiprozessor-Umgebung geeignet und haben eigentlich nur dort ein optimales Laufzeitverhalten. Multithreading-Verhalten wird zwar funktionieren, wenn Sie eine Java-Multiprozessor-Anwendung unter Windows 98 auf einem PC laufen lassen, jedoch kaum gute Ergebnisse bieten. Im Prinzip bedeutet Multithreading ja nichts anderes, als dass mehrere Aufgaben gleichzeitig ausgeführt werden können. Bei mehreren Prozessoren kann jeder Prozessor einen Thread abarbeiten, was echte Gleichzeitigkeit darstellt. Was bei einem Prozessor Gleichzeitigkeit bedeutet, kann auf philosophischer Ebene bis zum Exzess diskutiert werden, jedoch ist dies durch die kurzen Intervalle der Zeitzuweisungen an einzelne Threads im Grunde müßig. Die Einschränkungen auf Grund der Zyklen von Kapazitätszuweisungen sind aber offensichtlich. Der Vorgang des Multithreading sollte freilich noch einmal etwas genauer beleuchtet werden. Eigentlich ist die oft verwendete Übersetzung von Threads mit Aufgaben ungenau und verschleiert den Unterschied zu Multitasking, was ja streng genommen bedeutet, dass mehrere Aufgaben (Tasks) gleichzeitig ausgeführt werden können. Ein Thread ist im Grunde statt mit »Aufgabe« besser (wie es im Wörterbuch steht) mit »Faden«, »Faser« oder am besten »Zusammenhang« zu übersetzen. Nicht die gleichzeitige Ausführung von mehreren Programmen wie beim Multitasking, sondern die gleichzeitige, parallele Ausführung von mehreren einzelnen Programmschritten (oder zusammenhängenden Prozessen) ist echtes Multithreading. Dies kann auch bedeuten, dass innerhalb eines Programmes mehrere Dinge gleichzeitig geschehen, mehrere Fäden/Fasern eines Programms gleichzeitig verfolgt und abgearbeitet werden. Beispielsweise kann ein Thread eines Programms eine lange und hochkomplizierte Berechnung ausführen, während sich ein anderer Thread um die Bildschirmausgabe kümmert und ein dritter Thread die Usereingabe bearbeitet. Und dies im Sinne von »computergleichzeitig«. Bei Java ist das Multithreadingkonzept voll integrierter Bestandteil der Philosophie. Der hochentwickelte Befehlssatz in Java, um Threads zu synchronisieren, ist in die Sprache integriert, macht diese stabil und einfach in der Anwendung. Das Multithreadingkonzept an sich ist freilich schon viel älter als Java und auch das Java-Multithreadingkonzept basiert auf dem Cedar/Mesa-System von Xerox. Die einfachen Thread-Anweisungen von Java beruhen auf dem 20 Jahre alten Paradigma von Steuer- und Bedingungsvariablen von C. Anthony Hoare. Allerdings hat Sun mit Java in dem äußerst wichtigen und komplizierten Bereich der Synchronisation von Threads viel Neues entwickelt und viele der Synchronisationsschwierigkeiten bisheriger Multithreading-Umgebungen aus dem Weg geräumt.
  • Java ist dynamisch, d.h., es kann sich an eine sich ständig weiterentwickelnde Umgebung anpassen. Sun zieht zur Verdeutlichung dieser Eigenschaft von Java das Beispiel C++ heran und definiert den Vorteil von Java gegenüber Entwicklungen mit C++ so, dass Entwickler bei C++ von jemand anderem abhängig werden. Grund dafür sind die Klassenbibliotheken, eine Sammlung von Plug-and-Play-Komponenten, in denen der C++-Code implementiert wird. Diese werden von fremden Unternehmen ständig verändert oder »upgegradet«. Da C++-Programme die Klassenbibliotheken verwenden, muss deshalb oft der C++-Code angepasst werden, nur um die Programme lauffähig zu halten. Dummerweise werden die meisten User bei einem Programmfehler nach einem (vielleicht noch unbemerkten, weil bei einer Installation einer anderen Software erfolgten) Upgrade von Klassenbibliotheken den Fehler dem Programm zuschieben und nicht den neuen Klassenbibliotheken. Java verbindet im Gegensatz zu C++ die einzelnen Module in einer späteren Phase und vermeidet dadurch das Bibliotheken-Problem. Ein weiterer dynamischer Aspekt von Java ist der Mechanismus der Schnittstellen (Interfaces). Mehr dazu im Abschnitt über Schnittstellen. Nur soweit vorab die Information, dass Schnittstellen im Prinzip Klassen sehr ähnlich sind, jedoch im Gegensatz dazu Mehrfachvererbung unterstützen und auch sonst flexibler in bezug auf Vererbung sind, als dies bei Klassen der Fall ist. Eine wesentliche Eigenschaft von dynamischen Sprachen wie Java oder deren dynamischen Vorgängern Small Talk oder auch Lisp ist, dass sie sich auf Grund ihrer Flexibilität hervorragend zur Erstellung von Prototypen eigenen. Ein Hauptgrund dafür ist, dass sie in jeder Phase von Programmierern explizite Entscheidungen fordern, damit durch eine schlechte oder nicht erfolgte Entscheidung (etwa wie bei C/C++ ein Zeiger auf einen unbekannten Objekttyp) ein System nicht zum Absturz gebracht werden kann. Wenn Sie beispielsweise in Java einen Methodenaufruf schreiben und dabei Fehler machen, wird dieser beim Kompilieren bemerkt und Sie bekommen eine Warnmeldung, wenn Sie den Code kompilieren wollen.

2.3 Zusammenfassung

Zusammenfassend kann man sagen, dass Java eine der wohl spannendsten Entwicklungen der letzten Jahre in der EDV war und immer noch ist. Nahezu konkurrenzlos für die Bereiche, wo es auf Plattformneutralität und Stabilität ankommt, hat sich Java zu einer festen Größe entwickelt. Java bietet weit mehr als nur die Möglichkeit, im Internet kleine, bunte »Progrämmchen« zu erstellen. Es ist eine der leistungsfähigsten Entwicklungsumgebungen, die man sich vorstellen kann.

1

16.384 = 64 * 256.

2

Und auch in älteren Versionen, da es für deren Verwendung immer noch Argumente gibt.


© Copyright Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH
Elektronische Fassung des Titels: Java 2 Kompendium, ISBN: 3-8272-6039-6 Kapitel: 2 Schnuppertour Java