Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv

Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv

  1. heise Developer
  2. Rubriken
  3. Werkzeuge Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv
  4. Entwicklung der Java-8-Unterstützung für Eclipse
Werkzeuge 3 Kommentare Parka« Fill Nsw Syn Sportswear »w Nike Parka wOkulZiTPX

Punktgenau zum Java-8-Release am 18. März 2014 hatten die Eclipse-Entwickler ihre Unterstützung für die neue Version der Programmiersprache veröffentlicht Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv. Bei Betrachtung der Hintergründe des Release wird schnell klar, dass es sich für die Community um mehr als ein Update-Release handelte.

Wer sich mit Eclipse beschäftigt, mag wissen, dass im Zentrum diverser Entwicklungen das "Eclipse Project" steht. Darin sind die Kernkomponenten der Java-IDE zu finden, wie sie initial von IBM gestiftet wurden und seitdem weiterentwickelt werden. Bis vor kurzem galt, dass die Kernkomponenten und insbesondere die Java Development Tools (JDT) fest in der Hand von Big Blue waren und sich jeder darauf verließ, dass sich IBM schon weiter darum kümmern werde.

Was allerdings im März veröffentlicht wurde, war in dieser Form nur als Leistung der Community möglich. Die Aufgabe war riesig, das Team bei IBM aus diversen Gründen stark im Umbruch, und zeitweise war es gar nicht sicher, ob sich der Termin einhalten ließ. Das JDT-Team, das unter der Leitung von Srikanth Sankaran (IBM Bangalore) letztlich die Aufgabe gestemmt hat, umfasst auch drei Committer, die nicht bei IBM angestellt sind. Das ist ein wichtiges Signal für die Zukunft von Eclipse.

Es wäre aber falsch, an dieser Stelle nur auf die Committer zu schauen: Im vergangenen Jahr hatte JDT mehr Patches aus der Community erhalten als in "normalen" Zeiten, und ein wahrlich unverzichtbarer Beitrag kam in Form von Bug-Reports. Hier haben die vielen Alpha- und Beta-Tester nicht nur Probleme gemeldet, sondern durch knappe Testprogramme auch exzellente Vorarbeit zur Fehlerbehebung geleistet.

Der Eclipse Compiler for Java

Was mag schon groß dran sein, eine IDE von einer Java-Version auf die nächste umzustellen? Zwar sind einige Operationen in der JDT-Benutzungsoberfläche schon recht komplex (man denke z. B. an Refactorings), aber JDT kratzt nicht nur an der Oberfläche: Der Kern dieser IDE ist der Eclipse Compiler for Java (ECJ), und einen Compiler programmiert man nicht mal eben in der Frühstückspause.

Warum denn überhaupt die Mühe? Die Antwort lautet: zur inkrementellen Kompilierung und als Basis für UI-Features wie Code Assist, Suche und Refactorings. Inkrementelles Kompilieren bedeutet dabei

Alle UI-Features direkt mit den Informationen des Compilers zu versorgen, hat den großen Vorteil, dass sie den Quelltext genau in der semantisch analysierten Form sehen, die benutzt wird, um den ausführbaren Bytecode zu erzeugen.

Die Arbeit an Java 8 hat aber noch eine weitere, wichtige Rolle des Eclipse-Compilers ins Blickfeld gerückt: Da er als Alternativimplementierung zum Compiler javac ins Feld geschickt wird, leisten die Eclipse-Entwickler eine essenzielle Qualitätssicherung. Während viele Programmierer die Sprache Java aus dem Umgang mit javac lernen, basiert die Arbeit der Entwickler zunächst allein auf der Java Language Specification (JLS). Das ist eine Art Grundgesetz der Java-Entwicklung und die Bauanleitung für einen Java-Compiler.

Die Sache wird in dem Moment spannend, wo man die geplante Spezifikation eines neuen Java-Features nimmt, versucht, es zu implementieren, und feststellt, dass sich das so (unvollständig oder widersprüchlich spezifiziert) gar nicht implementieren lässt. Oder dass man das zwar so bauen kann, aber sich die Entwicklung dann nicht so wie versprochen verhält. Für das Kern-Feature von Java 8, die Lambda-Ausrücke, hat Daniel Smith von Oracle exzellente Arbeit beim Spezifizieren geleistet, aber die im März 2014 veröffentlichte Version der JLS ist auch das Ergebnis etlicher Bug-Reports und detaillierter Diskussionen, beeinflusst durch die Arbeiten an ECJ.

