Java (Programmiersprache)

Java (Programmiersprache)
Java
Java-Logo.svg
Basisdaten
Paradigmen: Objektorientierte Programmiersprache
Erscheinungsjahr: 1995[1]
Entwickler: Sun Microsystems (seit 2010 Tochterunternehmen von Oracle Corporation)
Aktuelle Version: 7.0.1  (18. Oktober 2011[2])
Typisierung: stark, statisch
Einflüsse: C++, Smalltalk, Objective C, C#[3]
Beeinflusste: Groovy, Clojure, C#, Scala, Vala
Betriebssystem: plattformunabhängig
Lizenz: GNU General Public License/Java Community Process
oracle.com/technetwork/java/

Java ist eine objektorientierte Programmiersprache und eingetragenes Warenzeichen des Unternehmens Sun Microsystems, welches Ende Januar 2010 von Oracle übernommen wurde. Die Programmiersprache ist Bestandteil der Java-Technologie.

Mit Java werden meist keine Programme in Maschinensprache erzeugt, sondern Bytecode, der in einer speziellen Laufzeitumgebung ausgeführt wird. Der wesentliche Bestandteil dieses Java Runtime Environments ist die Java Virtual Machine, die die Programme ausführt, indem sie den Bytecode interpretiert und bei Bedarf kompiliert (Just-in-time-Kompilierung, häufig mit Hotspot-Optimierung).

Die Laufzeitumgebung macht Java-Programme plattformunabhängig, das heißt, sie laufen ohne weitere Anpassungen auf verschiedenen Rechnerarchitekturen und Betriebssystemen mit entsprechender Laufzeitumgebung. Sun selbst bietet Laufzeitumgebungen für die Betriebssysteme Linux, Solaris und Windows an. Andere Hersteller lassen eigene Java-Laufzeitumgebungen für ihre Plattform zertifizieren. Auch in Autos, HiFi-Anlagen und anderen elektronischen Geräten wird laut eigener Aussage Java verwendet.[4]

Von Portierung spricht man bei Java in der Regel, wenn Quelltext oder Bytecode auf den Stand einer anderen Java-Version angepasst werden soll. Meistens sind Java-Programme nur für bestimmte Java-Versionen getestet oder zertifiziert.

Inhaltsverzeichnis

Grundkonzepte der Sprache

Der Entwurf der Programmiersprache Java strebte hauptsächlich fünf Ziele an:[5][6]

