JShell – Read-Eval-Print Loop für Java

Andere Sprachen haben es vorgemacht, zum Beispiel Scala auf der Java Virtual Machine: Es ist möglich, Ausdrücke interaktiv einzugeben und auszuwerten. Die Rede ist von REPL (Read-Eval-Print Loop), die Java 9 enthalten wird.

Sprachen  –  4 Kommentare
JShell – Read-Eval-Print Loop für Java

Java 8 umfasst die JavaScript-Engine Nashorn. Sie lässt sich nutzen, um Java-Ausdrücke interaktiv auszuführen. Aber das ist recht umständlich. Insbesondere müssen Bibliotheken im Classpath liegen, der beim Start von Nashorn angegeben wird, und die Java-Ausdrücke sind in JavaScript einzukleiden.

Neues aus der Java-Welt

Für 2017 sind mit Java EE 8 und Java 9 neue Versionen der Programmierplattform angekündigt. Eine lose Folge von Artikeln zu den wichtigsten Neuerungen wird auf heise Developer Einblicke in die nahe, hier auch ferne Java-Zukunft geben.

Mit Java 9 ändert sich das. Selbst wenn diese Version für andere Dinge wie Modularisierung oder Wertetypen bekannt ist, gibt es einen kleinen Schatz zu heben: ein Juwel namens The Java Shell oder kurz JShell. Dabei handelt es sich um eine interaktive Shell, die alles bieten soll, was man sich für REPL vorstellt. Standardisiert als JEP 222 (Java Enhancement Process) ist sie auch als Projekt Kulla bekannt. Um es auszuprobieren, muss man einfach das JDK von der Projektseite herunterladen und installieren. Im Unterverzeichnis bin befindet sich jshell (bei Windows jshell.exe).

Auftakt

Nach dem Start meldet sich die JShell mit dem Prompt jshell>. Hier können nun Java-Anweisungen mit speziellen JShell-Kommandos eingegeben werden. Sie beginnen mit einem Schrägstrich "/". Zum Beenden der JShell ist beispielsweise /exit erforderlich, ein einfaches "exit" wie bei einer Linux-Shell oder der Windows-Kommandozeile reicht nicht. Befehle ohne Schrägstrich werden als Java interpretiert. Im Zweifelsfall gibt das System einfach die Meldung aus, es kenne die Variable exit nicht. /help oder /? listet die verfügbaren Kommandos und /help /kommando liefert eine kurze Erläuterung zum einzelnen Kommando, wobei auch hier der Schrägstrich anzugeben ist.

Die Shell ist außerdem in der Lage, die Anweisungen in verkürzter Form zu erkennen. Insbesondere ist die Angabe des Semikolons in der Regel nicht mehr erforderlich. Jeder Wert wird automatisch einer temporären Variablen zugewiesen, deren Name mit einem Dollarzeichen beginnt und einfach durchnumeriert wird. Die Shell gibt sogleich das Ergebnis nebst der genutzten Variablen aus. Der folgende Ausschnitt zeigt die Ausgabe nach Eingabe des Strings "123-abc-456".

jshell> "123-abc-456"
$1 ==> "123-abc-456"

Trotz des interpretierenden Charakters bleibt Java in der Shell streng typisiert. Sichtbar ist das beispielsweise, wenn Entwickler eine Variable selbst benennen möchten. Ohne korrekte Typangabe führt das zu einem Fehler.

jshell> start = $1.indexOf("-")
| Error:
| cannot find symbol
| symbol: variable start
| start = $1.indexOf("-")
| ^---^

Mit Typangabe ist jedoch alles gut:

jshell> int start = $1.indexOf("-")
start ==> 3

Die Java-Shell ist keine IDE mit Autocompletion und anderen liebgewonnenen Features. Aber ähnlich einer Linux-Shell bietet sie eine Vervollständigung oder Anzeige einer Auswahl mittels Tab-Taste.

jshell> $1.sub{Tab}
subSequence( substring(