Zwei Stufen der Qualitätssicherung durch ECJ Schmuddelwedda Schmuddelwedda Online Schmuddelwedda ShopBestellen Online ShopBestellen Online UVzGSqMp

Als die ECJ-Entwickler überzeugt davon waren, dass ihr Compiler ein bestimmtes Feature korrekt nach JLS implementiert, begann die nächste Runde der Qualitätssicherung: Zeigen javac und ECJ dasselbe Verhalten? Melden beide dieselben Fehler? Tun die übersetzten Programme dasselbe? Stärker noch als bei der rein JLS-basierten Arbeit ließen sich in diesem Vergleich etliche Bugs aufdecken. Einige Abweichungen ließen sich auf Fehler in ECJ zurückführen, aber in vielen Fällen hat der Spezifikationsautor bestätigt, dass ECJ korrekt und javac falsch umgesetzt war.

Idealerweise ließe sich sagen, dass mit Stichdatum 18. März alle Abweichungen analysiert und behoben wären. Leider entspricht das nicht der vollen Wahrheit.

Abweichungen auch nach dem Release

Einige Benutzer mussten bereits feststellen, dass ECJ und javac unter bestimmten Bedingungen unterschiedlich auf Default-Methoden reagieren. Zwar wurden diese genau dazu eingeführt, um bei einer Interface-Evolution die Kompatibilität zu bewahren. Aber wenn eine Bibliothek (insb. die Java Runtime Environment der Version 8) Default-Methoden enthält und diese Bibliothek in ein Java-7-Projekt eingebunden wird, ist das Verhalten des Java-7-Compilers unbestimmt, da er laut Spezifikation nur abstrakte Interface-Methoden kennt. Eine Abstimmung des Verhaltens beider Compiler in dieser Grauzone war vor dem Release leider nicht gelungen. Auch ist dringend von solch einer "halben Migration" zu JRE 8 ohne Anpassung des Compiler-Levels abzuraten. Dennoch wird das Release 4.4 von ECJ in diesem Bereich toleranter sein.

Schwieriger wird es aber in einem anderen Bereich: Für einen Java-8-Compiler ist Typechecking die komplexeste Aufgabe (mehr dazu gleich). Richtig unangenehm wird es, wenn nun ein Java-8-Programm sogenannte Raw Types benutzt, also wenn generische Klassen oder Interfaces ohne Typargumente verwendet werden, etwa "List" ohne spitze Klammern.

Weitreichende JDK-Bugs

Cartoon Shop Online Karstadt Kaufhof Im Bei Galeria zLMSUpqVG
  • Unchecked conversion is allowed by method type argument bound checking
  • Widening of capture vars occurs at unspecified times

In diesem Bereich hat javac einen bekannten, weitreichenden Bug, der bewirkt, dass javac Programme akzeptiert, die laut JLS illegal sind. Bei einigen dieser Programmen könnte man noch sagen, dass sie zwar keine Java-Programme sind, aber trotzdem funktionieren. Bei anderen lässt sich jedoch zeigen, dass sie Laufzeitfehler erzeugen, insbesondere ClassCastException, und zwar an Stellen wo gar kein Cast im Quelltext steht. Das ist nicht das, was man von einer statisch typisierten Sprache erwartet. Leider hat Oracle mehrere Monate vor dem Release entschieden, diesen Bug für Java 8 nicht zu beheben.

Die ECJ-Implementierung scheint näher an der JLS zu sein als die von javac. Allerdings zeigt sich nun, dass Programme teilweise nur aufgrund von Compiler-Bugs akzeptiert wurden (JavaFX hat kürzlich bzgl. des Builder Pattern Ähnliches erfahren). Idealerweise würden nun beide Compiler, javac und ECJ, den Sprung auf Java 8 nutzen, um koordiniert die (teils alten) Compiler-Bugs zu beheben. Da Oracle nun davor zurückscheute, sahen sich die Eclipse-Entwickler teilweise genötigt, derlei Bugs absichtlich in die neue Implementierung zu injizieren. Da es sich aber um einen umfangreichen Bug handelt, dessen Ausmaß niemand wirklich genau beschreiben kann, wird diese Bug-Simulation immer nur eine Annäherung bleiben. Sobald man sich von der Spezifikation entfernt, ist identisches Verhalten der Compiler praktisch unmöglich.

Das ist eine unangenehme Situation für Benutzer von Java 8. Andererseits ist der Ausweg aus dieser Situation klar: Wer sich daran erinnert, wozu Raw Types überhaupt in Java 5 eingeführt wurden (um Migration älteren Codes zu erleichtern), fragt sich doch, ob diejenigen, die jetzt auf Java 8 umsteigen wollen, nicht langsam die Migration auf Java 5 abgeschlossen haben sollten.

Was bleibt unterm Strich? Jede Abweichung, die bei der Entwicklung der Alternativimplementierung aufgedeckt wird, kann die Gesamtqualität von Java nur verbessern, sofern die entdeckten Fehler auch behoben werden.

Preis und Mehrwert

Der Preis: Komplexität

Es ist leicht, Java für seine Komplexität zu kritisieren. Andererseits sehen Lambda-Ausdrücke durchaus einfacher aus als ihre Entsprechung mit anonymen Klassen. Bei genauerer Betrachtung gibt es in Java 8 nun drei Situationen, in denen Programmierer kürzeren Code schreiben können, da sie redundante Typinformation außen vor lassen können: Aufrufe generischer Methoden (Java 5), "diamond"-Ausdrücke (Java 7) und Lambda-Ausdrücke (Java 8). Damit trotz Weglassens noch eine vollständige Typprüfung stattfinden kann, muss der Compiler alle nicht berücksichtigten Typen aus dem Kontext ableiten. Das wird Typinferenz genannt und ist in der JLS 8 durch ein komplexes, neu geschriebenes Kapitel definiert. Diese neue Typinferenz zu
spezifizieren und zu implementieren, war eine immense Anstrengung, die sich aber gelohnt hat: Die neue Spezifikation hat einige Unklarheiten voriger Versionen bereinigt, sodass sich mit mehr Zuversicht sagen lässt, dass Java eine wohldefinierte Sprache ist. Außerdem kann der Compiler bei der Typinferenz dem Programmierer viel Arbeit abnehmen.

Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv

Schwierig wird es nur, wenn Programmierer und Compiler eine unterschiedliche "Vorstellung" von einem Programm haben: Wenn die Typinferenz keine Lösung zur Belegung der weggelassenen Typen findet, ist es schwierig, eine benutzerfreundliche Fehlermeldung zu erzeugen. Entweder sagt der Compiler nur, dass es nicht geht, oder er liefert seitenfüllende Protokolle seines gescheiterten Inferenzversuchs. Einen gesunden Mittelweg mit hilfreichen Hinweisen zu finden, bleibt als Aufgabe für zukünftige Versionen der Compiler.

Ergebnisse der Typinferenz werden in Texthovers dargestellt: unten die Parametrisierung der generischen Methode "comparing"; oben die Interface-Methode "apply", die den Typ der Methodenreferenz bestimmt.

Der Kern des Komplexitätsproblems von Java liegt aber nicht in einem einzelnen Sprachfeature. Die Komplexität jedes neuen Features multipliziert sich vielmehr mit der Komplexität aller vorhandenen. Die neue Typinferenz wäre wesentlich einfacher, wenn keine Raw Types unterstützt werden müssten. Noch deutlicher wird das am Beispiel des Overloading. Im ursprünglichen Design von Java mag es als ein konzeptionell überschaubares Feature gegolten haben. Beim Übergang zu Java 8 ist es ein immenser Kostenfaktor. Insbesondere die neue Typinferenz "verdankt" einen Großteil ihrer Komplexität der Tatsache, dass Overloading zu unterstützen ist.

Eine neutrale Kosten-Nutzen-Analyse zu einer neuen Programmiersprache mag zu dem Ergebnis kommen, dass Overloading seinen Preis nicht wert ist. Bei der Weiterentwicklung von Java stellt sich diese Frage aber nicht – jedes neue Feature muss alle früheren Entwurfsentscheidungen mit bezahlen.

Durchaus Mehrwert

Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv

In einem Punkt ist ECJ mehr als nur die getreue Implementierung der Spezifikation. Der allgemein weniger beobachtete JSR 308 (Type Annotations) mag isoliert betrachtet wertlos erscheinen. ECJ haucht diesem Feature aber eigenes Leben ein, indem das neue Konzept für lückenlose Analysen von Null-Referenzen angewendet wird. Am Beispiel der Null-Analysen lassen sich drei Stufen erkennen:

  • Die Datenflussanalyse des Compilers wird benutzt, um zu prüfen, ob eine lokale Variable den Wert null annehmen kann und ob dieselbe Variable ungeprüft dereferenziert wird (seit Eclipse 3.1). Allerdings ist diese Analyse auf den Kontext einer einzelnen Methode beschränkt, es gibt keine Informationen über die von außerhalb kommenden Werte.
  • Methodensignaturen lassen sich durch Null-Annotationen (@NonNull vs. @Nullable) um Verträge anreichern, sodass die Analyse auch über Methodengrenzen möglich wird (seit Eclipse 4.2). Allerdings kann man nur bestimmte Programmstellen annotieren; insbesondere, ob die Elemente einer Collection null sein können oder nicht, lässt sich nicht erfassen.
  • Mit Typannotationen (JSR 308) wird die Frage, wo null erlaubt ist, als Bestandteil des Typsystems aufgefasst. Damit rückt es in die erreichbare Nähe, dass ein erweiterter Typcheck lückenlos alle NullPointerExceptions bereits beim Kompilieren aufdeckt.
  • Großhandel Glestore Glestore Herren Kapuzenjacke Herren Winterjacke Großhandel drCoeBx

ECJ erkennt Null-Annotationen in allen vom JSR 308 vorgesehenen Positionen und bezieht diese in die Null-Analyse mit ein. Für eine lückenlose Untersuchung fehlt nur noch ein Baustein: Es muss möglich sein, auch für Bibliotheken anderer Anbieter, die keine Nulltyp-Annotationen haben, diese extern zu definieren.

Verwendung von Null-Typannotationen am Bespiel von Generics. Oben die sichere Verwendung von Typen mit und ohne "null". Unten: Der Compiler meldet einen Fehler, der sonst später bei der Verwendung der Ergebnisliste zu NullPointerException führen könnte.
Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv

Diese Verwendung entspricht genau der Intention des JSR 308: Durch neue Annotationen und durch Erweiterungen des Typechecking lassen sich viele typische Programmierfehler bereits beim Kompilieren vollständig erkennen, was deutlich größere Sicherheit bringt als jede heuristikbasierte statische Analyse.

Fazit

Fazit, Ausblick und noch ein kleiner Exkurs

Auch nach der Verschiebung des Release-Datums im letzten Jahr war die Arbeit an Java 8 ein ehrgeiziges Unterfangen. Die Konkurrenz zwischen javac und ECJ ist eine wichtige Triebkraft für die Verbesserung von Java. Hierbei war das letzte Quartal 2013 die spannendste Phase: In diesem vergleichsweise kurzen Zeitfenster war die Spezifikation vollständig genug, um sie zu implementieren, und es war noch Gelegenheit, Schwachstellen aufzudecken, die zu Verbesserungen in der nächsten Version führten. Auch wenn sich insbesondere im Punkt Raw Types keine vollständige Übereinstimmung der Compiler erreichen ließ, hat die Spezifikation eine hohe Qualität erreicht.

Für den Benutzer von Java 8 lassen sich erhebliche Verbesserungen bei zwei zentralen Konzepten verbuchen: Algorithmen und Typen. Wer einen hohen algorithmischen Anteil in seinen Programmen hat, wird aus Lambda-Ausdrücken und den darauf ausgerichteten Erweiterungen der Bibliotheken großen Nutzen ziehen. Wer das Programmieren in Java sicherer machen will, wird finden, dass ein reiches Typsystem viele Probleme lückenlos beim Kompilieren aufdecken kann. ECJ nutzt das am Beispiel der Nullpointer-Analysen.

