Java-Logo

JAVA gehört zu den objektorientierten Programmier-Sprachen der 3. Generation (Maschinencode - Assembler - system­unabhängige (höhere) Sprachen) und wurde von der Firma SUN Microsystems entwickelt. Sie wird seitdem von SUN (und nach deren Übernahme durch die Firma Oracle von dieser) und einer weltweiten »Gemeinde« von Open-Source Software-Entwicklern und Programmierern gepflegt und weiterentwickelt.

Die Anfänge

Zeitleiste Programmiersprachen

... von Java liegen im Jahr 1995 und hier konnte auf bereits bestehende Sprachen und Konzepte, insbesondere auf C / C++ und die objektorientierte Konzeption von SmallTalk zurück gegriffen werden. Durch die mit diesen Sprachen gemachten Erfahrungen ließen sich dabei bereits bekannte Schwachpunkte vermeiden. Im weiteren Verlauf hat Java selbst auch andere Sprachen beeinflusst. So ist zum Beispiel die für Java entwickelte automatische Speicher­bereinigung (garbage collection) von C# übernommen worden.

top ↑

Die weitere Entwicklung

Nach 4 Jahren gab es die erste neue Version, Java II, die aber etwas »verschämt« mit Java 1.2 benannt wurde. Hier ist vor allem mit SWING eine (für seine Zeit) gut durchdachte Bibliothek zur Programmierung von graphischen Bedienoberflächen (GUI) hinzugekommen.

Der nächste größere Sprung war Version 5 bei der die etwas irreführende Benennung mit einem vorangestellten »1.« zum ersten Mal wieder aufgegeben wurde. (Beide Versionsangaben wurden aber bis zu Java 9 parallel weiter geführt: zuletzt mit Java 8 aka 1.8). Mit Java 5 wurden parametrisierbare Typen (generic types) eingeführt, die vor allem der »Früherkennung« von Programmierfehlern (bereits beim Kompilieren) dienen und so die Programmsicherheit deutlich verbessert haben.

Die weiteren Versionen brachten wieder Verbesserungen in einzelnen Teilbereichen und neue Bibliotheksklassen, zum Beispiel für einen verbesserten Zugriff auf das Dateisystem. Erst mit den Versionen 8 und 9 gab es wieder tiefgreifendere Änderungen. Java 8 brachte lambda expressions und das Stream - API, mit denen nun auch funktional geprägte Programmierung in Java unterstützt wird. Java 9 brachte die Modularisierung.

Bis hierher wurde der stets wachsende Umfang der Java Bibliotheksklassen bei Java SE (Standard Edition) immer als großer, monolithischer Block mit auf dem Zielrechner abgelegt, wenn Java installiert wurde. Es gab schon längere Zeit Bestrebungen, dies zu ändern, um so nur die Teile mit installieren zu können, die von den eigenen Programmen benötigt werden. Dies wurde mit Java 9 erreicht, was zunächst einige grundlegendere Änderungen in der Verzeichnisstruktur der Java-Installation mit sich brachte.

Gleichzeitig wurde auch der Prozess der Weiterentwicklung von Java selber neu »gedacht« und an die inzwischen bei vielen anderen Software-Produkten bereits üblichen schnelleren Versionszyklen angepasst. Seitdem gibt es halbjährlich eine neue Java-Version und die Devise: was bis dahin an Neuerungen fertig gestellt (und ausreichend genug getestet) ist, kommt mit in das neue Release, alles andere hat dann mit dem nächsten Release eine neue Chance.

Für Nutzer und Software-Entwickler hat das zwei Konsequenzen: neue Möglichkeiten (features) sind schneller verfügbar. Gleichzeitig muss man sich jedes halbe Jahr auf eine neue Java-Version einstellen. Um gerade diesen letzten Punkt etwas zu »entschärfen«, sind bestimmte Versionen als LTS (long-term support) konzipiert, die über einen längeren Zeitraum (mindestens, mit einer gewissen zeitlichen Überlappung, bis zur nächsten LTS-Version) gepflegt und unterstützt werden. Diese sind in der gezeigten Abbildung mit gekennzeichnet.

top ↑

Besonderes Merkmal: Plattformunabhängigkeit

Java ist von Beginn an als plattformunabhänge Sprache konzipiert. Das wird dadurch erreicht, dass der Quellcode zuerst für eine virtuelle Maschine kompiliert und der so erzeugte Zwischencode (Bytecode) auf der jeweiligen Zielplattform dann noch interpretiert wird. Dieses Vorgehen ist zwar durch die Zweistufigkeit aufwändiger. Es ermöglicht aber, in jeder Stufe das Optimierungspotential, das dort zur Verfügung steht, voll ausnutzen zu können.

Beim Kompilieren gibt es so die Möglichkeit, durch Prüfungen des Quellcodes bereits Fehler erkennen und anzeigen zu können. Hier sind auch codespezifische Optimierungen möglich. Bei der anschließenden Interpretation auf der Zielplattform können demgegenüber die dort jeweils vorhandenen plattformspezifischen Möglichkeiten zur Abarbeitungsoptimierung genutzt werden. Zusätzlich stehen dort, während des Programmablaufs, die Informationen zu dem aktuellen Stand (ausgeführte bzw. vom Nutzer aufgerufene / verwendete Programmteile) für weitere Optimierungen zur Verfügung.

Die Plattformunabhängigkeit ist für mich, neben der klaren Grundstruktur von Java und dessen Fähigkeit zur ständigen Weiterentwicklung, einer der wesentlichen Gründe, mit dieser Sprache zu arbeiten.