Einfachheit
Java ist im Vergleich zu anderen objektorientierten Programmiersprachen wie C++ oder C# einfach, da es einen reduzierten Sprachumfang besitzt und beispielsweise Operator Overloading und Mehrfachvererbung nicht unterstützt.
Objektorientierung
Java gehört zu den objektorientierten Programmiersprachen.
Verteilt
Javas Klassenbibliothek bietet eine Reihe einfacher Möglichkeiten für Netzwerkkommunikation, von TCP/IP-Protokollen über Remote Method Invocation bis zu Webservices.
Vertrautheit
Wegen der syntaktischen Nähe zu C++, der ursprünglichen Ähnlichkeit der Klassenbibliothek zu Smalltalk-Klassenbibliotheken und der Verwendung von Entwurfsmustern in der Klassenbibliothek zeigt Java für den erfahrenen Programmierer keine unerwarteten Effekte.
Robustheit
Viele der Designentscheidungen bei der Definition von Java reduzieren die Wahrscheinlichkeit ungewollter Systemfehler: Zu nennen sind die starke Typisierung, Garbage Collection, Ausnahmebehandlung sowie Verzicht auf Zeigerarithmetik.
Sicherheit
Dafür stehen Konzepte wie der Class-Loader, der die sichere Zuführung von Klasseninformationen zur Java Virtual Machine steuert, und Security-Manager, die sicherstellen, dass nur Zugriff auf Programmobjekte erlaubt wird, für die entsprechende Rechte vorhanden sind.
Architekturneutralität
Java wurde so entwickelt, dass dieselbe Version eines Programms prinzipiell auf einer beliebigen Computerhardware läuft, unabhängig von ihrem Prozessor oder anderen Hardwarebestandteilen.
Portabilität
Zusätzlich zur Architekturneutralität ist Java portabel. Das heißt, dass primitive Datentypen sowohl in ihrer Größe und internen Darstellung als auch in ihrem arithmetischen Verhalten standardisiert sind. Beispielsweise ist ein float immer ein IEEE 754 Float von 32 Bit. Dasselbe gilt für die Klassenbibliothek, die beispielsweise unabhängig vom Betriebssystem dasselbe GUI erzeugen kann.
Leistungsfähigkeit
Java ist insbesondere auf Grund der dynamischen Optimierungen der Virtual Machine eine der effizientesten Programmiersprachen und liefert ähnliche Geschwindigkeiten wie C++- oder C#-Programme.[7][8]
Interpretierbarkeit
Java wird in maschinenunabhängigen Bytecode kompiliert, dieser wiederum kann auf der Zielplattform interpretiert werden. Die Java Virtual Machine der Firma Sun interpretiert Java-Bytecode, bevor sie ihn aus Performancegründen kompiliert und optimiert.
Parallelisierbarkeit
Java unterstützt Multithreading, also den parallelen Ablauf von eigenständigen Programmmabschnitten. Dazu bietet die Sprache selbst die Keywords synchronized und volatile – Konstrukte, die das „Monitor & Condition Variable Paradigma“ von C. A. R. Hoare[9] unterstützen. Die Klassenbibliothek enthält weitere Unterstützungen für parallele Programmierung mit Threads. Moderne JVMs bilden einen Java-Thread auf Betriebssystem-Threads ab und profitieren somit von Prozessoren mit mehreren Rechenkernen.
Dynamisch
Java ist so aufgebaut, dass es sich an dynamisch ändernde Rahmenbedingungen anpassen lässt. Da die Module erst zur Laufzeit gelinkt werden, können beispielsweise Teile der Software (etwa Bibliotheken) neu ausgeliefert werden, ohne die restlichen Programmteile anpassen zu müssen. Interfaces können als Basis für die Kommunikation zwischen zwei Modulen eingesetzt werden; die eigentliche Implementierung kann aber dynamisch und beispielsweise auch während der Laufzeit geändert werden.

Objektorientierung

Die Grundidee der objektorientierten Programmierung ist, Daten und zugehörige Funktionen möglichst eng in einem sogenannten Objekt zusammenzufassen und nach außen hin zu kapseln (Abstraktion). Die Absicht dahinter ist, große Softwareprojekte einfacher zu verwalten und die Qualität der Software zu erhöhen. Ein weiteres Ziel der Objektorientierung ist ein hoher Grad der Wiederverwendbarkeit von Softwaremodulen.

Ein neuer Aspekt von Java gegenüber den objektorientierten Programmiersprachen C++ und Smalltalk ist die explizite Unterscheidung zwischen Schnittstellen und Klassen, die durch entsprechende Schlüsselwörter interface und class ausgedrückt wird. Java unterstützt kein Erben von mehreren unabhängigen Basisklassen (sogenannte „Mehrfachvererbung“ wie in C++ oder Eiffel), wohl aber das Implementieren einer beliebigen Zahl von Schnittstellen, womit sich viele der entsprechenden Probleme ebenfalls lösen lassen. Dabei werden nur die Methodensignaturen an die abgeleiteten Klassen weitergegeben, jedoch keine Attribute und keine Implementierungen der Methoden.

Java ist nicht vollständig objektorientiert, da die Grunddatentypen (int, boolean usw.) keine Objekte (siehe auch unter Java-Syntax) sind. Sie werden allerdings ab Java 1.5 bei Bedarf automatisch und für den Programmierer transparent mittels Autoboxing in die entsprechenden Objekttypen und umgekehrt umgewandelt.[10]

Reflection

Java bietet eine Reflection-API als Bestandteil der Laufzeitumgebung. Damit ist es möglich, zur Laufzeit auf Klassen und Methoden zuzugreifen, deren Existenz oder genaue Ausprägung zur Zeit der Programmerstellung nicht bekannt war. Häufig wird diese Technik im Zusammenhang mit dem Entwurfsmuster Fabrikmethode (Factory Method) angewandt.

Annotationen

Mit Java 5 hat Sun die Programmiersprache um Annotationen erweitert. Annotationen erlauben die Notation von Metadaten und ermöglichen bis zu einem gewissen Grad benutzerdefinierte Spracherweiterungen. Sinn der Annotationen ist unter anderem die automatische Erzeugung von Code und anderen in der Software-Entwicklung wichtigen Dokumenten für wiederkehrende Muster anhand möglichst kurzer Hinweise im Quelltext. Bislang wurden in Java dafür ausschließlich Javadoc-Kommentare mit speziellen JavaDoc-Tags verwendet, die von Doclets wie zum Beispiel dem XDoclet ausgewertet wurden.

Annotationen können auch in den kompilierten Class-Dateien enthalten sein. Der Quelltext wird also für ihre Verwendung nicht benötigt. Insbesondere sind die Annotationen auch über die Reflection-API zugänglich. So können sie zum Beispiel zur Erweiterung des Bean-Konzeptes verwendet werden.

Modulare Ausführung auf fernen Computern

Java bietet die Möglichkeit, Klassen zu schreiben, die in unterschiedlichen Ausführungsumgebungen ablaufen. Beispielsweise lassen sich Applets in Webbrowsern, die Java unterstützen, ausführen. Das Sicherheitskonzept von Java kann dazu eingesetzt werden, dass unbekannte Klassen dabei keinen Schaden anrichten können, was vor allem bei Applets wichtig ist (siehe auch Sandbox). Beispiele für in entsprechenden Ausführungsumgebungen ausführbare Java-Module sind Applets, Servlets, Portlets, Midlets, Xlets, Translets, und Enterprise Java Beans.

Merkmale der Sprache

Der Objektzugriff in Java ist über Referenzen implementiert, welche den aus C oder C++ bekannten Zeigern ähneln.[11] Die Sprachdefinition (Java Language Specification) bezeichnet sie als „Reference Values“ um deutlich zu machen, dass sie als Call by value übergeben werden.[12] Aus Sicherheitsgründen erlauben diese weder den Verweis auf Methoden oder andere Referenzen, noch die tatsächliche Speicheradresse zu erkennen oder zu modifizieren. So genannte Zeigerarithmetik ist in Java somit ausgeschlossen. Per Design kann so ein häufiger Typ von Fehlern, die in anderen Programmiersprachen auftreten, von vornherein ausgeschlossen werden.

Zusammengehörige Klassen werden in Paketen (englisch packages) zusammengefasst. Diese Pakete ermöglichen die Einschränkung der Sichtbarkeit von Klassen, eine Strukturierung von größeren Projekten sowie eine Trennung des Namensraums für verschiedene Entwickler. Die Paketnamen sind hierarchisch aufgebaut und beginnen meist mit dem (umgekehrten) Internet-Domainnamen des Entwicklers. (Pakete, die von Sun erstellt werden, beginnen z. B. mit „com.sun.“) Klassennamen müssen nur innerhalb eines Paketes eindeutig sein. Hierdurch ist es möglich, Klassen von verschiedenen Entwicklern zu kombinieren, ohne dass es zu Namenskonflikten kommt. Die Hierarchie der Paketnamen hat allerdings keine semantische Bedeutung. Bei der Sichtbarkeit zwischen den Klassen zweier Pakete spielt es keine Rolle, wo sich die Pakete in der Namenshierarchie befinden. Klassen sind entweder nur für Klassen des eigenen Paketes sichtbar oder für alle Pakete.

Weiter unterstützt die Sprache Threads (nebenläufig ablaufende Programmteile) und Ausnahmen (englisch exception). Java beinhaltet auch eine automatische Speicherbereinigung (englisch garbage collector), die nicht (mehr) referenzierte Objekte aus dem Speicher entfernt.

Java unterscheidet explizit zwischen Schnittstellen und Klassen. Eine Klasse kann beliebig viele Schnittstellen implementieren, hat aber stets genau eine Basisklasse. Java unterstützt kein direktes Erben von mehreren Klassen (sogenannte „Mehrfachvererbung“), jedoch die Vererbung über mehrere Hierarchie-Ebenen (Klasse Kind erbt von Klasse Vater, die ihrerseits von Klasse Großvater erbt usw.). Je nach Sichtbarkeit (public, protected, default/package-private, private) erbt die Klasse Methoden und Attribute (auch Felder genannt) von ihren Klassenvorfahren. Alle Klassen sind – direkt oder indirekt – von der Wurzelklasse Object abgeleitet.

Zu Java gehört eine umfangreiche Klassenbibliothek. Dem Programmierer wird damit eine einheitliche, vom zugrundeliegenden Betriebssystem unabhängige Schnittstelle (Application programming interface, API) angeboten.

Mit Java 1.2 wurden die Java Foundation Classes (JFC) eingeführt, die unter anderem Swing bereitstellen, das zur Erzeugung plattformunabhängiger grafischer Benutzerschnittstellen (GUI) dient und auf dem Abstract Window Toolkit basiert.

Syntax

Hauptartikel: Java-Syntax

Syntax/Grammatik und Semantik von Java sind in der Java Language Specification (Java-Sprachspezifikation) von Sun Microsystems dokumentiert. Das folgende Beispielprogramm gibt die unter Programmierern klassische Meldung „Hallo Welt!“ auf dem Ausgabemedium aus.

 public class HalloWelt {
     public static void main(String[] args) {
         System.out.println("Hallo Welt!");
     }
 }

Entstehung und Weiterentwicklung der Sprache

Entstehung

Herkunft und Entwicklung der Programmiersprache Java sowie mit ihr verwandter Technik sind im Artikel Java (Technik) beschrieben.

Sun und JCP

Neben Sun kümmert sich eine Vielzahl von Einzelpersonen, kleiner und großer Unternehmen, wie Apple, IBM, Hewlett-Packard und Siemens beim Java Community Process (JCP) unter anderem um die Weiterentwicklung der Java-Sprachspezifikation. Der JCP wurde 1998 von Sun Microsystems ins Leben gerufen.

Java als freie Software

Sun hat zugesichert, sein JDK unter der GNU General Public License zu veröffentlichen. Am 13. November 2006 wurden bereits mit dem Compiler javac und der Hotspot Virtual Machine erste Teile als Open Source veröffentlicht. Zudem wurde mit OpenJDK eine Community-Seite eröffnet, mit deren Hilfe die Entwicklung koordiniert werden soll.[13] Am 8. Mai 2007 folgten dann große Teile des „Java-SE“-Quellcodes zum Erstellen eines JDK. Eine Ausnahme stellt solcher Code dar, für den Sun nicht die nötigen Rechte besitzt, um ihn freizugeben. Dieser liegt somit nur in kompilierter Form vor.[14] Ebenfalls kündigte Sun an, dass Entwicklungen auf Grundlage des OpenJDK das „Java Compatible“-Logo führen dürfen, wenn sie nach dem „Technical Compatibility Kit“ (JCK) zertifiziert sind.

Zuvor wurde der Quelltext von Java unter anderem bei jedem JDK mitgeliefert und ermöglichte so zwar Einsicht, er durfte aber nicht beliebig modifiziert werden. Deswegen gibt es neben den offiziellen JCP auch diverse unabhängige Vereinigungen, die es sich zum Ziel gesetzt haben, ein unter eine freie Open-Source-Lizenz gestelltes Java bereitzustellen. Die bekanntesten dieser Projekte sind Apache Harmony, Kaffe und das GNU-Classpath-Projekt.

Unterschiede zu ähnlichen Sprachen

JavaScript

Java ist nicht mit der Skriptsprache JavaScript zu verwechseln, die vornehmlich in HTML-Seiten zur eingebetteten Programmierung verwendet wird, um interaktive Webapplikationen zu ermöglichen. Javascript ist eine dynamisch typisierte, objektbasierte, aber klassenlose Skriptsprache mit einer ähnlichen Syntax wie C, Perl oder Java, unterscheidet sich jedoch in vielerlei Hinsicht von Java.

Smalltalk

Smalltalk ist eine der ältesten objektorientierten Programmiersprachen überhaupt. Java erbt von Smalltalk die grundsätzliche Konzeption eines Klassenbaumes, in den alle Klassen eingehängt werden. Dabei stammen alle Klassen entweder direkt oder indirekt von der Klasse java.lang.Object ab. Außerdem wurden die Konzepte der automatischen Speicherbereinigung (garbage collector) und der virtuellen Maschine übernommen sowie eine Vielzahl weiterer Merkmale der Sprache Smalltalk.

