Entdecke das Nashorn in Java

Neuigkeiten von der Insel  –  1 Kommentare

Nashorn ist der Name der neuen JavaScript-Engine im JDK 8. Als separate JavaScript-Engine lässt sie sich via JSR-223 in Java einbinden. Im JDK 8 steht Nashorn direkt zur Verfügung und ersetzt damit nach gut 11 Jahren die bisherige Referenz-Implementierung von Mozilla mit dem Namen Rhino. Nashorn selber ist zu 100 Prozent in Java geschrieben. Das eigentliche Ziel der Projekts war nicht viel mehr als ein sogenannter Proof-Of-Concept (PoC), in dem die Möglichkeiten der neuen bytecode-Instruktionen MethodHandles und InvokeDynamic (JSR-292) aus Java 7 ausprobiert werden sollten. Begonnen wurde im September 2011. Nach gut einem Jahr war Nashorn in einer ersten Version verfügbar. Sehr schnell gelang es, das Projekt zu 100 Prozent konform zu ECMAScript 5.1 zu machen, und die Geschwindigkeit von Rhino um Größenordnungen von 2 bis 10 zu übertreffen.

Performance Nashorn vs. Rino (Quelle: http://www.slideshare.net/lagergren/lagergren-jvmls2013final)

Aber die Geschwindigkeit ist nur ein Aspekt. Viel spannender ist die tatsächlich erreichte ECMAScript-Konformität. Bezogen auf den ECMA-test262 erreicht Nashorn 100 Prozent, während Rhino die 95.90 Prozent nie übertroffen hat. Damit können Anwendungen von der alten Basis problemlos auf Nashorn migriert werden.

Nachdem Nashorn auf JSR-292 aufbaut, war das Thema Performance lange Zeit bestimmend. Die JVM ist für stark typisierte Sprachen wie Java gebaut und die Umsetzung von JavaScript als dynamisch typisierte Sprache führte zu etlichen Problemen. Auch diese scheinen zunehmend zu verschwinden. Positiver Nebeneffekt dieses nicht zu kleinen PoC ist, dass andere dynamische Sprachen wie beispielsweise JRuby ebenfalls von durch Nashorn entdeckten Performance-Optimierungen profitieren.

Nashorn kann aktuell ausprobiert werden. Die OpenJDK 8 Early Access Releases lassen sich direkt für die Wunschplattform herunterladen und enthalten Nashorn vollständig. Das komplette Projekt ist Open Source im Rahmen des OpenJDK. Parallel zur Software gibt es auch die Java SE 8 Early Access Documentation. In ihr ist der Java Scripting Programmer's Guide enthalten, der viele Anwendungsfälle für die Integration von JavaScript in Java enthält. Eine speziell auf Nashorn zugeschnittene Variante existiert bereits.

Jetzt aber schnell noch ein wenig was ausprobieren: Nach der Installation des JDK 8 in ein beliebiges Verzeichnis, kann Nashorn direkt via bin/jjs ausgeführt werden.

jdk1.8.0\bin>jjs
jjs> print("This is a hello from Nashorn");
This is a hello from Nashorn
jjs> quit();

Es können auch direkt JavaScript-Dateien übergeben werden.

jdk1.8.0\bin>jjs d:\temp\test.js
This is hello from test.js

Viel spannender ist es aber, Nashorn direkt in Java zu verwenden. Das gelingt über den JSR-223 und die javax.script.*-API.

 public static void main(String[] args) throws Exception {
// Script Engine Manager
ScriptEngineManager factory = new ScriptEngineManager();
// JavaScript Engine Nashorn
ScriptEngine engine = factory.getEngineByName("nashorn");
// Evaluate JavaScript code
engine.eval("print(\"This is a hello from JavaScript in Java\");");
}

Soweit besteht in der Verwendung von Nashorn kein wesentlicher Unterschied zu Rhino. Lediglich die Performance und Konformität wurden deutlich verbessert. Aber warum genau macht Oracle das? So viel Aufwand für einen PoC?

Vielleicht ist die Antwort wirklich ein einfaches Ja. Oracle hat Gefallen daran gefunden, die JVM als allgemeine Laufzeitumgebung für verschiedene Sprachen zu sehen. Neben Scala und JRuby finden sich immer mehr JVM-Sprachen, die von den Vorteilen der JVM profitieren wollen. Neben Speichermanagement sind es die Runtime-Optimierungen, welche den Versuch extrem attraktiv machen. Aber es kann auch noch mehr Gründe geben. Java und Embedded spielen eine immer stärkere Rolle. Nashorn wird auch auf diesen Plattformen zur Verfügung stehen und in Kombination mit Technologien wie beispielsweise Node.js durchaus eine Alternative für eine noch größere Entwicklergemeinde bieten. Das Thema bleibt also spannend. Vielleicht gibt es auf der diesjährigen JavaOne ja noch ein paar neue Informationen.

Wer mehr über die Details hinter der Implementierung wissen möchte, dem sei eine Präsentation vom diesjährigen JVMLS (JVM Language Summit) empfohlen. Einer der hauptsächlichen Nashorn-Entwickler (Marcus Lagergren, @lagergren) hat über die Herausforderungen bei der Umsetzung von Nashorn referiert. Sie ist aktuell auf Slideshare verfügbar und soll später auch auf OTN inklusive Video zu sehen sein.