[Teil 2: Alles muß in eine Klasse]

Java Kurs Teil I - Konzepte


Von Enno Runne und Hendrik C.R. Lock

Kaum etwas hat die Computerwelt in diesem Jahr so bewegt wie Java. Viele reden davon, ob es nun die Zukunft ist oder eine Sackgasse darstellt. Doch was ist Java eigentlich genau?

Zunächst einmal ist Java eine Programmiersprache, die so aussieht, als hätte jemand übersichtlich in C++ programmiert. Dies ist allerdings fast der uninteressanteste Aspekt an Java. Vielmehr stecken hinter diesem Namen einer kalifornischen Kaffeesorte mehrere Konzepte, wie sie bisher in anderen Programmiersprachen nicht in dieser Form und Kombination zu finden waren:

Objektorientierung

Java ist objektorientiert, was als solches noch nicht gerade neu ist. Dabei ist die Objektorientierung bei Java sehr pragmatisch angesetzt, denn für die Grunddatentypen (Integer, Float, Boolean) wird auf den objektorientierten Overhead, die die Operationen verlangsamen würde, verzichtet. Aber eben nur bei diesen. Alle anderen Typen und Strukturen können nur durch Objekte realisiert werden, die sich über diesen Grundtypen aufbauen. Diese saubere Struktur wird durch eine wohldurchdachte Objektklassenbibliothek ergänzt, die zum Sprachumfang von Java gehört. Damit stehen alle gebräuchlichen Datentypen, wie zum Beispiel umfangreiche Benutzerschnittstellen, sofort zur Verfügung.

Maschinenunabhängigheit