Smalltalk kennt jedoch keine primitiven Datentypen wie zum Beispiel int – selbst eine einfache Zahl ist ein Objekt. Dieses Konzept wurde nicht nach Java übernommen, primitive Datentypen werden aber ab Java 1.5 mittels Autoboxing bei Bedarf in die entsprechenden Objekttypen und umgekehrt umgewandelt.[10]

C++

Java lehnt seine Syntax an die der Programmiersprache C++ an. Im Gegensatz zu C++ fanden jedoch komplexe Konstrukte wie Mehrfachvererbung oder die fehleranfällige Zeigerarithmetik keinen Einzug. Klassen können nur eine Superklasse haben (Einfachvererbung), aber eine beliebige Anzahl von Interfaces implementieren. Interfaces entsprechen abstrakten Klassen in C++, welche keine Attribute oder konkrete Methoden besitzen, werden allerdings konzeptionell anders als die auch in Java möglichen abstrakten Klassen verwendet. Die interne Speicherverwaltung wird dem Java-Entwickler weitgehend abgenommen; dies erledigt die automatische Speicherbereinigung. Deshalb ist Java in vielen Fällen leichter zu handhaben als C++. Allerdings garantiert auch dieser Mechanismus nicht den vollständigen Ausschluss von Speicherlecks. Letztlich muss der Programmierer dafür sorgen, dass nicht mehr verwendete Objekte von keinem laufenden Thread mehr referenziert werden. Sich gegenseitig referenzierende Objekte, die von keinem Thread aus mehr über Referenzen erreichbar sind, werden ebenfalls freigegeben, wobei es dem Garbage Collector (GC) obliegt, wann und ob überhaupt diese Objekte freigegeben werden. Jede Objektklasse besitzt zusätzlich eine Methode namens finalize, die vom GC aufgerufen werden kann, um zusätzliche „Aufräumarbeiten“ durchzuführen. Es gibt jedoch keine Garantie, wann und ob dies geschieht. Sie ist daher nicht mit einem Destruktor aus C++ vergleichbar.

Neben Mehrfachvererbung und Speicherarithmetik wurden bei der Entwicklung von Java noch weitere Konstrukte der Sprache C++ bewusst weggelassen:

Im Gegensatz zu C++ ist es in Java nicht möglich, Operatoren (zum Beispiel arithmetische Operatoren wie + und -, logische Operatoren wie && und ||, oder den Index-Operator []) zu überladen, das heißt in einem bestimmten Kontext mit neuer Bedeutung zu versehen. Dies sorgt einerseits für eine Vereinfachung der Sprache an sich und verhindert, dass Quellcodes mit Operatoren, die mit schwer nachvollziehbarer Semantik überladen werden, unleserlich gemacht werden. Andererseits würden benutzerdefinierte Typen mit überladenen Operatoren in C++ eher wie eingebaute Typen erscheinen können – vor allem numerischer Code wäre so mitunter einfacher nachzuvollziehen. Die Sprachdefinition von Java definiert jedoch typabhängiges Verhalten der Operatoren + (Addition bei arithmetischen Operanden, andernfalls zur Verkettung von Zeichenketten „string concatenation“) sowie &, | und ^ (logisch für boolean und bitweise für arithmetische Operanden). Das lässt diese Operatoren zumindest wie teilweise überladene Operatoren erscheinen.

Das C++-Konstrukt der „Templates“, die es erlauben, Algorithmen oder sogar ganze Klassen unabhängig von den darin verwendeten Datentypen zu definieren, wurde in Java nicht übernommen. Seit Version 1.5 unterstützt Java aber sogenannte „Generics“, die zwar keinerlei Metaprogrammierung erlauben, aber ähnlich wie C++-Templates typsichere Container und ähnliches ermöglichen.

In Java wurde das Schlüsselwort const reserviert, hat aber keine Funktion. Die Alternative zu const (und Präprozessor-Direktiven) ist final. Im Gegensatz zu const wird final in einer Methodensignatur nicht vererbt und hat somit nur im aktuellen Scope Gültigkeit. Den final-Modifikator kann eine Klasse (die dadurch nicht mehr abgeleitet werden kann), ein Attribut (dessen Wert so nur einmal gesetzt werden kann) oder eine Methode (die dadurch unüberschreibbar wird) besitzen.

C#

Die von Microsoft entwickelte Programmiersprache C# kann als Konkurrenzprodukt zu Java gesehen werden. Mit der Spezifikation von C# hat Microsoft im Rahmen seiner .NET-Strategie versucht, den Spagat zwischen der Schaffung einer neuen Sprache und der leichten Integration bestehender Komponenten zu schaffen.

Konzeptionelle Unterschiede zu Java bestehen insbesondere in der Umsetzung von Callback-Mechanismen. C# implementiert hierzu die Unterstützung von Delegaten (englisch delegates), einem Konzept, das mit Funktionszeigern vergleichbar ist. In Java kommt hingegen das Beobachter-Entwurfsmuster zum Einsatz.

Des Weiteren unterstützt C# so genannte Attribute (attributes), die es erlauben, die Funktionalität der Sprache über Metadaten im Code zu erweitern (eine ähnliche Funktionalität wurde in Form der oben beschriebenen Annotations in Java 5.0 übernommen). C# enthält auch Bestandteile der Sprachen VisualBasic, zum Beispiel Eigenschaften (properties), sowie Konzepte aus C++.

In C# ist es ebenso wie in Java möglich, Ausnahmen (exceptions) zu einer Methode zu deklarieren. In Java können Ausnahmen so deklariert werden, dass sie auch verarbeitet werden müssen (checked exception).

Systembefehle können in .NET über platform invoke aufgerufen werden. Dies ist in Java von der Syntax her nicht möglich, kann aber über die Klassenbibliothek mittels Runtime.exec() und java.lang.ProcessBuilder beziehungsweise Jakarta Commons Exec bewerkstelligt werden.

Geschwindigkeitskritische Programmteile können in C# in so genanntem unsicheren unsafe code geschrieben werden, was ähnlich zu Inline-Assembler in C-Programmen zu sehen ist. Java kennt hierfür in der Sprache aus Sicherheits-, Stabilitäts- und Plattformunabhängigkeitsgründen keine Entsprechung. Java bietet allerdings mittels Java Native Interface die Möglichkeit, C- und C++-Code in Javapakete einzubetten und außerhalb der Java Virtual Machine laufen zu lassen. Darüber hinaus bietet Java die Möglichkeit aus Java-Code heraus verschiedene Skriptsprachen auszuführen. Ebenfalls gibt es eine Reihe an Programmiersprachen, welche nach Java Bytecode kompiliert werden. Damit lassen sich Programmteile auch in anderen Programmiersprachen umsetzen. Mit JDK Version 7, das am 28. Juli 2011 erschienen ist,[15] wurde auch die Unterstützung für dynamische „Fremdsprachen“ durch die Virtual Machine verbessert.[16]

Entwicklungsumgebungen

Es gibt eine große Vielfalt von Entwicklungsumgebungen für Java, sowohl proprietäre als auch freie (Open Source). Die meisten Entwicklungsumgebungen für Java sind selbst ebenfalls in Java geschrieben.

Die bekanntesten Open-Source-Umgebungen sind das von der Eclipse Foundation bereitgestellte Eclipse und das von Sun entwickelte NetBeans.

Unter den kommerziellen Entwicklungsumgebungen sind das auf NetBeans basierende Sun ONE Studio von Sun, IntelliJ IDEA von JetBrains, JBuilder von Borland sowie JCreator am verbreitetsten. Außerdem gibt es noch eine, um einige hundert Plugins erweiterte Version von Eclipse, die von IBM unter dem Namen WebSphere Studio Application Developer („WSAD“) vertrieben wurde und seit Version 6.0 Rational Application Developer („RAD“) heißt.

Apple liefert mit Mac OS X ab Version 10.3 die Entwicklungsumgebung Xcode aus, die verschiedene Programmiersprachen unterstützt und einen Schwerpunkt auf Java setzt. Xcode wird mit jedem Apple(-Betriebssystem) mitgeliefert, Aktualisierungen sind darüber hinaus nach Registrierung für jedermann kostenlos erhältlich.

Wer lieber einen Texteditor verwendet, findet in Emacs zusammen mit der JDEE (Java Development Environment for Emacs) ein mächtiges Werkzeug. Ein vielseitiger und erweiterbarer in Java geschriebener Editor ist jEdit. Für andere Editoren wie Vim, Jed oder Textpad gibt es ebenfalls entsprechende Modi.

Compiler

