Suche
Die Java-REPL erklärt

Java 9 Early Access: Hands-on JShell – die neue Java REPL

Alex Zhitnitsky

© Shutterstock.com/attila dudas

Können auch Sie es kaum erwarten, Hand an die neuen Java 9-Features legen zu können? Alex Zhitnitsky hat sich bereits im Vorfeld mit JShell, auch als „Projekt Kulla“ bekannt, beschäftigt und teilt seine Eindrücke im folgenden Artikel mit.

Zuerst erschienen auf dem Takipi-Blog. Übersetzt und bearbeitet von der JAXenter-Redaktion.

Vergangenes Wochenende konnte ich mir endlich die Finger schmutzig machen und mir die Early-Access-Version von Java 9 genauer ansehen. Mein erster Boxenstopp war dabei das auch unter dem Namen „Projekt Kulla“ bekannte JShell – dank ihm konnte ich überhaupt erst genug Mut aufbringen, mich mit der Early-Access-Version von Java 9 zu beschäftigen. Ganz genau! Das offizielle Release-Datum von Java 9 liegt – zur Zeit – im September 2016, die Early-Access-Version verfügt allerdings bereits über eine voll funktionsfähige Version von JShell. Da es sich noch in der Entwicklung befindet läuft zwar noch nicht alles rund, aber das hat uns noch nie aufgehalten.

Fun Fact #1: „Projekt Kulla“ ist die interne Bezeichnung für das Entwicklerteam von JShell. „Kulla“ ist der Name eines mesopotamischen Ziegelgotts, der nach Fertigstellung eines Gebäudes ausgetrieben bzw. verbannt wurde. Ein Schelm, der Böses dabei denkt …

JShell: Worum geht es überhaupt?

JShell ist die erste offizielle Java-REPL (Read-Eval-Print-Loop), also ein Kommandozeilen-Tool, mit dem man Java-Statements laufen lassen kann, ohne dafür Klassen oder Methoden zu benötigen; ähnlich wie Pythons Interpreter oder andere JVM-Sprachen wie Scala und Groovy, die REPL nativ unterstützen. JShell ist definitiv eines der interessantesten Features von Java 9. Wenn Sie sich auch etwas über die anderen erfahren möchten, werfen Sie doch einen Blick auf den kürzlich veröffentlichten Artikel „5 Java-9-Features, die die Softwareentwicklung verändern werden„. Wollte man in Java über REPL verfügen, so musste man bislang auf Alternativen wie repl.it, das über Mehrsprachenunterstützung für das inoffizielle Java REPL-Projekt verfügt, zurückgreifen. Beginnend mit Java 9 wird REPL hingegen zusammen mit dem langtools-Package im JDK gebündelt.

Fun Fact #2: Ein weiteres OpenJDK-Projekt trägt mit „Valhalla“ ebenfalls einen mythologischen Namen. Valhalla zielt über Java 9 hinaus und arbeitet an Features wie Werttypen und reifizierten Generics. Ziemlich krass.

Aber genug davon, wenden wir uns JShell zu! In der folgenden kurzen Session gehen wir einen schnellen Testlauf mit JShell v0.61 durch (Es gibt ein bekanntes Problem mit OSX 10.10.3, bei dem sich der Prompt mit Teilen des Outputs mischt, aber das sollte bald gefixt werden):

Ein Rückblick auf das soeben gesehene: Einige der interessantesten Features von JShell

(inklusive einigen Anmerkungen von Brian Goetz, Java-Spracharchitekt bei Oracle)

1. Semikolons sind optional

Hallo JShell! Aufgrund der schnellen und flexiblen Beschaffenheit der REPL können wir uns etwas entspannen und müssen am Ende unserer Statements keine Semikolons mehr einfügen:

Keine Semikolons in Sicht ...

Keine Semikolons in Sicht …

Tatsächlich handelt es sich einer von uns durchgeführten Umfrage dabei um eines der gefragtesten Java-Features. Die Semikolons werden uns natürlich insgesamt erhalten bleiben, sei es als Trennzeichen oder Separatoren.

2. REPL-Networking

Mit JShell sind wir nicht auf unsere Maschine beschränkt, sondern haben Netzwerkzugriff, was einige interessante Möglichkeiten eröffnet. Stellen Sie sich zum Beispiel vor, es als Terminal für die Kommunikation mit ihrem Server zu nutzen; sich aus der Ferne mit ihm zu verbinden und einige Parameter von außerhalb zu kontrollieren.

Einfaches Beispiel eines HTTP-Headers mit JShell

Einfaches Beispiel eines HTTP-Headers mit JShell

3. Hilfe! Workspaces speichern und laden

Abgesehen von der Ausführung und Auswertung von Statements unterstützt JShell eine Auswahl von Befehlen, die dem User bei der Navigierung der REPL-Umgebung helfen. So kann man Workspaces speichern und laden (womit Java in gewisser Hinsicht einer Skriptsprache ähnelt) und nach Ausführung des gesamten Codes zur Eingabeaufforderung zurückkehren (an diesem Punkt kann man den erwähnten OS X-Bug beobachten).

Weitere nützliche Befehle listen die aktuell verfügbaren Variablen und Methoden sowie den kompletten bislang geschriebenen Code auf (letzteres Feature verhält sich manchmal allerdings noch etwas seltsam) und erlauben Einblick in die vollständige Befehlshistory.

Hier eine komplette Liste der derzeit verfügbaren Befehle:

jshell_3-help1

4. Keine geprüften Ausnahmen

Falls Sie sich Sorgen gemacht haben, dass geprüfte Ausnahmen ihre REPL-Erfahrung ruinieren könnten, kann ich Sie beruhigen: JShell kümmert sich im Hintergrund um sie. Im folgenden Beispiel geht das, was uns eigentlich gezwungen hätte, eine IOException zu fangen, spurlos an uns vorbei. Hier lesen und geben wir eine Datei aus, ohne uns um IOExceptions zu kümmern:

jshell_4-checked

In einem Fall trafen wir auf das Pop-up einer geprüften Ausnhame, und zwar als wir versuchten, einen Thread mit Thread.sleep() laufen zu lassen. Das es sich dabei nicht um ein einzelnes Statement, sondern um eine komplette Methode handelt, muss es vollständig gültiges Java sein:

jshell_5-interrupted

Weiter geht es mit einigen Features, die es nicht in die Aufnahme geschafft habe.

5. Java-Ausdrücke

Eine weitere Fähigkeit des JShell-Terminals besteht darin, dass es Java-Ausdrücke evaluieren kann. String-Verkettungen, Methodenaufrufe, Arithmetik – was man will. Im Prinzip alles, was man in ein System.out.println packen könnte. Wie Sie vielleicht schon bei anderen Evaluationen bemerkt haben, plaziert es das Resultat direkt in einer eigenen Variable und gibt sie aus:

jshell_6-arithmetic

6. Vorwärtsreferenzen

JShell bietet eine ziemlich raffinierte Unterstützung von Vorwärtsreferenzen, man kann also Funktionen definieren, die andere Methoden oder Variablen referenzieren, die erst später definiert werden. Hier ein Beispiel aus dem REPL-Tutorial von AdoptOpenJDK:

jshell_7-forward-ref

7. JShell API

Abgesehen von dem selbstständigen JDK-Tool wird JShell auch ein API, dass seine komplette Funktionalität für den externen Gebrauch verfügbar macht, bereitstellen. Das heißt, dass sich externe Tools anhängen, JShells Ressourcen nutzen und somit interessant Möglichkeiten, wie etwas seine Integration als Teil von IDEs wie Eclipse, IntelliJ oder Netbeans, eröffnen könnten. Noch kreativere Use Cases für das API könnten beispielsweise Tools, die es zur Erweiterung der statischen Analysefähigkeiten nutzen, umfassen. Auch automatisierte Tests oder der Anschluss an JVMs ist denkbar.

8. Definitionen beiläufig ändern

Man kann Variablen, Methoden und Klassen redeklarieren, ohne sich Sorgen um die ursprünglichen Deklarationen machen zu müssen. Sobald man dies angeht, erhält man zwar eine Meldung, die einen darüber informiert was geschehen ist, ansonsten geht jedoch alles seinen gewohnten Gang.

Bonus: All you need is love!

Wenn Sie sich einen Weg in das Verzeichnis /repl/samples bahnen, finden Sie dieses niedliche Sample, das Ihnen mithilfe von Swing 3 kleine Herzen malt:

Java <3 REPL

Wie loslegen?

Führen Sie sich am besten zunächst die Anweisungen mit dem Titel „Adopt OpenJDK: Getting Started Kit“ der London Java Community (LJC) zu Gemüte. Im Folgenden finden Sie eine kurze Zusammenfassung der notwendigen Schritte:

1. Installieren sie das Java 9 Early Access JDK.

2. Erstellen Sie den Kulla Dev Branch:

hg clone http://hg.openjdk.java.net/kulla/dev kulla-dev
cd kulla-dev
bash configure –with-boot-jdk=/path/to/jdk1.8.0
make clean images
make install <=== optional

3. Erstellen Sie die REPL:

cd langtools/repl
bash ./scripts/compile.sh

4. Und jetzt … ist alles bereit:

bash ./scripts/run.sh

Wichtiger Hinweis für for OS X-User: Bevor sie compile.sh und run.sh ausführen, müssen Sie die Skripte editieren und #!/usr/bin/sh in #!/bin/sh ändern.

Fazit

Es ist spannend zu sehen, wie sich Kulla dem Feature-kompletten Status nähert. JShell deckt ein breites Spektrum von Use Cases ab, zuvorderst wird es jedoch allen Entwickeln dabei helfen, ihre neu erworbenen Fähigkeiten auf schnellem Weg zu testen, egal ob es sich um schnödes Java oder eine neue Bibliothek handelt. Des Weiteren hebt JShell Java auf die Stufe von Sprachen, die diese Möglichkeiten bereits seit geraumer Zeit bieten. Vielleicht wird es mit einem offiziellen API und einer besseren Kommandozeilenerfahrung die Grenzen sogar etwas weiter verschieben.

Sind Sie Java- oder Scala-Entwickler? Takipi erkennt alle Ausnahmen und Fehler in Ihrem Code und sagt Ihnen, warum sie auftreten. Die Installation nimmt nur eine Minute in Anspruch: Probieren Sie es aus.

Aufmacherbild: Abstract painted number on wood and rusty screws von Shutterstock.com / Urheberrecht: attila dudas

Verwandte Themen:

Geschrieben von
Alex Zhitnitsky

Alex Zhitnitsky arbeitet bei Takipi, wo er Java- and Scala-Entwickler dabei unterstützt, Probleme in der Produktion zu beheben.

Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: