Sun Java Programmiersprache Anleitung
Unten finden Sie kurze Informationen zur Java Programmiersprache. Erfahren Sie mehr über die Konzepte der Internetsprache, die virtuelle Maschine und die grundlegenden Eigenschaften.
Werbung
Werbung
1 Schon wieder eine neue Sprache?
Wir produzieren heute Informationen in Massen, wie früher Autos.
– John Naisbitt
1.1
Der erste Kontakt
Java ist mittlerweile ein Modewort geworden und liegt in aller Munde. Doch nicht so sehr, weil
Java1 eine schöne Insel2, eine reizvolle Wandfarbe oder eine Pinte mit brasilianischen Rhythmen
in Paris ist, sondern vielmehr, weil Java eine neue Programmiersprache ist, mit der ›modern‹
programmiert werden kann. Wer heute nicht mindestens von der ›Supersprache‹ Java gehört hat,
scheint megaout3. In Java ist viel hineingeredet worden, es wurde als Lösung für alle
Softwareprobleme in den Himmel gehoben und als unbrauchbar verdammt. Java ist Philosophie
und Innovation gleichzeitig – ein verworrenes Thema. Um in der breiten Softwareentwicklung
gegen die vielen konkurrierenden Sprachen, die bevorzugte Sprache zu sein, muss Java schon
einiges zu bieten haben. Im ersten Kapitel sollen daher kurz die wesentlichen Konzepte der
›Internetprogrammiersprache‹ vorgestellt werden.
1.2
Historischer Hinte rgrund
In den siebziger Jahren wollte Bill Joy eine Programmiersprache schaffen, die alle Vorteile von
MESA und C vereinigt. Diesen Wunsch konnte sich Joy zunächst nicht erfüllen und erst Anfang
der neunziger Jahre schrieb er in dem Artikel ›Further‹, wie eine neue objektorientierte Sprache
aussehen könnte; sie sollte in den Grundzügen auf C++ aufbauen. Erst später ist ihm bewusst
geworden, dass C++ als Basissprache ungeeignet und für große Programme unhandlich ist.
Zu dieser Zeit arbeitete James Gosling an dem SGML-Editor ›Imagination‹. Er entwickelte in
C++ und auch er war mit dieser Sprache nicht zufrieden. Aus diesem Unmut entstand die neue
Sprache Oak . Der Name fiel Gosling ein, als er aus dem Fenster seines Arbeitsplatzes schaute –
er sah eine Eiche (engl. Oak). Doch vielleicht ist das auch nur eine Legende. Patrick Naughton
startete im Dezember 1990 das Green-Projekt , in das Gosling und Mike Sheridan involviert
waren. Überbleibsel aus dem Green-Project ist der Duke, der zum bekannten Symbol geworden
ist. 4 Die Idee hinter diesem Projekt war die Entwicklung von Software für interaktives Fernsehen
und andere Geräte der Konsumelektronik. Bestandteile dieses Projekts waren das Betriebssystem
Green-OS, Goslings Interpreter Oak und einige Hardwarekomponenten. Joy zeigte den
Mitgliedern des Green-Projekts seinen Further-Aufsatz und begann mit der Implementierung
einer grafischen Benutzeroberfläche. Gosling schrieb den Originalcompiler in C und
anschließend entwarfen Naughton, Gosling und Sheridan den Runtime-Interpreter ebenfalls in C
– die Sprache C++ kam nie zum Einsatz. Oak führte die ersten Programme im August 1991 aus.
So entwickelte das Green-Dream-Team ein Gerät mit der Bezeichnung *7 (Star Seven), das sie
im Herbst 1992 intern vorstellten. Sun-Chef Scott McNealy war von *7 beeindruckt und aus dem
Team wurde im November die Firma First Person, Inc. Nun ging es um die Vermarktung von Star
Seven.
1
Nicht wieder ein anderes Acronym (Just Another Vague Acronym).
2
Die Insel Java ist die kleinste der Sunda-Inseln in Indonesien mit etwa 90 Millionen Einwohnern.
Indonesien selbst hat eine Gesamtbevölkerung von 205 Millionen Einwohnern, die
Bevölkerugsdichte in Java ist mit 833 Einwohnern pro Quadratkilometer sehr hoch. Damit verteilt
sich auf etwa 7% der Landoberfläche fast 60% der Bevölkerung. Hörer der ›Drei Fragezeichen‹
verbinden die Insel vermutlich noch mit Schätzen. Inselinformationen finden sich unter anderem
unter
3
4
http://www.diht.de/ahk/
home/bueros/i/indonesien/standort.html
und
http://www.uemg-
omf.ch/laender/indonesien.
Und die, die in Bewerbungen nicht zehn Jahre Java-Erfahrungen angeben, ohnehin.
Er sieht ein bisschen wie ein Zahn aus und könnte deshalb auch die Werbung eines Zahnarztes sein. Das
Design stammt übrigens von Joe Palrang.
Anfang 1993 hörte das Team von einer Anfrage von Time-Warner, die ein System für Set-TopBoxen brauchten. (Set-Top-Boxen sind elektronische Geräte für Endbenutzer.) First Person
richtete den Blick vom Consumer-Markt auf die Set-Top-Boxen. Leider zeigte sich Time-Warner
später nicht mehr interessiert, aber First Person entwickelte (sich) weiter. Nach vielen
Richtungswechseln konzentrierte sich die Entwicklung auf das World Wide Web (kurz Web
genannt, selten W3). Die Programmiersprache sollte Programmcode über das Netzwerk empfangen können und auch fehlerhafte Programme sollten keinen Schaden anrichten können. Damit
konnten die meisten Konzepte aus C(++) schon abgehakt werden – Zugriffe über ungültige
Zeiger, die wild den Speicher beschreiben, sind ein Beispiel. Die Mitglieder des ursprünglichen
Projektteams erkannten, dass Oak alle Eigenschaften aufwies, die nötig waren, um es im Web
einzusetzen – perfekt, obwohl ursprünglich für einen ganz anderen Zweck entwickelt. Die
Sprache Oak bekam den Namen ›Java‹, da der Name ›Oak‹, wie sich später herausstellte, aus
Gründen des Copyrights nicht verwendet werden konnte, da eine andere Programmiersprache
schon diesen Namen trug. Nach Überlieferung fiel die Entscheidung für Java in einem
Coffeeshop. In Java führte Patrick Naughton den Prototypen des Browsers ›WebRunner‹ vor, der
an einem Wochenende entstanden sein soll. Nach etwas Überarbeitung von Jonathan Payne
wurde der Browser ›HotJava‹ getauft und im Mai auf der SunWorld '95 der Öffentlichkeit
vorgestellt.
Zunächst konnten sich nur wenige Anwender mit HotJava anfreunden. So war es großes Glück,
dass Netscape sich entschied, die Java-Technologie zu lizenzieren. Sie wurde in der Version 2.0
des Netscape Navigators implementiert. Der Navigator kam im Dezember 1995 auf den Markt.
Im Januar 1996 wurde das JDK 1.0 freigegeben, was den Programmierern die erste Möglichkeit
gab, Java Applikationen und Web-Applets (Applet: ›A Mini Application‹) zu programmieren.
Kurz vor der Fertigstellung des JDK 1.0 gründeten die verbliebenen Mitglieder des Green-Teams
die Firma JavaSoft. Und so begann der Sie geslauf ...
[ pic: comix/JavaImHaushalt.tif ]
[ pic: superhero.gif, „“In den Text hahe Duke das kleines Bildschen einbauen ]
1.3
Eigenschaften von Java
Java ist eine objektorientierte Programmiersprache, die sich durch einige zentrale Eigenschaften
auszeichnet. Diese machen sie universell einsetzbar und für die Industrie als robuste
Programmiersprache interessant. Da Java objektorientiert ist, spiegelt es den Wunsch der
Entwickler wieder, moderne und wiederverwertbare Softwarekomponenten zu programmieren.
1.3.1 Die virtuelle Maschine
Zunächst ist Java eine Programmiersprache wie jede andere auch. Nur im Gegensatz zu
herkömmlichen Programmiersprachen, die Maschinencode für eine spezielle Plattform
generieren, erzeugt der Java-Compiler Programmcode für eine virtuelle Maschine, den
sogenannten Bytecode. Bytecode ist vergleichbar mit Mikroprozessorcode für einen erdachten
Prozessor, der Anweisungen, arithmetische Operationen, Sprünge und weiteres kennt. Dieser
virtuelle Prozessor wurde mittlerweile auch in Silizium gegossen – eine Entwicklung, die
verstärkt von Sun, beziehungsweise Lizenznehmern verfolgt wird. Der Prototyp dieses Prozessors
(genannt PicoJava) ist verfügbar und findet bald Einzug in sogenannte Network-Computer. Das
sind Computer ohne bewegliche Peripherie, wie Festplatten, die als Terminal am Netz hängen.
Bei der Entwicklung des Prozessors stand nicht die maximale Geschwindigkeit im Vordergrund,
sondern die Kosten pro Chip, um ihn in jedes Haushaltsgerät einzubauen zu können. Das
Interessse an einem Java-On-A-Chip ist inzwischen stark zurückgegangen.
Damit aber der Programmcode des virtuellen Prozessors ausgeführt werden kann, muss ein
Interpreter die Befehlsfolgen dekodieren und ausführen. Dies nennen wir dann virtuelle
Maschine5. Somit ist Java eine compilierte, aber auch interpretierte Programmiersprache – von
5
Auch die erhabene OO-Sprache Smalltalk bedient sich einer virtuellen Maschine.
der Hardwaremethode einmal abge sehen. Der Compiler, der von Sun selbst in Java geschrieben
ist, generiert den Bytecode. Doch nicht nur aus der Programmiersprache Java lässt sicht Bytecode
erzeugen. Zur Zeit gibt es bei verschiedenen Herstellern Entwicklungen von C- und ADACompilern, die Bytecode erstellen. Die Entwicklergruppe von EIFFEL unter der Leitung von
Bertrand Meyer wird in den nächsten Versionen J-Code unterstützen. Ebenso gibt es eine
Scheme-Umgebung, die komplett in Java programmiert ist. Der Compiler erstellt für den LISP Dialekt ebenfalls Java-Bytecode. Mittlerweile ist Java nicht nur interpretierte Sprache, sondern
zugleich auch interpretierende Sprache. Das zeigen unterschiedliche Computer- und ProzessorEmulations-Programme.6
Nach der Übersetzungsphase führt die Laufzeitumgebung (auch Run-Time-Interpreter genannt),
die Java Virtuelle Maschine, den Bytecode aus7. Das Interpretieren bereitet noch
Geschwindigkeitsprobleme, da das Erkennen, Dekodie ren und Ausführen der Befehle Zeit kostet.
Im Schnitt sind Java-Programme drei bis zehn mal langsamer als C oder C++ Programme. Die
Technik der Just-In-Time (JIT) Compiler8 mildert das Problem. Ein JIT-Compiler beschleunigt
die Ausführung der Programme, indem die Programmanweisungen der virtuellen Maschine für
die physikalische übersetzt werden.
Es steht anschließend ein auf die Architektur angepasstes Programm im Speicher, welches ohne
Interpretation schnell ausgeführt wird. Auch Netscape übernahm im Windows-Communicator9
4.0 einen JIT (ein Produkt von ehemals Symantec), um an Geschwindigkeit zuzulegen – obwohl
diese Variante noch nicht den gesamten 1.1 Standard beherrschte. (Erst in der Version 4.06 von
Netscape kam die volle Unterstützung für Java 1.1.) Mit dieser Technik liegt die Geschwindigkeit
zwar in vielen Fällen immer noch unter der von C, aber der Abstand ist geringer. Nur durch den
Einsatz der PicoJava-Prozessoren lassen sich um fünfzigmal schnellere Ausführungszeiten
erzielen10.
1.3.2 Kein Präprozessor
In C(++) ersetzt ein Präprozessor Makros etwa für bedingte Complierung oder Header-Dateien.
Einen Präprozessor gibt es in Java nicht und entsprechend keine Header-Dateien. Diese sind in
6
Dies beweist Hob, ein portabler ZX-Spectrum Emulator, der komplett in Java geschrieben ist. Auf der
Web-Seite http://www.engis.co.uk/stuff/hob gibt es noch viele Spiele dazu, die als Applet
ausprobiert werden können.
7
Die Idee des Bytecodes (Framemaker schlägt hier als Korrekturvorschlag ›Bote Gottes‹ vor) ist schon alt.
Die Firma Datapoint schuf um 1970 die Programmiersprache PL/B, die Programme auf Bytecode
abbildet. Auch verwendet die Orginalimplementation von UCSD-Pascal, etwa Anfang 1980, einen
Zwischenencode – kurz p-code.
8
Diese Idee ist auch schon alt: HP hatte um 1970 JIT -Compiler für BASIC-Maschinen.
9
Netscape hört es gar nicht gerne, wenn der Web-Browser als Navigator bezeichnet wird. Hier im Tutorial
verwenden wir dies allerdings synonym. Die Firma versteht den Communicator als Web-Lösung, die
nicht nur aus einem Web-Browser besteht. Es wird gemunkelt, dass Mitarbeiter aus der Firma
rausfliegen, wenn sie das Wort ›Navigator‹ nur in den Mund nehmen ...
10
Es ist schon paradox, eine plattformunabhängige Sprache vorzuschlagen und dann einen Prozessor zu
entwickeln, der anschließend das Problem der langsamen Ausführung löst.
Java nicht nötig, da der Compiler die benötigten Informationen über die Software-Schnittstellen
von Klassen direkt aus den Klassendateien liest. Ein schmutziger Trick wie
#define private public
#include "allesMoegliche"
oder Makros, die Fehler durch doppelte Auswertung erzeugen, sind damit von vorne herein
ausgeschlossen. Im Übrigen findet sich der Private/Public-Hack im Quellcode von Suns
StarOffice. Mit der oberen Definition wird jedes Auftreten von private durch public ersetzt mit
der Konsequenz, dass der Zugriffsschutz ausgehebelt ist.
Leider ist damit auch eine bedingte Compilierung mit #ifdef nicht mehr möglich. Dies führt
vereinzelt dazu, dass ein externer Präprozessor benutzt werden muss, um den Quellcode
entsprechend zu bearbeiten.
1.3.3 Überladene Operatoren
Wenn wir Operatoren, wie das Plus- oder Minuszeichen verwenden und damit Ausdrücke
zusammenfügen, machen wir dies meistens mit bekannten Rechengrößen. So fügt ein Plus zwei
Ganzzahlen, aber auch zwei Fließkommazahlen (Gleitkommazahlen) zusammen. Einige Programmiersprachen –meistens Skriptsprachen – erlauben auch das ›Rechnen‹ mit Zeichenketten,
mit einem Plus können diese beispielsweise aneinandergehängt werden. Die meisten
Programmiersprachen erlauben es jedoch nicht, die Operatoren mit neuer Bedeutung zu versehen
und damit Objekte zu verknüpfen. In C++ jedoch ist das Überladen von Operatoren möglich,
sodass etwa das Pluszeichen dafür genutzt werden kann, zum Beispiel geometrische PunktObjekte zu addieren. Dies ist praktisch bei umfangreicheren Rechnungen mit Objekten, da dort
nicht über die Methoden umständliche Verbindungen geschaffen werden, sondern über ein
Operatorzeichen angenehm kurze. Obwohl zuweilen ganz praktisch – das Standardbeispiel sind
Objekte für komplexen Zahlen und Brüche –, verführt die Möglichkeit, Operatoren durch den
Programmierer zu überladen, oft zu unsinnigem Gebrauch. In Java ist daher das Überladen der
Operatoren bisher nicht möglich. Es kann aber gut sein, dass dies sich in Zukunft ändert.
Die Grundrechenarten sind für Ganzzahlen und Gleitkommazahlen überladen und ebenso ein
einfaches Und, Oder oder Xor für Ganzzahlen und boolesche Werte. Der einzige auffällige
überladene Operator in Java für Objekte ist das Pluszeichen bei Strings. Zeichenketten können
damit leicht zusammengesetzt werden. Informatiker verwenden in dem Zusammenhang auch
gerne das Wort Konkatenation (selten Katenation). Bei einem String "Hallo " und "du da" ist
"Hallo du da" die Konka tenation der Zeichenketten.
1.3.4 Zeiger und Referenzen
In Java gibt es keine Zeiger (engl. Pointer) wie sie aus anderen Programmiersprachen bekannt
und gefürchtet sind. Da eine objektorientierte Programmiersprache aber ohne Zeiger nicht
funktioniert, werden Referenzen eingeführt; eine sichere Version des Pointers. Eine Referenz ist
ein stark typisierter Zeiger, der seinen Typ nicht ändern kann.
Beispiel: Dass das Pfuschen in C++ leicht möglich ist, und wir Zugriff auf private Elemente über
eine Zeigerarithmetik bekommen kö nnen, zeigt das folgende Programm. Für uns JavaProgrammierer ist dies ein abschreckendes Beispiel.
#include <string.h>
#include <iostream.h>
class Ganz_unsicher {
public:
Ganz_unsicher() { strcpy(passwort, "geheim"); }
private:
char passwort[100];
};
int main()
{
Ganz_unsicher gleich_passierts;
char *boesewicht = (char*)&gleich_passierts;
cout << "Passwort: " << boesewicht << endl;
}
Diese sehr gepfuschte Art demonstriert, wie problematisch der Einsatz von Zeigern sein kann.
Der Zeiger, der zunächst als Referenz auf die Klasse Ganz_unsicher gedacht war, mutiert durch
die explizite Typumwandlung zu einem Char-Pointer boesewicht. Problemlos können über
diesen byteweise die Zeichen aus dem Speicher ausgelesen werden. Das erlaubt auch indirekt
Zugriff auf die privaten Daten. In Java ist dies nicht möglich, die Implementierung ist sicher, es
gibt keinen Zugriff auf private Daten einer Klasse. Zunächst einmal würde der Compiler eine
Fehlermeldung geben oder das Laufzeitsystem eine Ausnahme (Exception) auslösen, wenn
beispielsweise eine Klasse über das Netz geladen wird.
1.3.5 Garbage-Collektor
In Programmiersprachen wie C++ lässt sich etwa die Hälfte der Fehler auf falsche SpeicherAllokation zurückführen. Arbeiten mit Objekten heißt unweigerlich: Anlegen und Löschen. Die
Java-Laufzeitumgebung sorgt sich jedoch selbstständig um die Verwaltung dieser Objekte – die
Konsequenz ist: Sie müssen nicht freigegeben werden, ein Garbage -Collektor (kurz GC) entfernt
sie. Der GC ist Te il des Laufzeitsystems von Java. Das Generieren eines Objekts in einem Block
mit anschließender Operation zieht eine Aufräumaktion des GCs nach sich. Nach Verlassen des
Wirkungsbereichs erkennt das System das nicht mehr referenzierte Objekt. Ein weiterer Vorteil
für den GC: Bei der Benutzung von Unterprogrammen werden oft Objekte zurückgegeben und in
herkömmlichen Programmiersprachen beginnt wieder die Diskussion, welcher Programmteil das
Objekt jetzt löschen muss oder ob es nur eine Referenz ist. In Java ist das egal, auch wenn ein
Objekt nur Rückgabewert einer Methode ist (anonymes Objekt).
Der GC ist ein spezieller Prozess, der Objekte markiert, auf die nicht mehr verwiesen wird. Dann
entfernt er sie von Zeit zu Zeit. Damit macht der Garbage-Collektor die Funktionen free() aus C
oder delete() aus C++ überflüssig. Wir können uns über diese Technik freuen, denn viele
Probleme sind damit verschwunden. Nicht freigegebene Speicherbereiche gibt es in jedem
größeren Programm und falsche Destruktoren sind vielfach dafür verantwortlich. (Hier sollte
nicht verschwiegen werden, dass es auch ähnliche Techniken für C(++) gibt. Ein bekannter
Garbage-Collektor von Boehm-Demers-Weiser ist unter http://reality.sgi.com/boehm_mti/gc.html
zu finden. 11 Auch die X11-Bibliothek benutzt eine solche Technik. Dort sind die malloc()- und
free() Funktionen einfach durch neue Methoden ausgetauscht.)
1.3.6 Ausnahmenbehandlung
Java unterstützt ein modernes System, um mit Laufzeitfehlern umzugehen. In der
Programmiersprache wurden Exceptions eingeführt: Objekte die zur Laufzeit generiert werden
und einen Fehler anzeigen. Diese Problemstellen können durch Programmkonstrukte gekapselt
werden. Die Lösung ist in vielen Fällen sauberer als die mit Rückgabewerten und unleserlichen
Ausdrücken im Programmfluss. In C++ gibt es ebenso Exceptions, diese werden aber nicht so
intensiv wie in Java benutzt.
11
Dieser ist aber konservativ, d.h. er findet nicht garantiert alle unerreichbaren Speicherbereiche, sondern nur einige.
Aus Geschwindigkeitsgründen wird die Überwachung von Array-Grenzen (engl. RangeChecking) in C(++) 12 nicht durchgeführt. Und der fehlerhafte Zugriff auf das Element n + 1
eines Felds der Größe n kann zweierlei bewirken: Ein Zugriffsfehler tritt auf, oder, viel
schlimmer, andere Daten werden beim Schreibzugriff überschrieben und der Fehler ist nicht
nachvollziehbar. Schon in PASCAL wurde eine Grenzüberwachung mit eincompiliert. Das Laufzeitsystem von Java überprüft automatisch die Grenzen eines Arrays. Diese Überwachungen
können nicht, wie es diverse PASCAL-Compiler erlauben, abgeschaltet werden, sondern sind
immer eingebaut. Eine clevere Laufzeitumgebung kann herausfinden, ob keine Überschreitung
möglich ist und diese Abfrage dann wegoptimieren.
1.3.7 Objektorientierung in Java
Die Sprache Java ist nicht bis zur letzten Konsequenz objektorientiert , so wie Smalltalk es
vorbildlich zeigt. Primitive Datentypen (beispielsweise Ganzzahlen oder Fließkommazahlen)
werden nicht als Objekte verwaltet. Der Grund ist vermutlich in der Performance zu sehen. Der
Compiler ist somit besser in der Lage, die Programme zu optimieren.
Java ist als Sprache entworfen worden, die es einfach machen soll, fehlerfreie Software zu
schreiben. In C-Programmen erwartet uns statistisch gesehen alle fünfundfünfzig Programmzeilen
ein Fehler. Selbst in großen Softwarepaketen, die erst ab einer Millionen Code-Zeilen anfangen,
findet sich, unabhängig von der zu Grunde liegenden Programmiersprache, im Schnitt alle
zweihundert Programmzeilen ein Fehler. Selbstverständlich gilt es, diese Fehler zu beheben,
obwohl bis heute noch keine umfassende Strategie für Softwareentwicklung im Großen gefunden
wurde. Viele Arbeiten der Informatik beschäftigen sich mit der Frage, wie tausende
Programmierer über Jahrzehnte miteinander arbeiten und Software entwerfen können. Dieses
Problem ist nicht einfach zu lösen und wurde im Zuge der Softwarekrise in den sechziger Jahren
heftig diskutiert.
1.3.8 Java-Security-Model
Das Java-Security-Model gewährleistet den sicheren Programmablauf auf verschiedensten
Ebenen. Der Verifier liest Code und überprüft die strukturelle Korrektheit und Typsicherheit. Der
Klassenlader (engl. Class Loader) lädt Dateien entweder vom externen Medium wie Festplatte
oder auch Netzwerk und überträgt die Java-Binaries zum Interpreter. Dort überwacht ein
Security-Manager Zugriffe auf das Dateisystem, die Netzwerk-Ports, externe Prozesse und die
Systemressourcen. Treten Sicherheitsprobleme auf, so werden diese durch Exceptions zur
Laufzeit gemeldet. Das Sicherheitsmodell ist vom Programmierer erweiterbar.
[ pic: comix\SecurityManager.tif ]
1.4
Java im Vergleich zu anderen Sprachen
Beschäftigen sich Entwickler mit dem Design von Programmiersprachen, so werden häufig
existierende Spracheigenschaften auf ihre Tauglichkeit überprüft und dann in das Konzept
aufgenommen. Auch Java ist eine fließende und sich entwickelnde Sprache, die viele Merkmale
von anderen Sprachen aufweist. Zunächst basierte Java sehr stark auf C++, bis die Entwickler
Inkonsistenzen der Sprache nicht übernehmen wollten. Bisweilen wird Java auch als der Nachfolger von C++ (in der Infix/Präfix-Notation: C++ ++ --13) gesehen. Auf den ersten Blick erinnert
die Syntax sehr stark an C und C++. In der Tat wurden fast alle Anweisungen und Operatoren
übernommen. Da viele Konzepte nur von anderen Programmiersprachen übernommen sind, ist
die Sprache an sich keine Revolution im Jahr 1996. Java vereinigt vielmehr bekannte und
bewährte Konzepte.
12
13
In C++ ließe sich eine Variante mit einem überladenen Operator lösen.
Das heißt, auf C++ ein Bonus rauf (++) und einer wieder runter (--).
Das Klassenkonzept – und damit der objektorientierte (OO-)Ansatz – wurde nicht unwesentlich
durch Simula und Smalltalk inspiriert. Die Schnittstellen (engl. Interfaces), die eine elegante
Möglichkeit der Klassenorganisation bieten, sind an Objective-C angelehnt – dort werden sie
lediglich Protocols genannt. Während in Smalltalk alle Objekte dynamisch verwaltet werden und
in C++ der Compiler statisch Klassen zu einem Programm kombiniert, mischt Java auf eine sehr
elegante Art und Weise dynamisches und statisches Binden. Klassen können zur Laufzeit geladen
werden, Methoden auch auf anderen Rechnern ausgeführt und Ergebnisse über das Netz
geschickt werden14.
Nicht direkt mit der Sprache, aber mit der Anwendung sind die Threads verbunden, das sind
leicht zu erzeugende Ausführungsstränge, die unabhängig voneinander arbeiten können. Diese
leichtgewichtigen Prozesse gibt es beispielsweise in Solaris.
1.4.1 Java und JavaScript
Obacht ist beim Gebrauch des Namens ›Java ‹ zu geben. Nicht alles, bei dem Java im Wortstamm
auftaucht, hat auch tatsächlich was mit Java zu tun; JavaScript hat keinen Bezug zu Java. Die
Programmiersprache wurde von Netscape entwickelt. Dazu aus dem Buch ›The Java Developer´s
Resource‹ ein Zitat: »Java and JavaScript are about as closely related as the Trump Taj Mahal in
Atlantic City is to the Taj Mahal in India. In other words Java and JavaScript both have the word
Java in their names. JavaScript is a programming language from Netscape which is incorporated
in their browsers. It is superficially similar to Java in the same way C is similar to Java but differs
in all important respects.«
1.4.2 Normierungsversuche
Ein Normierungsversuch, aus Java eine Programmiersprache unter ISO -Norm zu machen, ist
unter anderem daran gescheitert, dass Sun den Namen ›Java‹ weiterverwenden wollte. Dies wäre
aber bei der Norm nicht möglich gewesen. Das Argument ist aber etwas schwach. In der Praxis
gibt es auch andere Programme, die bei den Anwendern den offiziellen ISO -Namen tragen und in
der Öffentlichkeit ihren ursprünglich aussprechbaren Namen behielten. Die ISO-Norm ist
gescheitert. Auch die zweite Normierungsinstanz ECMA lehnte eine Standardisierung ab, da Sun
unter allen Umständen verhindern möchte, dass Java in verschiedene Dialekte zerfällt. Aus
diesem Grunde hat sich Sun die alleinige Kontrolle über die Weiterentwicklung des JavaStandards vorbehalten. Ein öffentlicher Standard hat aber gerade die Eigenschaft, dass Mitglieder
neue Ideen einbringen können. Als Antwort auf Microsofts Forderung, das Java-Warenzeichen
allgemein freizugeben, fordert Sun lapidar, dass auch Microsoft die Windows-APIs und das
Warenzeichen frei geben sollten. Kein Kommentar von MS!
1.5
Die Rolle von Java im Web
Es ist nicht untertrieben, dem Web eine Schlüsselposition in der Verbreitung von Java
zuzuschreiben. Ohne die weltweite Verbreitung des JDK von Sun wäre Java eine
Nischenprogrammiersprache mit ungewisser Zukunft. Populär wurde Java in erster Linie durch
die Applets, Java-Programme, die vom Brow ser dargestellt werden. Netscape war eine der ersten
Firmen, die einen Java-Interpreter in ihrem Web-Browser integrierten. Auch der InternetExplorer (kurz IE) von Microsoft akzeptiert Applets, doch er kommt nicht über die Version 1.1.4
hinaus. Da jedoch der IE sehr verbreitet ist, hat sich die Begeisterung über Applets weitgehend
verflüchtigt. Für Softwareentwickler ist es sehr aufwändig, für die gesamte existierende Vielfalt
der Java -Versionen zu programmieren.
Verweise auf Applets werden in eine HTML-Datei eingebettet und der Browser holt sich
eigenständig die Applets über das Netz und führt sie mit seiner virtuellen Maschine aus. Obwohl
Applets ganz normale Java-Programme sind, gibt es verständlicherweise einige Einschränkungen.
14
Diese Möglichkeit ist unter dem Namen ›RMI‹ (Remote Methode Invocation) bekannt. Bestimmte
Methoden können über das Netz miteinander kommunzieren.
So dürfen Applets nicht – es sei denn sie sind signiert – auf das Dateisystem zugreifen und wild
irgendwelche Dateien löschen, was Java-Applikationen problemlos können.
1.6
Aufkommen von Stand-Alone -Applikationen
Obwohl Java durch das Web bekannt geworden ist und dort viele Einsatzgebiete liegen, ist es
nicht auf dieses Medium beschränkt. Viele Firmen entdecken ihre Zuneigung zu dieser Sprache
und können sich nicht mehr lösen; unter ihnen IBM. Es hat sich gezeigt, dass die Devise ›write
once, run anywhere‹ auf der Serverseite weitgehend zutrifft. Java ist inzwischen wohl die
wichtigste Sprache für die Gestaltung von Internet-Applikationen auf dem Server. Sie unterstützt
strukturiertes und objektorientiertes Programmieren und ist ideal für größere Projekte, bei denen
die Unsicherheiten von C++ vermieden werden sollen.
Nach dem anfänglichen Hype, heißt es heute paradoxerweise oft, dass Java zu langsam für ClientAnwendungen sei. Dabei sind die virtuellen Maschinen auf Grund der Entwicklung von JITCompilern und der Hotspot-Technologie in den letzten Jahren sehr viel schneller geworden. Auch
die Geschwindigkeit der Prozessoren ist ständig weitergewachsen. Anwendungen wie die in (fast)
reinem Java geschriebene Entwicklungsumgebung JBuilder zeigen, dass auch auf der Client-Seite
nun Java-Anwendungen in angemessener Geschwindigkeit laufen können – entsprechend viel
Arbeitsspeicher vorausgesetzt. Da ist Java nämlich mindestens so anspruchsvoll wie das neueste
Betriebssystem von MS.
1.7
Entwicklungs - und Laufzeitumgebungen
In der Gründerzeit von Java gab es nur den spartanischen Java -Compiler von Sun.
Glücklicherweise hat sich die Situation mittlerweile verbessert – viele Hersteller versuchen eine
schnelle Mark zu machen und stürmen mit Compilern und Integrierten Entwicklungsumgebungen
(IDE) auf den Markt.
1.7.1
Aller Anfang mit dem Java SDK
Alles begann mit dem Compiler und der JVM von Sun. Der Compiler unterstützt zwar den
gesamten (hausgemachten) Standard, ist aber, da er selbst in Java programmiert ist, langsam.
Somit bedarf es für eine Architektur nur eines Interpreters und schon können mit dem SunCompiler Programme übersetzt werden. Sun liefert das Paket aus Compiler und Interpreter
kostenlos aus. Sie unterteilen ihr Produkt dabei in drei Bereiche:
§
Java 2 Standard Edition (J2SE). Sie ist die normale Softwareumgebung und definiert das Java
2 Software Development Kit, kurz SDK. Geläufig ist immer noch die Bezeichnung JDK
(Java Development Kit), die aber mittlerweile veraltet ist.
§
Java 2 Enterprise Edition (J2EE). Die Enterprise Edition ist ein Aufsatz auf das J2SE und
integriert zusätzliche Pakete wie Enterprise Java Beans, Servlets, JSP, Java-Mail-API, JTS.
§
Micro Edition (J2ME). Die Micro Edition ist eine kleine Laufzeitumgebung für kleine PDAs
oder Telefone. Für den PalmPilot liegt eine Referenzimplementierung vor. Die J2ME löst
Personal Java und Embedded Java ab.
Das erste JDK 1.0.2 wurde 1996 veröffentlicht. Seit den ersten Versionen hat sich die Sprache
Java nicht wesentlich verändert. Wer mehr über den historischen Ablauf und die Versionen
erfahren
möchte,
kann
unter
folgenden
Webseiten
nachschlagen:
http://www.weigl.de/seminar/bfi-peters/java/historie.htm. Bald wird uns Sun mit der
Version 1.4 beglücken.
1.7.2
Kaffe von Transvirtual Technologies
Neben der Java VM von Sun liefert die Firma Transvirtual Technologies (http://
www.transvirtual.com/kaffe.htm ) eine
JVM mit dem Namen Kaffe (http://
www.kaffe.org) aus, die unter Open Source steht. Der Name wurde gewählt, da der Anfang der
Entwicklung im Elchland liegt und Kaffe das schwedische Wort für Kaffee ist. Transvirtual
Technologies hat zwei JVMs im Angebot: Eine offene Version, die Desktop Edition, die unter der
GPL steht, und eine Custom Edition für eingebettete Systeme. Insgesamt wird damit eine große
Anzahl von Prozessoren (x86, StrongARM, MIPS, m68k, Sparc, Alpha, PowerPC, PARisc) und
Feldfunktion geändert
Betriebssystemen (Embedded Linux, VxWorks, LynxOS, SMX, ThreadX, Linux, DOS, Windows
NT 4.0, Windows 98, Windows 2000, Windows CE, Solaris) unterstützt.
Die Implementierung hält sich komplett an den Java Standard und ist kompatibel zum Personal
Java 1.1 System. Sie enthält nicht nur die virtuelle Maschine mit JIT-Compiler, sondern auch
native Bibliotheken für Grafik, Ein-/Ausgabe, Dateimanagement und Netzwerkunterstützung.
Das Gute dabei ist, dass der Einblick durch Open Source möglich ist. Wir werfen daher immer
wieder einen Blick in die Quellcodes und vergleichen Implementierungsstile von Sun und
Transvirtual Technologies.
Microsoft hat eine nicht näher benannte Summe in Transvirtual Technologies investiert. Da
Microsoft aus Lizenzgründen kein Java mehr entwickeln darf, sichert sich der Konzern den
Zugang zu einer modernen JVM. Denn die Laufzeitumgebung von Kaffe arbeitet nicht nur
herkömmliche Javaprogramme ab, sondern auch die MS-Erweiterungen, wie J/Direct, die
Windows-typische Eigenschaften nutzen. Die Unternehmen Transvirtual, Microsoft und HewlettPackard sowie andere kleinere Firmen haben sich zum J-Consortium zusammengeschlossen, um
einen alternativen Standard zu etablieren.
1.7.3
JBuilder
JBuilder ist ein Borland-Produkt zur Entwicklung von Java-Applikationen unter Windows, Linux
und Solaris. Es sollten 128 MB Arbeits speicher vorhanden sein. Die Arbeitsgeschwindigkeit ist
gut und optimal ab einem Rechner mit 256 MB und >500 MHz. Das Produkt kommt mit Editor,
Compiler, Debugger, visuellen Designern und Wizards daher. Die IDE verfügt über zahlreiche
Eigenschaften, die den Entwicklungszyklus von professionellen Anwendungen verkürzen. Dazu
zählen folgende Eigenschaften:
§
Performante Entwicklung durch die aktuelle Java 2 Version 1.3. Die HotSpot-Technologie
wird unterstützt.
§
Der Debugger unterstützt unter anderem Variablenüberprüfung in Kurzhinweisen,
Auswertung von Methodenaufrufen, Inline -Variablenzuweisung.
§
GUI-Builder zum Entwurf von grafischen Oberflächen mit voller Swing-Unterstützung.
§
300 wiederverwendbare JavaBeans inklusive Quelltext.
§
Archiv-Builder für die Weitergabe von Jar-Archiven.
§
AppBrowser für vereinfachtes Code-Management und die eigene Technik CodeInsight. Diese
beugt Syntax-Fehlern vor, indem passende Methoden herausgesucht werden.
§
Mit einer Syntaxhervorhebung lässt sich fehlerhafter XML-Code leicht ausmachen. Mit
einem Strukturfenster für XML-Dateien ist eine einfache Navigation möglich.
§
Frei konfigurierbare Tastatur-Layouts und kontextsensitive Hilfe. Beigefügte Tastaturlayouts
für CUA, Emacs, Brief und Visual Studio.
§
Mit einem Projektmanager auf XML-Basis wird die Entwicklung im Team beschleunigt und
vereinfacht. In der Enterprise Edition ist das CVS (Concurrent Versions System) mit einer
Reihe von CVS-Tools enthalten.
§
Mit Open Tools lassen sich Werkzeuge und Komponenten anderer Anbieter einfach
integrieren. Damit können Entwickler die Oberfläche ihren Gewohnheiten anpassen.
Passende Software lässt sich auf der Borland-Homepage herunterladen.
§
Komfortable Entwicklung von dynamischen Webseiten mit InternetBeans, Servlets und Java
Server Pages. Der Tomcat 3.1 Servlet/JSP Server ist integriert und testet direkt und
unkompliziert die Seiten.
§
Unterstützung von verteilten E-Business-Applikationen durch EJBExpress, Entity Bean
Modeller und Wizards. Integrierte Application-Server sind Inprise Application Server und
WebLogic Server 5.1 von BEA. Mit dem Entity Bean Modeler können vorhandenen Tabellen
Entity-Beans zugeordnet werden.
§
Objekt-relationales DBMS JDataStore in purem Java. Mit einem Connection-Pool wird eine
verbesserte Leistung erlangt.
§
Remote Debugging erlaubt die Fehlersuche in Java Applikationen per Fernzugriff. So können
einfach Applikationen auf Kleinrechnern wie PDAs getestet werden, die mit Java 2 JPDA
entwickelt wurden.
Zur Zeit liegt der JBuilder in der Version 5 und drei Produktlinien vor: Enterprise, Professionell
und Foundation. Die Foundation Version bietet eine Teilmenge der Funktionen aus der
Professional- beziehungsweise Enterprise-Edition. Der Vergleich zeigt, welcher Unterschied zu
den Versionen vorliegt.
§
JBuilder Professionell. JavaBeans mit BeansExpress erstellen, Datenbankanwendungen
entwerfen, benutzerdefinierte Daten-Provider schreiben, benutzerdefinierte Daten-Resolver
schreiben, Packages in der DataExpress-Bibliothek, Packages in der JDataStore-Bibliot hek.
§
JBuilder Enterprise. Verteilte Anwendungen entwickeln, Verteilte Anwendungen debuggen,
Einführung in die EJB-Entwicklung, Enterprise-Beans, Versionskontrolle verwalten.
Installation und Registrierung
Die Borland JBuilder Foundation Edition liegt unter http://www.borland.com/ jbuilder/foundation
zum kostenlosen Download bereit. Neben der reinen Entwicklungsumgebung lassen sich
Dokumentation und Beispiele laden. Sobald das Installationsarchiv auf dem Rechner liegt können
wir die Installation starten.
Tipp: Das Installationsverzeichnis sollte keine Leerzeichen im Pfadnamen tragen.
Bevor wir die Version nutzen können, müssen wir noch einen Registrierungsschlüssel
beantragen. Dazu muss unter http://www.borland.com/jbuilder/foundation/download die
Registrierung ausgefüllt werden. Anschließend wird eine E-Mail versandt, die eine
Seriennummer und einen Lizenz-Schlüssel enthält. Wird JBuilder zum ersten mal ausgeführt,
geben wir Name und Firmenbe zeichnung ein. Anschließend müssen die Seriennummer und der
Lizenz-Schlüssel eingetragen werden.
1.7.1 Die Entwicklungsumgebung von Sun: Forté
In den Anfängen der Java-Bewegung brachte Sun mit dem Java-Workshop eine eigene
Entwicklungsumgebung auf den Markt. Die Produktivitätsmöglichkeiten waren jedoch im
Vergleich zu JBuilder oder Visual Café gering. Das änderte sich, als Sun das kalifornische
Softwarehaus Forté übernahm und damit wieder eine bedeutende Rolle bei den JavaEntwicklungsumgebungen einzunehmen begann. Sun interessierte sich besonders für Fortés
Produkt SynerJ, das im Kern die IDE enthält.
Forté gibt es in drei Ausführungen: Community Edition, Internet Edition und Enterprise Edition.
Die Community Edition steht zum kostenlosen Download unter http://www.sun.com/forte zur
Verfügung. Die IDE ist komplett in Java implementiert und modular aufgebaut, so dass
Entwickler zusätzliche Bausteine implementieren können. Die Internet und Enterprise Edition
unterstützt die J2EE und hilft bei der Erstellung von Datenbank- und JSP/Servlets, EJB, CORBA,
RMI und JNDI.
1.7.4
Umgebungen von IBM
Den Programmierern von IBM, der größten Softwareschmiede der Welt, ist Java mittlerweile so
ans Herz gewachsen, dass sie sich von Java nicht trennen können und nur noch damit
programmieren wollen. IBM geht dabei so weit, dass sie nicht nur einen, sondern gleich zwei
Java Compiler auf den Markt bringen. Der erste ist der High Performance Compiler for Java. Der
IBM Compiler erzeugt neben den herkömmlichen Klassendateien auch Exe-Dateien, also
Windows-Executables. Neben diesem hervorragenden Übersetzer hat IBM noch einen
besonderen Leckerbissen parat: Den Compiler Jikes, der im Quellcode unter der Open Source
Lizenz vorliegt. Da er ohne problematische C++ Eigenschaften erstellt ist, lässt er sich unter fast
jedem Betriebssystem übersetzen. Binärdateien liegen für Win32, Linux, AIX und OS/2 auf dem
Server http://www.ibm.com/research/jikes bereit. Der Quellcode (jikesos.tar.gz) ist mit etwa
einem halben Megabyte recht übersichtlich und schnell geladen. Für den allgemeinen Einsatz ist
Jikes gut geeignet, da er sehr schnell ist, allerdings hat er einige Probleme mit Programmen, die
vom Sun Compiler akzeptiert werden. Dies führt zu spannenden Diskussionen, da IBM von sich
behauptet, einen Compiler geschrieben zu haben, der aus Javaquellcode, definiert in The Java
Language Specification (Addison-Wesley 1996), Bytecode erstellt, wie unter The Java Virtual
Machine Specification (Addison-Wesley 1996) spezifiziert. Leider ist in einigen Punkten die
Sprachspezifikation unzureichend, so dass es zu unterschiedlichen Auslegungen kommt. Ein
weiterer Nachteil ist die fehlende Optimierung, die durch den Schalter -O nicht eingeschaltet
wird. Die Option bedeutet lediglich, dass keine Debug-Informationen angelegt werden. Dies ist
irreführend, da sich unter dem Sun Compiler auch eine Optimierung versteckt; dieser war
allerdings schwer anzusehen, wo sie nun wirklich optimiert. Seit SDK 1.2 bedeutet ›-O‹ bei Sun
lediglich, dass keine Debug-Infos erzeugt werden.
1.7.5
Visual Café von WebGain (ehemals Symantec)
Ein weitere Umgebung von WebGa in (ehemals ein Produkt der Firma Symantec) ist ›Visual
Café‹ unter http://www.visualcafe.com/Products/VisualCafe_Overview.html. Der Übersetzer
besticht vor allen Dingen durch rasante Compilerzeiten und der implementierte JIT-Compiler
verspricht gute Laufzeiten. Nicht umsonst haben Netscape und Sun den JIT für ihre eigenen
Produkte lizensiert. WebGain bietet drei Produkte in der Visual-Reihe an: Visual Café 3.1
Enterprise Suite und Visual Café 4 Expert Edition sowie Visual Café 4 Standard Edition. Das
zusätzliche Produkt Structure Builder ist ein Hilfsprogramm zur Erstellung von Enterprise
JavaBeans. Eine freie Demo-Version von Visual Café Enterprise Suite lässt sich nach Ausfüllen
der Registrierung unter http://www.visualcafe.com/Company/registration_form.htm
herunterladen. Aus meiner Erfahrung mit den Vorgängerprodukten würde ich zur Zeit nicht zu
Symantec Café tendieren.
1.7.6
Ein Wort zu Microsoft, Java und zu J++
Der Hauptunterschied zwischen dem JDK von Sun und Microsoft liegt darin, dass Applikationen,
die unter dem Microsoft Development Kit erstellt wurden, nicht zwangsläufig auf anderen
Plattformen wie MacOS, UNIX und Netscape Navigator lauffähig sind. Da Microsoft mal wieder
gegen alle Standards ist, sollte der J++-Compiler daher nicht verwendet werden. Microsoft fügte
neue Schlüsselwörter (multicast und delegate) hinzu, entfernte einige Java Methoden und fügte
weitere Methoden und Eigenschaften hinzu. Dies ist zum Beispiel J/Direct. Microsoft versucht,
der plattformunabhängigen Programmiersprache den Windows-Stempel zu verpassen. Denn
Programme mit J/ Direct laufen nur noch unter Windows-Plattformen. Mit J/Direct können Programmierer aus Java heraus direkt auf Funktionen aus dem Win32-API zugreifen und damit reine
Windows-Programme in Java programmieren. So haben diese Programme auch Lese- und
Schr eibzugriff auf die Festplatte – ein Schrecken für alle Java-Programmierer. Durch Integration
von DirectX soll die Internet-Programmiersprache Java multimediafähig gemacht werden. Es
bleibt abzuwarten, wie es mit der Unterstützung von Java seitens Microsoft weitergeht. Die
Aussagen von Microsoft-Projektleiter Ben Slivka über das Java Development Kit bzw. die Java
Foundation Classes, man müsse »es bei jeder sich bietenden Gelegenheit anpissen« (»pissing on
at every opportunity«) lassen eine harmonische Kooperation mit Sun nicht vermuten. 15
Es laufen Suns Produkte, die JNI und RMI nutzen, nicht mit dem IE 4.0 zusammen. Wegen
diesen Unregelmäßigkeiten darf Microsoft nach richterlicher Anordnung das Java-Logo nicht
mehr in seinen Produkten führen und auch nicht mehr damit werben. Jetzt droht Microsoft
natürlich damit, künftige Java-Versionen nur noch bedingt zu unterstützen. Es war auch ungefähr
zu der Zeit, als Microsoft alle Java-Applets von seinen Web-Seiten nahm – offiziell wegen
mangelnder Geschwindigkeit. Da auch der Netscape Navigator nicht 100% Java unterstützt,
wurde das Java-Logo auch aus diesem Internet-Browser entfernt, um einer Klage im Vorfeld aus
15
Würden wir nicht gerade im westlichen Kulturkreis leben, wäre diese Geste auch nicht zwangsläufi g unappetitlich.
Im alten Mesopotamien steht »pissing on« für »anbeten«. Da jedoch die E-Mail nicht aus dem Zwischenstromland ist,
bleibt die wahre Bedeutung wohl unserer Fantasie überlassen.
dem Weg zu gehen. Letztlich hat Sun sich aber durchgesetzt und Microsofts Java-Variante J++
darf das geschützte Label »100% Java Kompatibel« nicht mehr benutzen.
Die Tageszeitung New York Times berichtete im August 1998 von einem von Microsoft auf Intel
ausgeübten Druck. Es ging dabei um die Frage, ob Microsoft versucht hat, Intel zum Verzicht auf
Technologieentwicklungen zu bewegen, die im Konflikt mit Microsofts Zielen stehen. Ein
internes Papier aus dem Jahr 1995 beschreibt den Druck auf Intel, da Bill Gates (genau der, der
1989 gesagt hat, »OS/2 will be the platform for the 90s.«) fürchtete, Intel würde spezielle Chips
für die Programmiersprache Java bauen, die dann den Konkurrenten Sun Microsystems stärken
würden. Ein vom Intel Manager – der zusammen mit Bill Gates und Intels Ex-Manager Andy
Grove bei der Sitzung anwesend war – verfasstes internes Dokument beschreibt die Drohung:
»Gates machte vage Drohungen über die Unterstützung anderer Plattformen, und am gleichen
Tag kündigte er ein wichtiges Programm an, nämlich den Alpha-Mikroprozessor des IntelKonkurrenten Digital Equipment zu unterstützen. Gates war wütend über die I.A.L. (Intel
Architecture Labs) Internet-Investitionen, und er wollte, dass sie gestoppt werden«.
Eine andere Peinlichkeit aus Redmond lief im November 1998 über die Ticker. Der Optimierer
von J++ erzeugt bei folgendem einfachen Programm zur Berechnung der Fakultät ein falsches
Ergebnis:
public class Fact {
public static int fact( int x ){
if ( x == 1 ){
return 1;
} else {
return( x * fact(x-1) );
}
}
public static void main( String args[] ) {
System.out.println( fact(5) );
}
}
Nach dem Aufruf bekommt der erstaunte Zuschauer als Ergebnis der Berechnung von 5 Fakultät
den Wert 15. Natürlich ist das richtige Ergebnis 120 und nicht 15. Die Reihe beginnt mit 1, 2, 6,
24, 120. Das Ergebnis sieht eher nach 5+4+3+2+1 als nach 5*4*3*2*1 aus. Hier führt wohl der
interne JIT etwas zuviele Optimierungen durch. Leider lässt sich der Just-in-time-Compiler nicht
abschalten, so dass das fehlerhafte Ergebnis bleibt.
Es ist bekannt, dass Microsoft die Entwicklung am J++-Compiler eingestellt hat. Dies zeigt sich
auch darin, dass Microsoft einen Java/Delphi-Klone herstellt: C#. Wir werden von dieser
Programmiersprache sicherlich noch etwas mehr hören.
Direkt ausführbare Programme für Windows compilieren
Eine in Java geschriebene Applikation lässt sich natürlich nur mit der JVM ausführen. Doch
einige Hersteller, unter ihnen Symantec und IBM, haben ihre Compiler so ausgelegt, dass sie
auch direkt unter Windows ausführbare Programme erstellen. Meistens funktioniert das allerdings
nur mit einem Wrapper. Dieser Wrapper ist ein ausführbares Programm und liegt wie eine Schale
um die Java-Klassen. Der Wrapper ruft dann die virtuelle Maschine auf und übergibt ihr die
Klassen.
Bei dem Einsatz von Visual J++ 6.0 gilt es allerdings einige Bedingungen zu beachten. Die .exe
Dateien laufen problemlos auf dem Rechner, auf dem die Software entwickelt wird, doch auf
einem anderen Computer gibt es die Fehlermeldung »Unable to start application-a newer Java
Virtual Machine must be installed«. Welche .dll hier installiert werden muss, ist nirgendwo
beschrieben, und so bleibt nur, die ganze VM von Microsoft zu installieren.
Eine weitere Möglichkeit ist unter Windows der Einsatz einer DLL, die die JVM enthält – sie
wird dann aus einem C-Programm aufgerufen. Dies ist mit JNI möglich.
1.7.7
Kawa
Kawa16 ist eine integrierte Windows-Entwicklungsumgebung für Java, die von Allaire
Corporation vertrieben wird. (Sie haben das Produkt von der Firma Tek-Tools übernommen,
http://www.tek-tools.com/kawa.) Kawa, aktuell ist die Version 5, ist im wesentlichen ein
Editor, der die Schlüsselworte in verschiedenen Farben hervorhebt, eine einfache
Projektverwaltung sowie ein einfacher Klassenbrowser. Da Kawa keinen eigenen Compiler,
Interpreter, Debugge r oder GUI-Builder mitbringt, ist es auf andere Umgebungen angewiesen,
etwa auf das SDK von Sun. Der Vorteil ist, dass sich eine 100%-ige Kompatibilität mit dem
Original ergibt, sich aber auch noch alternative Compiler und Interpreter nutzen lassen. So lässt
sich etwa der Jikes-Compiler von IBM benutzen. Mit dem JDK wird auch der Sun-Debugger JDB
von Kawa in die Umgebung integriert. Auch die Integration der Hilfe-HTML-Seiten gelingt. Der
Tastendruck F1 liefert auf die Methode die passende HTML-Seite der Klasse. Leider sucht sich
der eingebaute HTML-Browser nicht die passende Zeile in der Hilfe heraus. Kawa eignet sich als
einfache Entwicklungsumgebung, falls kein GUI-Builder benötigt wird, sehr gut. Eine
Testversion unter http://www.tek-tools.com/kawa/evaldown.htm ist für dreißig Tage frei.
1.7.2 Die Entwicklungsumgebung CodeGuide
Mein Liebling ist die Entwicklungsumgebung CodeGuide der deutschen Firma Omnicore
Software (http://www.omnicore.com). CodeGuide gibt es seit Februar 2001 in der Version 3.0.
Aktuell ist die Version 3.0.1. Ich habe CodeGuide in Kursen gegenüber anderen Umgebungen
ausgewählt, da der Editor besonders Spracheinsteigern hilft, sich mit der Syntax anzufreunden, da
CodeGuide ähnlich wie moderne Textverarbeitungssysteme fehlerhafte Stellen rot unterkringelt.
Dies ist zur Zeit ein echtes Novum. Zusätzlich bietet es die notwendigen Hilfen beim Entwickeln,
wie etwa automatische Codevervollständigung. CodeGuide ist auch nur ein Aufsatz auf dem
JDK, und kann somit immer auf den neusten Versionen aufbauen. Der Jikes-Compiler ist mit im
Paket eingebunden und andere Umgebungen (wie Kaffe) lassen sich einbinden.
Zu den Nachteilen gehört, dass CodeGuide keine Unterstützung von grafischen Oberflächen
anbietet. Dafür haben wir eine Unterstützung des Mausrades.
Vorraussetzungen
CodeGuide ist ein reines Java-Produkt, welches erstaunlich flüssig seine Arbeit verrichtet. Um
das Javaprogramm kapselt ein Startprogramm den Interpreteraufruf. Für folgende Systeme wird
CodeGuide bisher mit Startern angeboten: Windows Edition (Windows 95, 98, NT (mit
mindestens Service Pack 3), Windows 2000), Linux, Solaris Intel oder Sparc, MacOS X.
Demoversion und Kosten
CodeGuide ist für 30 Tage frei zu benutzen. Dann muss von Omnicore ein Schlüssel bezogen
werden, der CodeGuide freischaltet. Die Lizenzgebühren richten sich nach der Anzahl Entwickler
und dem Status.
Typ
1 - 4 Entwickler
5 - 10 Entwickler
10 und mehr Entwickler
Bildungseinrichtung
16
Preis in US$
299
285
269
[email protected]
Kawa-Kawa, kurz Kawa, ist aber auch die Wurzel eines Strauchs aus der Südsee und dort ein
traditionelles Rauschmittel. Auf Polnisch heißt Kawa einfach Kaffee.
Installation und Programmstart
Wir beschreiben den Vorgang unter Windows. Unter http://www.omnicore.com können wir
CodeGuide als komprimiertes Archiv mit einer Größe von 14 MB laden. Dann kann es wie ein
normales Programm unter Windows installiert werden. Die Installation legt ein Icon auf dem
Desktop und einen Eintrag im System/Programme/Omnicore an. Nach dem ersten Start werden
die Pfade zum JDK automatisch gesucht und eintragen. Jetzt lässt sich ein Demoprojekt anlegen
und alles sofort ohne Konfiguration starten.
1.8
Installationsanleitung für das Java 2 SDK unter Microsoft Windows
Damit Javaprogramme übersetzt und ausgeführt werden können, müssen wir einen Compiler und
Interpreter auf unserem Rechner installiert haben. Das freie JDK von Sun eignet sich zur
Entwicklung von einfachen Programmen sehr gut. Die folgende Installationsanleitung beschreibt,
wo wir das Java 2 SDK beziehen können und wie es installiert wird.
1.8.1
Das Java 2 SDK beziehen
Es gibt unterschiedliche Möglichkeiten, in den Besitz des Java 2 SDK zu kommen. Wer einen
schnellen Zugang zum Internet hat, der kann es sich von den Sun Seiten herunterladen. NichtInternet Nutzer oder Anwender ohne schnelle Verbindungen finden Entwicklungsversionen sehr
häufig auch auf CDs.
Sun bietet auf der Webseite http://java.sun.com/j2se die Java 2 Platform Standard Edition.
Angeboten wird das aktuelle SDK, Dokumentation und einige alte Versionen. Unter
http://java.sun.com/j2se/1.3 kommen wir dann direkt zu der Version 1.3 mit den Versionen
für Solaris SPARC/x86, Linux x86 und Microsoft Windows.
Das
Archiv
für
Windows
existiert
in
zwei
Versionen
unter
http://
java.sun.com/j2se/1.3/download-windows.html. Einmal zum Download als große Datei
j2sdk1_3_0-win.exe (mit der Größe von 30.916.766 Bytes) oder als gestückelter Download zu je
1.44 MB für jeweils eine Diskette. Das macht dann über zwanzig Dis ketten. Die gestückelten
Teile heißen j2sdk1_3_0-win-a.exe bis j2sdk1_3_0-win-w.exe. Sie lassen sich auf der DOSBefehlszeile mit copy /b wieder zusammenhängen.
Beispiel: Zusammenhängen der Teile für das gesamte SDK
C:\> copy /b j2sdk1_3_0-win-a.exe + j2sdk1_3_0-win-b.exe +
j2sdk1_3_0-win-c.exe + j2sdk1_3_0-win-d.exe +
j2sdk1_3_0-win-e.exe + j2sdk1_3_0-win-f.exe +
j2sdk1_3_0-win-g.exe + j2sdk1_3_0-win-h.exe +
j2sdk1_3_0-win-i.exe + j2sdk1_3_0-win-j.exe +
j2sdk1_3_0-win-k.exe + j2sdk1_3_0-win-l.exe +
j2sdk1_3_0-win-m.exe + j2sdk1_3_0-win-n.exe +
j2sdk1_3_0-win-o.exe + j2sdk1_3_0-win-p.exe +
j2sdk1_3_0-win-q.exe + j2sdk1_3_0-win-r.exe +
j2sdk1_3_0-win-s.exe + j2sdk1_3_0-win-t.exe +
j2sdk1_3_0-win-u.exe + j2sdk1_3_0-win-v.exe +
j2sdk1_3_0-win-w.exe
j2sdk1_3_0-win.exe
Am Ende muss eine Datei j2sdk1_3_0-win.exe herauskommen, die die Größe von 30.916.766
Bytes besitzt.
1.8.2
Java SDK installieren
Die ausführbare Datei j2sdk1_3_0-win.exe ist das Installationsprogramm. Es installiert die
ausführbaren Programme wie Compiler und Interpreter sowie die Bibliotheken und Quellcodes.
Die Hilfe ist nicht integriert.
Während der Installation fragt der Installer nach einem Verzeichnis. Wir belassen hier den Pfad
c:\jdk1.3. Anschließend zeigt sich nach der Komplettinstallation ein Dateibaum mit folgendem
Inhalt:
c:\jdk1.3\bin\
c:\jdk1.3\demo\
c:\jdk1.3\include\
c:\jdk1.3\include-old\
c:\jdk1.3\jre\
c:\jdk1.3\lib\
c:\jdk1.3\COPYRIGHT
c:\jdk1.3\LICENSE
c:\jdk1.3\readme.html
c:\jdk1.3\README.txt
c:\jdk1.3\src.jar
c:\jdk1.3\Uninst.isu
Im Unterverzeichnis bin befinden sich Compiler und Interpreter. Die Datei src.jar enthält den
Quellcode der öffentlichen Bibliotheken. Die Datei kann zum Beispiel mit WinZip geöffnet
werden, indem src.jar in WinZip gezogen wird.
1.8.3
Compiler und Interpreter nutzen
Wir wechseln in die Eingabeaufforderung. Damit sich Programme übersetzen und ausführen
lassen, sollten wir den Pfad zum bin-Verzeichnis angeben. Im Pfad sind alle Verzeichnisse
anzugeben, in der die DOS-Box nach ausführbaren Programmen sucht. Tragen wir den Pfad nicht
ein, so müssen wir zum Aufruf immer den kompletten Pfadnamen angeben, was anstrengend ist.
Beispiel: Die Klassen im Verzeichnis D:\Projekte sollen übersetzt werden.
cd D:\Projekte
D:\Projekte> \jdk1.3\bin\javac *.java
Um die Pfade dauerhaft zu setzen, müssen wir die Umgebungsvariable PATH modifizieren. Für
eine Sitzung reicht es, den bin-Pfad hinzuzunehmen.
Beispiel: Die aktuelle Pfad-Variable wird modifiziert und zusätzlich auf das bin-Verzeichnis
gelegt. Wir setzen das jdk1.3\bin am Anfang in den Pfad, damit im Fall von Altinstallationen
immer das neue SDK verwendet wird.
set PATH= c:\jdk1.3\bin;%PATH%
Damit die Pfad-Angabe auch nach einem Neustart des Rechners noch verfügbar ist, müssen wir
abhängig vom System unterschiedliche Einstellungen vornehmen. Unter Windows NT/2000
aktivieren
wir
den
Dialog
Systemeigenschaften
unter
Start/Einstellungen/Systemsteuerung/System. Unter dem Reiter Umgebung wählen wir bei
Systemvariablen die Variable Path aus und tragen bei Wert hinter einem Semikolon den Pfad
zum bin-Verzeichnis ein. Dann können wir den Dialog mit OK verlassen. Falls eine Eingabeaufforderung offen war, wird sie von der Änderung nichts mitbekommen. Ein neue
Aufforderung muss geöffnet werden.
Unter Windows 98 editieren wir für den Pfad ebenfalls die Eigenschaft PATH, aber diesmal in der
Datei AUTOEXEC.BAT im Wurzelverzeichnis. In der Regel gibt es schon eine Zeile, die den Pfad
setzt. Dort setzen wir das Verzeichnis durch Semikolon getrennt dazu.
Weitere Hilfen gibt die Datei http://java.sun.com/j2se/1.3/install-windows.html .
1.9
Erstes Programm compilieren und testen
Nachdem wir die groben Konzepte von Java besprochen haben, wollen wir ganz dem Zitat von
Dennis M. Ritchie folgen, der sagt »Eine neue Programmiersprache lernt man nur, wenn man in
ihr Programme schreibt.« Das erste Programm zeigt einen Algorithmus, der die Quadrate der
Zahlen von 1 bis 4 ausgibt. Die ganze Programmlogik sitzt in einer Klasse Quadrat, die drei
Funktionen enthält. Alle Funktionen in einer objektorientierten Programmiersprache wie Java
müssen in Klassen platziert werden. Die erste Funktion quadrat() bekommt als
Übergabeparameter eine ganze Zahl und berechnet daraus die Quadratzahl, die sie anschließend
zurückgibt. Eine weitere Funktion übernimmt die Ausgabe der Quadratzahlen bis zu einer
vorgegebenen Grenze. Die Funktion bedient sich dabei der Funktion quadrat(). Zum Schluss
muss es noch ein besonderes Unterprogramm main() geben, dass für den Java-Interpreter den
Einstiegspunkt bietet. Die Methode main() ruft dann die Funktion ausgabe() auf.
Hinweis: Der Javacompiler unterscheidet sehr penibel zwischen Groß- und Kle inschreibung.
Quellcode 1.i Quadrat.java
/**
* @version 1.01
6 Dez 1998
* @author Christian Ullenboom
*/
public class Quadrat
{
static int quadrat( int n )
{
return n * n;
}
static void ausgabe( int n )
{
String s;
int
i;
for ( i = 1; i <= n; i=i+1 )
{
s = "Quadrat("
+ i
+ ") = "
+ quadrat(i);
System.out.println( s );
}
}
public static void main( String args[] )
{
ausgabe( 4 );
}
}
Ist das Programm unter dem Namen Quadrat.java gespeichert, kann es compiliert werden. Die
Datei muss so heißen wie ihre Klasse, andernfalls kann das Laufzeitsystem diese nicht finden.
Die Beachtung der Groß - und Kleinschreibung ist wichtig. Eine andere Endung wie etwa ›txt‹
oder ›jav‹ ist nicht erlaubt und mündet in einer Fehlermeldung.
C:\utemp>javac Quadrat.txt
Quadrat.txt is an invalid option or argument.
Usage: javac <options> <source files>
Ist die Datei richtig benannt, so lässt sich der Compiler aufrufen.
javac Quadrat.java
Der Compiler legt, vorausgesetzt das Programm war fehlerfrei, die Datei Quadrat.class an. Diese
enthält den Bytecode. Mit dem Interpreter kommt das Programm zur Ausführung:
java Quadrat
Die erwartete Ausgabe ist
Quadrat(1) = 1
Quadrat(2) = 4
Quadrat(3) = 9
Quadrat(4) = 16
Als Parameter für den Interpreter wird der Name der Klasse übergeben, die eine main()-Funktion
enthält und somit als ausführbar gilt. Der Dateiname ist daher auch nicht mit der Endung ›class‹
zu versehen, denn es gibt keine Klasse mit dem Namen Quadrat.class. Scheitert die Ausführung
des Programms an dem Problem, dass die Klasse nicht verfügbar ist, so muss möglicherweise in
die Umge bungsvariable CLASSPATH der Punkt (das aktuelle Verzeichnis) mit aufgenommen
werden. Ab dem SDK 1.2 ist der CLASSPATH allerdings für die Standardausführung nicht nötig
und sollte besser gar nicht gesetzt werden.
1.9.1
Häufige Compiler- und Interpreterprobleme
Arbeiten wir auf der Kommandozeilen-Ebene (Shell) ohne eine integrierte Entwicklungsumgebung, können verschiedene Probleme auftreten. Ist der Pfad zum Compiler nicht
richtig gesetzt, wird unter DOS (NT-Shell) eine Fehlermeldung der Form
D:\javac Quadrat.java
Der Befehl ist entweder falsch geschrieben oder konnte
nicht gefunden werden.
Bitte überprüfen Sie die Schreibweise und die
Umgebungsvariable ’PATH’.
D:\
ausgegeben. Unter UNIX lautet die Meldung gewohnt kurz:
javac: Command not found
Findet der Compiler in einer Zeile einen Fehler, so meldet er diesen unter der Angabe der Datei
und der Zeilennummer. Nehmen wir noch einmal unser Quadratzahlen-Programm her und bauen
in der quadrat() Funktion einen Fehler ein – das Semikolon fällt der Löschtaste zum Opfer. Der
Compilerdurchlauf meldet:
Quadrat.java:10: ';' expected.
return n * n
^
1 error
War der Compilerdurchlauf erfolgreich, wird der Interpreter mit dem Programm java aufgerufen.
Verschreiben wir uns bei dem Namen der Klasse oder fügen wir unserem Klassennamen den
Suffix ›class‹ zu, so meckert der Interpreter. Beim Versuch die nicht existente Klasse Q zum
Leben zu bringen, schreibt der Interpreter auf den Fehlerkanal:
java Q.class
Exception in thread "main" java.lang.NoClassDefFoundError:\
Q/class
Ist der Name der Klassendatei korrekt, doch die Hauptfunktion hat keine Signatur public
static void main( String [] ), so kann der Java-Interpreter keine Funktion finden, bei der
er mit der Ausführung beginnen soll. Verschreiben wir uns bei der main()-Funktion in Quadrat,
dann folgt die Fehlermeldung:
In class Quadrat: void main(String argv[]) is not defined
">
Herunterladen
Werbung
Hauptmerkmale
Objektorientierte Sprache
Virtuelle Maschine
Garbage-Collektor
Ausnahmenbehandlung
Plattformunabhängigkeit
Häufig gestellte Fragen
Die Java Virtual Machine ist eine Laufzeitumgebung, die den Bytecode ausführt, der vom Java-Compiler erzeugt wird. Sie ermöglicht es Java-Programmen, auf verschiedenen Plattformen zu laufen.
Der Garbage-Collektor ist ein Teil der Java-Laufzeitumgebung, der sich selbstständig um die Verwaltung von Objekten kümmert. Er entfernt nicht mehr referenzierte Objekte, sodass Speicherlecks vermieden werden.
Die Ausnahmenbehandlung in Java bietet ein modernes System, um mit Laufzeitfehlern umzugehen. Exceptions sind Objekte, die zur Laufzeit generiert werden und einen Fehler anzeigen. Diese Problemstellen können durch Programmkonstrukte gekapselt werden.