Ein Java-Compiler übersetzt Java-Quellcode (Dateiendung „.java“) in einen ausführbaren Code. Grundsätzlich unterscheidet man zwischen Bytecode- und Nativecode-Compilern. Einige Java-Laufzeitumgebungen verwenden einen JIT-Compiler, um zur Laufzeit den Bytecode häufig genutzter Programmteile in nativen Maschinencode zu übersetzen.

Bytecode-Compiler

Im Normalfall übersetzt der Java-Compiler die Programme in einen nicht direkt ausführbaren Bytecode (Dateiendung „.class“), den die Java Runtime Environment (JRE) später ausführt. Die aktuelle HotSpot-Technologie kompiliert den Bytecode zur Laufzeit in nativen Prozessorcode und optimiert diesen abhängig von der verwendeten Plattform. Diese Optimierung findet dabei nach und nach statt, so dass der Effekt auftritt, dass Programmteile nach mehrmaliger Abarbeitung schneller werden. Andererseits führt diese Technik, die ein Nachfolger der Just-In-Time-Compilierung ist, dazu, dass Java-Bytecode theoretisch genau so schnell wie native, kompilierte Programme ausgeführt werden könnte.

Die HotSpot-Technik ist seit der JRE Version 1.3 verfügbar und wurde seitdem stetig weiter verbessert.

Beispiele für Bytecode-Compiler sind javac (Teil des JDKs) und Jikes von IBM.

Native Compiler

Es existieren auch Compiler für Java, die Java-Quelltexte oder Java-Bytecode in „normalen“ Maschinencode übersetzen können, so genannte Ahead-of-time-Compiler. Nativ kompilierte Programme haben den Vorteil, keine JavaVM mehr zu benötigen, aber auch den Nachteil, nicht mehr plattformunabhängig zu sein.

Beispiele für native Java Compiler sind Excelsior JET sowie GNU Compiler for Java (GCJ) wie MinGW, Cygwin oder JavaNativeCompiler (JNC).

Wrapper

Als weitere Möglichkeit kann das Java-Programm in ein anderes Programm „eingepackt“ (englisch to wrap) werden; diese äußere Hülle dient dann als Ersatz für ein Java Archive. Sie sucht selbständig nach einer installierten Java-Laufzeitumgebung, um das eigentliche Programm zu starten, und informiert den Benutzer darüber, wo er eine Laufzeitumgebung herunterladen kann, sofern noch keine installiert ist. Es ist also immer noch eine Laufzeitumgebung nötig, um das Programm starten zu können, aber der Anwender erhält eine verständliche Fehlermeldung, die ihm weiterhilft.

Java Web Start ist ein etwas eleganterer und standardisierter Ansatz für diese Lösung – er ermöglicht die einfache Aktivierung von Anwendungen mit einem einzigen Mausklick und garantiert, dass immer die neueste Version der Anwendung ausgeführt wird. Dadurch werden komplizierte Installations- oder Aktualisierungsprozeduren automatisiert.

Beispiele für Java Wrapper sind JSmooth oder Launch4J. JBuilder von Borland und NSIS sind ebenfalls in der Lage, einen Wrapper für Windows zu erstellen.

Literatur

Weblinks

Wikibooks Wikibooks: Java – Lern- und Lehrmaterialien
Wikiversity Wikiversity: Java (Programmiersprache) – Kursmaterialien, Forschungsprojekte und wissenschaftlicher Austausch
 Commons: Java (programming language) – Sammlung von Bildern, Videos und Audiodateien

