|
WWW-Seminar - Zusammenfassung
|
|
Entwicklung
Java wurde ab 1990 bei Sun Microsystems u. a. von Bill Joy und James
Gosling entwickelt; ursprüglich dachte man dabei an den Einsatz in
SetTop-Boxen, erst durch die zeitlich parallele Entwicklung des WWW ergab
sich eine Nutzung auch in diesem Bereich. Der Begriff 'Java' entspricht in
Amerika dem umgangssprachlichen Begriff für Kaffee.
Java hat eine C++-basierte Syntax, ist dynamisch, objektorientiert,
portabel, architekturunabhängig, robust und sicher, enthält
umfangreiche, betriebssystemunabhängige Standardbibliotheken und
unterstützt Multithreading. Der Compiler erzeugt einen
architekturunabhängigen Bytecode, der auf dem Zielsystem interpretiert
wird.
Java im WWW
Java-Applets können in HTML-Seiten eingebunden werden; dadurch werden
dynamische statt statischer Seiten möglich, was bessere Interaktion
mit dem User erlaubt; außerdem das Netz weniger belastet, da nur ein
Programm, nicht aber die aufbereiteten Daten übertragen werden
müssen; die lokalen Rechenkapazitäten werden besser
ausgenutzt.
Neue Datentypen stellen kein Problem mehr da, da für deren Darstellung
keine neuer Browser, sondern nur der Java-Code benötigt wird, ein
Java-fähiger Browser wird also 'automatisch geupdated'.
Der erste Browser, der überhaupt mit Java umgehen konnte, war HotJava
von Sun Mircosystems.
Java-Programme
Java-Programme können in verschiedene Kategorien eingeteilt werden.
Die wichtigsten sind Applications (das sind Stand-alone-Programme, wie z.B.
der HotJava-Browser eines ist) und Applets (Programme, die innerhalb eines
Browsers ablaufen sollen, in der Regel als Teil einer HTML-Seite).
Darüberhinaus gibt es noch sogenannte Protocol Handler und Content
Handler, welche Java-kompatible Browser um die Interpretation
zusätzlicher Protokolle und MIME-Typen erweitern.
Beispiel für eine einfache Java-Applikation:
class HelloWorldApp
{
public static void main (String args[])
{
System.out.println ("Hello, World!");
}
}
Java-Programme werden mit dem Java-Compiler zu sogenanntem 'Bytecode'
compiliert, einer Art Assembler-Code für eine fiktive Virtuelle
Maschine (VM). Dieser plattformunabhängige Code kann dann über
Netze übertragen werden und entweder von einem Java-Browser (bei
Applets) oder einem Java-Interpreter (bei Stand-alone-Programmen)
ausgeführt werden.
Hier noch ein Beispiel für die Einbindung eines Applets in ein
HTML-Dokument:
<html>
<head>
<title> Hello, World! </title>
</head>
<body>
Und hier kommpt das Applet:
<applet code="HelloWorld.class"> </applet>
</body>
</html>
Java: Die Sprache
Die Syntax von Java ist stark an die von C/C++ angelehnt. Wie in C/C++ gibt
es auch in Java primitive Datentypen für Integer, Fließkommazahlen,
Textzeichen etc. Im Gegensatz zu C/C++ sind die Formate dieser Datentypen
festgelegt und damit implementations- und plattformunabhängig. Text z.B.
wird grundsätzlich in Form von 16-bit Unicode-Zeichen gespeichert.
Arrays und Strings sind in Java vollwertige Objekte und werden nicht
durch Zeigerarithmetik implementiert, wie dies in C/C++ der Fall ist.
Array- und String-Zugriffe werden auf korrekte Indizierung überprüft
und kennen ihre Länge.
Java unterstützt Einfachvererbung von Klassen, jedoch keine
Mehrfachvererbung. Letztere kann jedoch konzeptionell durch sogenannte
Interfaces nachgebildet werden. Interfaces stellen eine Art Schablone für
Klassenschnittstelle dar, ohne eine Implementierung zu spezifizieren. Eine
Klasse kann nun ein oder mehrere Interfaces implementieren, wodurch Klassen
bezüglich eines Interfaces polymorph behandelt werden können.
Java unterstützt die parallele Ausführung mehrerer Threads.
Einzelnen Threads können dabei unterschiedliche Prioritäten
zugeordnet werden; die eigentliche Multitasking-Funktionalität muß
jedoch vom unterliegenden Betriebssystem bereitgestellt werden. Java stellt
außerdem Mechanismen zur Synchronisation von Threads zur Verfügung.
Die Heap-Verwaltung erfolgt in Java automatisch, d.h. dynamisch allokierte
Speicherbereiche müssen nicht explizit wieder freigegeben werden; dies
wird durch einen im Hintergrund laufenden Garbage-Collector erledigt.
Zur Vereinfachung der Sprache bzw. aus Gründen der Sicherheit wurden viele
C/C++-Features nicht übernommen. Im einzelnen sind dies: globale
Funktionen, Zeiger- und Referenztypen, Aufzählungstypen (enum), typedefs,
structs und unions, Templates, Mehrfachvererbung, Überladen von
Operatoren und Präprozessor-Direktiven.
Java-Quelltexte werden in sogenannten Packages organisiert, das sind
Übersetzungseinheiten, welche eine oder mehrere zusammen compilierte
Klassen enthalten. Packages können wiederum zu Packages
zusammengefaßt werden, so daß sich eine hierarchische Struktur
ergibt, welche üblicherweise in Verzeichnis-Hierarchien von Filesystemen
abgebildet wird.
Sicherheit
Das Ausführen von fremden Code stellt ein Sicherheitsrisiko dar, da
hier grundsätzlich Manipulationen möglich werden könnten, die
vom User gar nicht gewünscht sind, z. B. Übertragung oder
Löschen von Dateien.
Um dies bei Java zu verhindern, wurde Java schon von Anfang an als sichere
Sprache entwickelt; dabei gibt es vier Sicherheitstufen:
- Sprache / Compiler
-
Alle sicherheitskritischen Features wurden in Java entweder entfernt
oder geändert, z. B.
- keine Zeiger und Zeigerarithmetik (statt dessen Arrays bzw.
Strings)
- dynamische Typüberprüfung
- nur gültige Typecasts erlaubt
- Garbage Collection (d. h. der Programmierer bracht sich nicht um
die Freigabe von Speicher zu kümmern, und der Zugriff auf
bereits gelöschte Objekte ist unmöglich)
- Verifikation des Bytecodes
-
Diese Einschränkungen könnten umgangen werden, wenn der Code
mit einem geänderten Compiler übersetzt würde. Daher wird
der Bytecode vom Loader wie folgt überprüft:
- keine illegalen Zeigerzugriffe?
- keine Zugriffsbeschänkungen verletzt?
- zweckgebundene Benutzung von Objekten?
- richige Argumenttypen beim Aufruf von Methoden?
- Gewährleistung, daß keine Stacküber- oder
-unterläufe vokommen
- nur erlaube Typumwandlungen?
Typinformationen
Der Bytecode enthält mehr Informationen als nötig, z. B. wird
zwischen Zeiger- und Integerzugriffen unterschieden, wodurch eine ganaue
Typüberprüfung ermöglicht wird.
Beispiel:
Bytecode
| Zweck
| stack type state
|
---|
iload_1
| Integer-Varaible laden
| I
|
iconst 5
| Integer-Konstante laden
| II
|
iadd
| Addition von zwei Integern => Ergebnis: Integer
| I
|
Der Code wird erst dann zur Ausführung freigegeben, wenn alle
Sicherheitstests bestanden sind.
- Überprüfung des Bytecodes
-
Jede Klasse hat ihren eigenen Gültigkeitsbereich, durch den die
Auflösung von Objektreferenzen festgelegt ist. Built-in-Klassen
(java.lang-package) werden automatisch zuerst geladen und haben
dadurch höchste Priorität, ihr Verhalten kann also nicht durch
späteres Überschreiben geändert werden.
- Datei- und Netzwerkzugriff
-
Lokale Dateizugriffe müssen vom Benutzer freigegeben werden.
Außerdem ist es möglich festzustellen, woher ein bestimmter
Code geladen wurde und entsprechend zu reagieren, z. B. nur Code zur
Ausführung freizugeben, der von gleichen Server geladen worden ist.
Derzeitiger Stand und Zukunftsausblick
Seit 23.01.1996 gibt es die Java-Sprach- und API-Spezifikation jeweils in
der Version 1.0, dazu das Java-Develpment-Kit Version 1.0 (für Solaris
2.[2,3,4] und Windows95/NT [x96]).
An Browsern existieren zur Zeit HotJava 1.0 alpha 3 (unterstützt
alpha3-API) und Netscape Navigator 2.x (unterstützt beta2-API).
Für die Zukunft ist eine weitere Verbreitung von Java zu erwarten, da
weitere große Firmen Java-Lizenzen erworben haben und bereits eigene
Browser mit Java-Unterstützung angekündigt haben, z. B. IBM,
Adobe, Oracle, SpyGlass u. a.
Borland ist dabei, eine plattformübergreifende
Java-Programmierumgebung (Codename: Latte) zu entwickeln; von
Symantec ist eine Java-Entwicklungsumgebung (Espresso) für Windows
bereits in einer Alpha-Version verfügbar; eine Java-Schnittstelle zu
CORBA ist angekündigt worden.
Zusätzlich gibt es noch JavaScript, eine stark abgespeckte
Version von Java, die vom Browser interpretiert wird; ein Compilieren ist
nicht erforderlich.