Interessanterweise hat Java 8 demgegenüber keine Neuerung für eine zentrale Frage der objektorientierten Softwareentwicklung: Wie verbindet man einzelne Klassen und Objekte zu einem System? In Java kann ein Objekt (Instanz) eine Referenz auf ein anderes Objekt halten, aber es gibt kaum Unterstützung, in einem Graph von Millionen von Objekten zur Laufzeit sinnvolle Strukturen aufrechtzuerhalten. Blickt man auf Klassen, gibt es nur ein weiteres Prinzip: die viel kritisierte Vererbung.

Es ist nicht abzusehen, dass Java in diesem Bereich grundlegende Innovationen einführt, aber es gibt Alternativen. Im Rahmen des Object-Teams-Projekts (seit 2010 ein Eclipse-Projekt) wurde die Sprache Java zu OT/J erweitert, das drei neue Konzepte einführt:

  • Sogenannte Rollenobjekte lassen sich dynamisch einem Objekt zuordnen und können dieses spezialisieren. Hiermit lässt sich das Verhalten eines Systems zum Beispiel situativ anpassen.
  • Rollenobjekte werden in einem sogenannten Teamobjekt zusammengefasst, wobei diese Teams eine weitaus stärkere Kapselung erreichen, als sie in reinem Java möglich ist. Durch sie wird die große Flexibilität von Rollen einfach beherrschbar.
  • Teams unterstützen Vererbung im großen Stil: Das gesamte Modul, das ein Team und seine Rollen implementiert, lässt sich in einem Schritt systematisch und konsistent spezialisieren. Dabei lassen sich nicht nur Methoden der Teamklasse überschreiben, sondern auch die enthaltenen Rollenklassen und deren Methoden.

OT/J ist vollständig auf Java 8 migriert. Das bevorstehende Release (25. Juni) unterstützt dann Neuerungen in allen Bereichen: Algorithmen, Objekte und Typen. Dabei ergänzen sich Lambdas und Rollen hervorragend, denn beide bringen jeweils ein weiteres, unabhängiges Grundprinzip der Informatik in die Welt der objektorientierten Programmierung: Mit Lambda-Ausdrücken bekommen Funktionen den Rang von First-class-Objekten. Mit Rollen lassen sich Sichten auf Objekte definieren. Das heißt, es wird möglich, kontextabhängige Objekte zu bauen. Somit lässt sich sagen: Auch 2014 hat die Objektorientierung noch nicht an Kraft verloren, vielleicht ist sie gerade erst dabei, wirklich mit Leben gefüllt zu werden. Und das solide gemeinsame Fundament ist und bleibt ein konsistentes und ausdrucksmächtiges Typsystem.

Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv

Natürlich bleibt JDT ausschließlich der Sprache Java verpflichtet. Neben dem aktualisierten ECJ finden sich viele neue Features in der IDE, wie eine automatische Umwandlung anonymer Klassen in Lambda-Ausdrücke. Weitere, für den Benutzer sichtbare Features sind in Eclipse 4.4 enthalten. Eclipse war, ist und bleibt durch Compiler und IDE ein wichtiger Player in der Weiterentwicklung von Java. (ane)

Stephan Herrmann
promovierte 2002 im Fachgebiet Softwaretechnik an der Technischen Universität Berlin. Die Programmiersprache OT/J wurde an der TUB unter seiner Leitung entwickelt und später als Eclipse-Projekt etabliert. Seit 2010 arbeitet er für GK Software, wo er Mitglied des FutureLab ist. Seitdem ist er auch JDT-Committer.

Online-Referenzen
  • JDT embraces lambda expressions (Slides eines Vortrags von der EclipseCon North America, März 2014)
  • JDT embraces type annotationsHerren Für Rot Gravity Performance Peak Skijacke f7yY6bgv (Slides eines Vortrags von der EclipseCon North America, März 2014)
Kommentare lesen (3 Beiträge)
Schönste Hoch Herbstjacken Amazed Die ModesaisonEin Auf FTulKJc13
Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv
https://heise.de/-2223157 Drucken
Herren Für Rot Gravity Performance Peak Skijacke f7yY6bgv