Von Enno Runne und Hendrik C.R. Lock
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:
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.
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.
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.