Viel interessanter als die Objektorientierung ist die Unabhängigkeit von der Zielmaschine und ihrem Betriebssystem. Maschinenunabhänigigkeit wird auf folgende Weise erreicht: Zunächst wird ein Java-Programm durch einen Java-Übersetzer in sogenannten Bytecode abgebildet, also nicht wie bei C oder C++ direkt in schnellen Maschinencode. Zum Übersetzen kann der Sun-Compiler javac oder der schnellere espresso ( http://wwwipd.ira.uka.de/~espresso/) der Universität Karlsruhe benutzt werden. Dieser Bytecode kann dann anschließend durch die sogenannte "Virtuelle Java Maschine" ausgeführt werden, die für zahlreiche Zielrechner (SPARC Solaris, x86 Solaris, Windows NT, Windows 95, MacOS) bei http://java.sun.com/products erhältlich ist. Natürlich ist solch ein Bytecode unbhaängig von den jeweiligen Zielmaschinen, da er nicht direkt auf der Zielmaschine abläuft, sondern mittels eines Interpretierers ausgeführt wird. Die virtuelle Maschine bildet also eine Brücke zwischen einem gedachten, virtuellen Rechner, der eine definierte Funktionalität besitzt, und dem realen Zielrechner.

Netzfähigkeit

Einer der Hauptgründe, warum Java gerade so heiß diskutiert wird, ist die Netzfähigkeit von Java. Diese Netzfähigkeit war auch das strategische Ziel der Firma Sun Microsystems, die Java entwickelt hat. Sun ist eine der führenden Hersteller für Netzcomputer. Solche Netzcomputer unterscheiden sich von herkömmlichen PCs dadurch, daß sie nicht mit allen Hardwareraffinessen überfrachtet werden, sondern nur eine vergleichsweise geringe Selbständigkeit besitzen. Sie sind immer von einem Server abhängig, der die Lücken in ihrer Funktionalität ausgleicht. Ein Beispiel wäre ein PC ohne eigene Festplatte aber mit relativ großem Hauptspeicher, dessen Daten bei Bedarf von einem Server durch das Netz übermittelt werden. FUSSNOTE: Daß in heutigen Weitverkehrsnetzen die dazu nötige Bandbreite beiweitem nicht gegeben ist, soll die Idee des Netzcomputers nicht schmälern - LANs mit 100MBit/s und mehr (Fast Ethernet, FDDI) und ATM stehen vor der Tür!

Java ist nun darauf ausgerichtet, Anwendungen zu schreiben, die aus vielen, über das Netz verteilten und miteinander vebundenen Modulen bestehen. Soll ein Programm ausgeführt werden, so lädt ein Netzcomputer nur die benötigten Module auf seine lokale Festplatte (sofern vorhanden( beziehungsweise in seinen Arbeitsspeicher. Dort werden die Programme dann ohne Unterstützung vom Server ausgeführt.

Auf dem Netzcomputer läuft die schon erwähnte Virtuelle Maschine, die jedoch wegen der Interpretierung relativ langsam ist. Es gibt deshalb Bestrebungen, die Interpretierung zu umgehen. Zum einen kann man die Virtuelle Maschine in Hardware realisieren, also ein eigenes "Java/Chip" entwickeln, zum anderen kann man einen Just-in-Time Codegenerator einsetzen, der zur Ladezeit effizienten Maschinencode erzeugt. An beiden Verfahren wird derzeit gearbeitet. Am Bytecode selbst, der ein zentrales Element von Java ist, wird jedoch auf jeden Fall festgehalten: er ist viel kompakter als Maschinencode und erfordert daher wesentlich geringere Übertragungsbandbreiten und Speicherkapazitäten, was für die Nutzung im Netz von zentraler Bedeutung ist. Weiterhin wird der Bytecode zum Ladezeitpunkt geprüft, was die Sicherheit erhöht.

Sicherheit

Gerade bei der Vernetzung von Computern tritt das Problem auf, Daten und Programme vor unbefugtem Zugriff und vor Veränderung zu schützen. So darf zum Beispiel eine Anwendung nicht einfach alle Daten lesen und verändern, ohne daß der Benutzer davon explizit in Kenntnis gesetzt wird. Außerdem besteht permanent die Gefahr, daß Programme von Computerviren korrumpiert werden. Dies hat in den vergangenen Jahren zu einem immer größeren Problem geführt.

Für beide Probleme stellt Java einen Lösungsansatz bereit: durch sogenannte Applets und durch Überprüfung des Bytecodes zum Ladezeitpunkt. Java-Programme gibt es in zwei Formen: als Applets und als vollwertige Applikationen. Ein Applet unterscheidet sich von einer Applikation dadurch, daß es über das Netz verschickt und an anderer Stelle ausgeführt werden kann, wohingegen Applikationen lokal bleiben und ausgeführt werden, z.B. auf einem Server.

Applets sind also für die Verwendung im Internet konzipiert. Damit Applets nicht zu trojanischen Pferden werden, dürfen sie nur sehr begrenzt auf das Dateisystem des Programmnutzers zugreifen und auch nur einen Teil der Internetfunktionalität in dessen Namen verwenden (ein Programm, das im Namen des Benutzers über's Netz Buchungen tätigt, ohne daß das Opfer etwas davon mitbekommt, wäre nicht gerade angenehm...). Dadurch wird sichergestellt, daß von Applets keine Daten unbefugt gelesen oder geschrieben werden. Anbieter im World Wide Web können somit in Java programmierte Software in Form von Applets als Dienstleistung anbieten.

Komplizierter ist der Schutz vor unbefugter Veränderung von Java-Programmen, z.B. durch Viren. Hier kommt ein Vorteil des Bytecodes zum tragen: Mit Hilfe zusätzlicher Informationen im Bytecode, die der Übersetzer abgelegt hat, überprüft die Virtuelle Maschine die Korrektheit und bricht die Ausführung im Fehlerfall ab. Dadurch können unerlaubte Veränderungen erkannt und gebannt werden; die Ausführung des Programms, falls sie denn zustande kommt, ist somit geschützt und sicher. Man muß diesen Anspruch jedoch ein wenig einschränken: geprüft wird ja nur diejenige Information, die im Bytecode selbst vorhanden ist. In der Vergangenheit wurden Sicherheitslücken aufgedeckt, die auf fehlerhafte oder unvollständige Realisierungen der Virtuellen Maschine zurückgingen. Die Firma Sun Microsystems arbeitet intensiv daran, solche Lücken zu schließen.

Eine weitere Quelle für Sicherheit sowohl der Programmausführung als auch der Programmierung ist im Sprachkonzept selbst verankert. Im Gegensatz zu Programmiersprachen wie C und C++ gibt es erstens keine Zeiger, denn die Adressierung eines beliebigigen Speicherplatzes stellt eine ernstzunehmende Sicherheitslücke dar. Und wie jeder C-Hacker weiß, auch eine Quelle schlafloser Nächte... In Java können ausschließlich Referenzen auf Objekte verwaltet werden. Diese sind im Prinzip zwar auch Zeiger, aber eben Zeiger auf Objekte, die zuvor erzeugt worden sind, und zwar unter Kontrolle der virtuellen Maschine. Zweitens sind Felder dynamisch, d.h. sie können bei Bedarf wachsen. Besonders wichtig dabei ist, daß jeder Feldzugriff, ob lesend oder schreibend, zuvor auf korrekte Indizierung überprüft worden ist. Damit ist es aussichtslos, auf undefinierte Felder zugreifen zu wollen.

Und was kommt jetzt?

Soviel zur Einführung - in den folgenden Ausgaben von Internet Online geht's mit der Java-Programmierung los. Zunächst werden wir einfache Java-Applikationen erstellen und uns nach und nach an aufwendigere Applets herantasten. Dabei werden alle Aspekte der Java-Programmierung beleuchtet werden, zum Beispiel die Standardklassen, Fehlerbehandlung und Threads. Bis dahin könnt Ihr Euch ja schon mal den Übersetzer und die virtuelle Maschine für Euren Rechner vom Netz ziehen!

[Teil 2: Alles muß in eine Klasse]