Einzelnachweise

  1. Jon Byous: Java Technology: The Early Years. Sun Microsystems, 2003, abgerufen am 22. Dezember 2009 (englisch): „On May 23, 1995, John Gage, director of the Science Office for Sun Microsystems, and Marc Andreessen, cofounder and executive vice president at Netscape, stepped onto a stage and announced to the SunWorldTM audience that JavaTM technology was real, it was official, and it was going to be incorporated into Netscape NavigatorTM, the world's portal to the Internet.“
  2. Java 7 Update 1 Release Notes
  3. Java 5 catches up with C#
  4. Installationsbildschirm unter Microsoft Windows
  5. James Gosling, Henry McGilton: The Java Language Environment. 1.2 Design Goals of the Java Programming Language. Mai 1996.
  6. The Java Language: An Overview. 1995 Sun Whitepaper
  7. Hajo Schulz: Daniel Düsentrieb, C#, Java, C++ und Delphi im Effizienztest. Teil 1. In: c't. Nr. 19, Heise Zeitschriften Verlag, Hannover 2003, S. 204-207 (http://www.heise.de/kiosk/archiv/ct/2003/19/204_C-,-Java,-C-und-Delphi-im-Effizienztest,-Teil-1, abgerufen am 21. Oktober 2010).Hajo Schulz: Daniel Düsentrieb, C#, Java, C++ und Delphi im Effizienztest. Teil 2. In: c't. Nr. 21, Heise Zeitschriften Verlag, Hannover 2003, S. 222-227 (http://www.heise.de/kiosk/archiv/ct/2003/21/222_C-,-Java,-C-und-Delphi-im-Effizienztest,-Teil-2, abgerufen am 21. Oktober 2010).
  8. J.P.Lewis, Ulrich Neumann: Java pulling ahead? Performance of Java versus C++. Computer Graphics and Immersive Technology Lab, University of Southern California, 2003, abgerufen am 21. Oktober 2010 (englisch): „This article surveys a number of benchmarks and finds that Java performance on numerical code is comparable to that of C++, with hints that Java's relative performance is continuing to improve.“
  9. C. A. R. Hoare: Monitors: an operating system structuring concept. In: Communications of the ACM. 17, Nr. 10, 1974, S. 549–557.
  10. a b Autoboxing in Java (englisch)
  11. Scott Stanchfield: Java is Pass-by-Value, Dammit! JavaDude.com, abgerufen am 5. November 2010 (englisch).
  12. Types, Values, and Variables. In: Java Language Specification. Sun Microsystems, abgerufen am 6. November 2010 (englisch).
  13. Community-Seite zur Entwicklung des Open-Source-JDKs von Sun
  14. Sun Microsystems Presseankündigung vom 8. Mai 2007 (englisch)
  15. http://openjdk.java.net/projects/jdk7/ Roadmap JDK 7 (englisch)
  16. JDK 7 Features – JSR 292: VM support for non-Java languages (InvokeDynamic) (englisch)
Dieser Artikel existiert auch als Audiodatei.

Wikimedia Foundation.

Игры ⚽ Нужна курсовая?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Java (Technik) — Java Logo Die Java Technik (englisch Java Technology) ist eine ursprünglich von Sun entwickelte Sammlung von Spezifikationen, die einerseits die Programmiersprache Java und andererseits verschiedene Laufzeitumgebungen für Computerprogramme… …   Deutsch Wikipedia

  • Java (Technologie) — Java Logo Java Technik (englisch Java Technology) ist eine hauptsächlich von Sun Microsystems entwickelte Sammlung von Spezifikationen, die einerseits die Programmiersprache Java und andererseits verschiedene Laufzeitumgebungen für… …   Deutsch Wikipedia

  • Java (Plattform) — Die Java Plattform (englisch Java Platform) definiert die Ablaufumgebung (Java Virtual Machine) und Programmierschnittstellen (Java Application Programming Interface) innerhalb der Java Technologie. Der Kern der Java Plattform ist die Java… …   Deutsch Wikipedia

  • Java Platform, Standard Edition 6 — Die Java Plattform (englisch Java Platform) definiert die Ablaufumgebung (Java Virtual Machine) und Programmierschnittstellen (Java Application Programming Interface) innerhalb der Java Technologie. Der Kern der Java Plattform ist die Java… …   Deutsch Wikipedia

  • Java Plattform — Die Java Plattform (englisch Java Platform) definiert die Ablaufumgebung (Java Virtual Machine) und Programmierschnittstellen (Java Application Programming Interface) innerhalb der Java Technologie. Der Kern der Java Plattform ist die Java… …   Deutsch Wikipedia

  • Java VM — Java Logo Die Java Virtual Machine (abgekürzt Java VM oder JVM) ist der Teil der Java Laufzeitumgebung (JRE) für Java Programme, der für die Ausführung des Java Bytecodes verantwortlich ist. Hierbei wird im Normalfall jedes gestartete Java… …   Deutsch Wikipedia

  • Java 2 Enterprise Edition — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java 2 Platform Enterprise Edition — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java EE — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java Platform Enterprise Edition — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”