Java
JAVA
Allgemein"Verluste":
kein Präprozessor:
keine bedingte Compilierung (da plattformunabhängig gedacht)
benannte Konstanten sind mit final möglich
keine structs und unions, nur classes
kein typedef (da alles Klassen sind)
keine enums (Ersatz durch einzelne final-Konstanten)
keine inline-Funktionen (eventuell automatisch vom Compiler gehandhabt)
kein goto (bleibt aber reseviertes Wort), dafür break und continue mit Labels
kein Überladen von Operatoren (nur von Funktionen, außerdem sind + und += für Strings definiert)
kein Operator sizeof mehr (es braucht nicht mehr explizit mit Speichergrößen gearbeitet zu werden)
keine Templates (sind aber durch die JAVA-Art, Objekte zu behandeln, nicht unbedingt notwendig)
Änderungen bei den Typen:
Typen für Zeichenketten: String (konstant) und StringBuffer (veränderlich)
Festlegung von Wertebereich und Größe der elementaren Datentypen
"echter" boolean-Typ, der kein Ganzzahltyp ist
für Bedingungen wird als Ergebnistyp boolean (statt int) gefordert
der char-Typ ist 16-Bit breit (Unicode)
kein signed und unsigned, als Ersatz dafür: Vorzeichenunterscheidung beim Rechts-Shiften mit (>> und >>>)
Robustheit:
automatische Typkonversion, wenn nichts verloren geht z.B.: von float auf double
keine Pointer (Ersatz durch Objektreferenzen)
Arrays sind klassen-ähnlich implementiert, Index-Überprüfung zur Laufzeit
automatische Speicherverwaltung: freigeben, wenn keine Referenz mehr existiert ("Garbage Collection")
Destruktoren kaum verwendet (automatische Speicherverwaltung)
kein ::-Operator, Ersatz mit . und vollständig qualifizierten Namen
Klassen:
keine Funktionen, die nicht einer Klasse angehören, alles ist Teil irgendeiner Klasse
alle Klassen erben von der Klasse Object (alle verwandt)
interface-Schlüsselwort für eine Art abstrakter Klassen
keine Mehrfachvererbung (teilweise durch interface ersetzbar)
Vererbung wird anders implementiert als in C++, funktioniert aber ähnlich
private, protected und public haben eine andere Interpretation als in C++
nur eine Art von Vererbung (nicht public oder private)
kein Semikolon hinter der Klassen-Definition nötig
Standard-Klassen für Vektoren, Hashtables, etc.
keine virtual-Funktionen (alle Methoden sind virtuell)
es werden immer Laufzeit-Typinformationen mitgeführt
Sonstiges:
an allen Stellen Parameter-Übergabe "by value"! Nur bei Objekten "by reference"
keine Vorwärts-Deklaration für Klassen oder Funktionen notwendig
an allen Stellen automatische Initialisierung durch 0
leicht unterschiedliche Implementation des Exception-Handlings
Multithreading als Teil der Sprache
eingebaute Unterstützung für Dokumentation mit /**-Kommentaren und javadoc
Unterschiede zwischen den Sprachen
JAVA bietet eine systemunabhängige Schnittstelle zur grafischen und fensterorientierten Umgebung und zur Multitasking-Handhabung. Entsprechende Programme können zwar möglicherweise nicht alle Feinheiten des angesprochenen Betriebssystems nutzen, dafür sind sie aber ohne jegliche Änderung auf jedem System lauffähig, auf das der JAVA-Interpreter portiert wurde.
Bei der Portierung von C++-Programmen auf andere Umgebungen ist meist eine erhebliche Anpassungsarbeit notwendig. Je nachdem, wie stark die Programmstruktur auf eine bestimmte Architektur der Benutzeroberfläche zugeschnitten ist, ist es einfacher, ein komplett neues Programm zu schreiben.
Objektorientierte Programmierung mildert diesen Effekt (z.B. gegenüber C) jedoch erheblich. Wenn man die Schnittstellen der eigenen Klassen vernünftig entwirft, kann man oft auch durch Austausch weniger Klassen den Sprung von einem zu einem anderen Rechner schaffen.
Mit den Applets bietet JAVA etwas, was mit keiner anderen Programmiersprache in ähnlicher Form möglich ist. Es sind Formen von Gestaltung einer WWW-Seite möglich -- grafisch wie auch interaktiv -- wie sie mit reinem HTML oder Skriptsprachen nicht denkbar sind. Als Programmiersprache für Stand-Alone-Programmsysteme ist JAVA dagegen momentan noch nicht weit genug entwickelt.
Es kann in JAVA nicht mehr vorkommen, daß Speicherlecks entstehen, wenn der Programmierer vergißt, alle dynamisch angelegten Objekte wieder freizugeben. JAVA führt selbst Buch über die Verwendung aller Objekte und räumt den Speicher selbständig auf.
Diesen Komfort erkauft man sich allerdings mit geringen Effizienzeinbußen, da doch einiger Verwaltungsaufwand zur Laufzeit notwendig ist.
Dadurch, daß JAVA eine interpretierte Sprache ist, ergibt sich die Möglichkeit, zur Laufzeit neue Klassen hinzuzbinden. Zum Beispiel können diese über das Netz aus verschiedenen Quellen bezogen werden und sind damit automatisch auf dem neuesten Entwicklungsstand etc.
JAVA läßt einiges der Eleganz von C++ vermissen.
Durch das Fehlen der Operator-Überladung werden JAVA-Programme schnell vergleichsweise unübersichtlich. Zwischen Klassenobjekten ist beispielsweise nicht eine einfache Zuweisung mit = möglich -- dazu muß die Klassenmethode clone() aufgerufen werden. Für Ausgaben gibt es nicht den Operator <<, hierzu muß der Umweg über eine Funktion wie toString() gegangen werden.
Objekte kommen nie direkt in der Sprache vor, nur Referenzen auf sie. Man muß jedes Objekt explizit mit new konstruieren, z.B. Integer i=new Integer(3); Solche technischen Schreibweisen können manchmal den Überblick verschleiern.
Durch die Interpretation ergeben sich sehr große Laufzeitunterschiede zwischen gleichwertigen C++- und JAVA-Programmen. Bei rein rechnenden Programmen (ohne grafische Ausgabe etc.
) ist die JAVA-Version meist um einen Faktor 50 bis 100 langsamer als die C++-Version.
In Zukunft werden allerdings wahrscheinlich auch "echte" JAVA-Compiler eingesetzt werden, die systemabhängigen Code produzieren, der für jeden Rechner neu übersetzt werden muß. Die Systemunabhängigkeit der Sprache selbst würde dabei nicht verloren gehen.
JAVA-Applets, die ja meist über das Netz in den Rechner gelangen, können so natürlich nicht beschleunigt werden. Dafür wird es in den Browsern sogenannte "just in time compiler" geben, die einzelne Byte-Code-Stücke nach dem Laden in echten Maschinencode übersetzen und dadurch die Applets erheblich beschleunigen können.
Sehr gewöhnungsbedürftig ist es auch, daß der JAVA-Compiler selbst in JAVA geschrieben ist.
Er muß also jedesmal vom JAVA-Interpreter interpretiert werden. Der Compilationsvorgang kann sich teilweise extrem in die Länge ziehen. Beispielsweise kann allein die Zeit zwischen dem Start des Compilers und der ersten Fehlermeldung (selbst "Quelltext nicht gefunden") sehr groß sein!
Der Standardisierungsprozeß von C++ ist weitestgehend abgeschlossen. In C++ ist die Erfahrung von weltweit Tausenden von Benutzern eingegangen. JAVA ist noch in einem vergleichsweise frühen Entwicklungsstadium. Von Version 1.
0 zur Version 1.1 sind einige Umstellungen vorgenommen worden, und für 2.0 (mit den neuen Swing-Oberflächenkomponenten) und später ist noch nicht einmal Aufwärtskompatibilität gewährleistet.
Einige "alte" Methoden und Schnittstellen aus 1.0 werden in 1.1 zwar noch geduldet, aber "mißbilligt" (deprecated).
Der Compiler warnt jedesmal davor, sie weiterhin zu benutzen. Einige Dinge im Bezug auf Fensterverwaltung sind völlig verändert worden. Im Moment wird die Systemunabhängigkeit durch die Versionsabhängigkeit etwas relativiert.
RechnerarchitekturunabhängigkeitDurch die weltweite Verknüpfung von Rechnern über das Internet müssen Programmentwickler damit rechnen, daß verschiede Benutzer aufverschiedenen Plattformen arbeiten.
Für Applikationen ist es deshalb wichtig, daß sie möglichst einfach auf verschiedene Benutzeroberflächen wie Windows 95, UNIX oderOS/2 angepaßt werden können, und das, ohne Programmänderungen vorzunehmen oder besser, ohne neu übersetzt zu werden.
JAVA löst dieses Problem auf folgende Weise:
Der Quellcode wird zu etwa 80% in ein binär codiertes Format kompiliert,das unabhängig von der Rechnerarchitektur und dem Betriebssystem ist.
Dieses Format bezeichnet man als Bytecode, da es nahezu strukturlos als eine Folge von Bytes abgespeichert und übertragen wird. Auf der jeweiligen Zielplattform existiert ein Laufzeitsystem (z.B. ein JAVA-fähiger Internet-Browser), das die restlichen 20% des JAVA-codes interpretiert und Bibliotheken für Grafik, Fenstertechnik, Multimedia und einiges mehr bereitstellt. Sowohl die Sicherheit als auch die Fähigkeit auf verschiedenen Plattformen zu laufen,rühren von der Tatsache, daß diese 20% der Kompilierung lokal abgearbeitet werden. Ist jetzt das Laufzeitsystem verfügbar, so sind alle JAVA-Programme lauffähig, ganz gleich auf welcher Plattform sie ausgeführt werden sollen.
Unter C++ erzeugt ebenfalls der Compiler aus dem Quellcode Objektmodule, die bereits vom Prozessor ausführbare Anweisungen enthalten. Diese Module können jedoch alleine nicht zur Ausführung gebracht werden, sondern benötigen ein weiteres Programm, den Linker, der die verschiedenen Objektmodule zusammenfügt und aufeinander abstimmt. Jedoch beginnen schon bei den Objektmodulen die Probleme. Sie sind für einen bestimmten Prozessor generiert und deshalb nicht auf einen anderen übertragbar.Verwendet man jetzt noch rechnerspezifische Ressourcen wie Grafiken und Betriebssystem-Funktionen, wird es noch schwieriger, den Quellcode auf einanderes System zu übertragen. JAVA kennt diese Probleme nicht.
EinfachheitDie Entwickler von JAVA haben sich beim Aufbau der Sprache stark an C++ orientiert und wichtige Sprachelemente wie Operatoren und Steueranweisungen nahezu identisch übernommen, was es dem C++ Programmierer erleichtert, seine Programme auch in JAVA zu schreiben. Aber auch ein Anfänger kommt mit JAVA schnell zurecht, nicht zuletzt auch weil auf die Zeigerarithmetik von C++ in JAVA verzichtet wurde. Weggelassen wurden auch Headerdateien, Strukturen, Varianten,multidimensionale Arrays und Präprozessoren. Damit fallen auch #defines, Makros und typedefs weg. Um Quelltext zu verstehen, müssen so nicht mehr alle typedefs, #defines usw. in den Headerdateien nachgesehen werden.
Weiterhin braucht man sich in JAVA nicht um die Freigabe, nicht mehr benötigten Speichers zu kümmern. Dieses erledigt hier die "Garbage Collection"(automatische Speicherbereinigung). MehrfachvererbungDie gibt es in JAVA nicht! JAVA unterstützt nur eine einfache Vererbung.Das bedeutet, daß jede Klasse zu einem gegebenen Zeitpunkt nur von einer Klasse erben kann. Damit wird das Problem vermieden, daß an Klassen weitervererbt wird, deren Verhalten sich mit dem Verhalten anderer Klassen ausschließt oder deren Verhalten entgegenläuft. JAVA implementiert eine andere Art der Mehrfachvererbung durch den Einsatz von Interfaces.
Ein Interface definiert keine Klasse, sondern nur die Funktionen, die eine Klasse als Schnittstelle zur Verfügung stellt. Eine Klassendefinition kann dabei durchaus mehrere Schnittstellen implementieren.
Arrays in JAVA
Arrays sind spezielle Datenobjekte in JAVA, die Zeigerarithmetik überflüssig machen. Alle Daten- und Objekttypen können in Form von Arrays dargestellt werden. Arrays sind damit Datenobjekte, die ein oder mehrere Elemente eines spezifizierten Datentyps enthalten können. Wie andere Objekte auch werden sie über den Operator new erzeugt.
Die Deklaration eines Arrays erkennt man an den eckigen Klammern:
char CharArray[] = new char[10]; //Array, das aus 10 Elementen des Typs char besteht
char IntArray[] = new char[20]; //Array, das aus 20 Elementen des Typs int besteht
Über einen Index kann man auf das gewünschte Element eines Arrays zugreifen. Das 1. Element besitzt den Index 0, das letzte den Index n-1 (n ist die Zahl der Elemente).
JAVA unterstützt keine mehrdimensionalen Arrays. Arrays können jadoch geschachtelt werden, was auf das gleiche hinausläuft.
int IntMatrix[][] = new int[3][5]; //Array, das aus 3 Elementen des Typs int[] besteht
Die Länge eines Arrays kann über die Instanzvariable length ermittelt weredn:
int IntMatrix[][] = new int [8][9];
Systen.
out.println(IntMatrix.length); //ergibt 8
Systen.out.println(IntMatrix[0].length); //ergibt 9
C++class GROB
{
private:
int farbe;
public:
void set_f(int f);
int get_f(void);
GROB(void);
};
class Quadrat: public GROB
{
private:
int seitenlaenge;
public:
void set_sl(int sl);
int get_sl(void);
Quadrat(void);
};
GROB::GROB()
{
farbe=0;
}
void GROB::set_f(int f)
{
farbe=f;
}
int GROB::get_f(void)
{
return farbe;
}
void Quadrat::set_sl(int sl)
{
seitenlaenge=sl;
}
int Quadrat::get_sl(void)
{
return seitenlaenge;
}
Quadrat::Quadrat():GROB()
{
seitenlaenge=0;
}
JAVApublic class GROB
{
private int farbe;
public GROB()
{
farbe=0;
}
public void set_f(int f)
{
farbe=f;
}
public int get_f(void)
{
return farbe;
}
}
class Quadrat extends GROB
{
private int seitenlaenge;
public Quadrat()
{
super();
seitenlaenge=0;
}
public void set_sl(int sl)
{
seitenlaenge=sl;
}
public int get_sl(void)
{
return seitenlaenge;
}
}
Anmerkungen: |
| impressum | datenschutz
© Copyright Artikelpedia.com