Suche
Pragmatisch, praktisch, gut

Gosu – Die skriptbare Universalsprache mit offenem Typsystem [Pirates of the JVM]

Redaktion JAXenter

Es ist nicht leicht, die Insel Gosu zu finden, denn die Multiparadigmensprache entzieht sich einer allzu genauen Verortung. Den Legenden der Pirates of the JVM nach kann Gosu mal in der Statischen See, mal im funktionalen Ozean gefunden werden. Scott McKinney, der die Sprache entwickelt hat, erläutert im Interview, was Gosu kann und was es so einzigartig macht.

In diesem Jahr feiert Gosu sein 15-jähriges Bestehen. Die Multiparadigmensprache, deren Ursprung in der Skriptsprache GScript und dem Unternehmen Guidewire Software liegt, hat damit bereits einige Jahre auf dem Buckel. Als Skriptsprache lässt sich Gosu, Dank der Möglichkeit Programme direkt aus dem Source Code auszuführen, noch immer benutzen. Das ist aber bei Weitem nicht alles, was Gosu zu bieten hat.

Klick auf die Karte für die komplette Infografik.

JAXenter: Was hat dich dazu bewogen, Gosu zu entwickeln? Welche Vorteile bietet Gosu, die andere Programmiersprachen nicht haben?

Scott McKinney: Gosu wurde nicht per se entwickelt, sondern ist eher das Ergebnis eines langen und noch immer andauernden evolutionären Prozesses. Den Anstoß für Gosu gab das Bedürfnis meines Arbeitgebers nach einer statisch typisierten Skriptsprache, die es den Kunden ermöglicht, unsere Anwendungssuite zu steuern und anzupassen. Zu dieser Zeit (um das Jahr 2002) gab es dafür schlicht keine geeigneten statisch typisierten Skriptsprachen, wodurch der Ball quasi ins Rollen gebracht wurde. Daher bleibt Gosu bis heute, trotz weitreichendem Feature-Set und dem Status einer „Universalsprache“, eine prägnante und mächtige Skriptsprache. Das ist größtenteils auf die ausgeklügelte Typinferenz und die optionale Kompilierung zurückzuführen. Letzteres, also die Möglichkeit Code direkt aus dem Sourcecode auszuführen, geht auf Gosus offenes Typsystem zurück. Genau dieses hebt Gosu auch von anderen Sprachen deutlich ab.

Im Prinzip geht es in Gosus offenem Typsystem darum, Metatypen außen vor zu lassen, sodass Dritte den Gosu-Entwicklern ihre individuellen Typen direkt und nahtlos zur Verfügung stellen können. Mit dem Begriff „Metatyp“ sind in dem Zusammenhang Type-Typen der Sprache gemeint; der Metatyp von Java ist bspw. java.lang.Class. Dieser Type ist in Javas Typsystem festgelegt und es gibt keine Möglichkeit, diesem Typsystem andere Typen hinzuzufügen. Java-Entwickler schreiben sich typischerweise Codegeneratoren oder indirekte Bibliotheken, um bestimmte Typdomänen in Java abzubilden.

Als einfaches Beispiel sollen an dieser Stelle Property-Dateien dienen, der Java-Standard zum Offenlegen von String-Ressourcen. Hier haben wir eine einfache Property-Datei namens MyProperties.properties aus dem Java-Paket „abc“:

# MyProperties.properties
chocolate=Chocolate
chocolate.dark=Dark Chocolate
chocolate.milk=Milk Chocolate</pre>

Da es keinen typsicheren Zugriff auf diese Daten gibt, stellt Java die Utility-Klasse java.util.Properties als Standardmöglichkeit für den Zugriff auf Eigenschaften im Quellcode bereit:

#var prop = new Properties()
using(var stream = Class.getResource("/abc/MyProperties.properties").openStream()) {
 prop.load(stream)
}
print(prop.getProperty("chocolate.dark"))

Wie man sieht, ist dieser Code wortreich und nicht typsicher. Mit Gosus offenem Typsystem ist die Typdomäne der Properties den Entwicklern direkt freigelegt:

print(abc.MyProperties.chocolate.dark)

Dieser Code ist typsicher und arbeitet nahtlos mit statischen Codeanalyse-Tools und der automatischen Codevervollständigung in einer Entwicklungsumgebung zusammen. Im Prinzip zeigt das Beispiel, wie ein benutzerdefiniertes Typ-Plug-in Gosus offenes API nutzt, um jede Dateiressource einer Property als statischen Typ offenzulegen. Codegenerierung und Interventionen durch den Nutzer sind nicht erforderlich, um dieses Typ-Plug-in zu nutzen.

Zusätzlich zu den Properties bietet Gosu benutzerdefinierte Typunterstützung für XSD/XML, SQL/DDL, JSON und JavaScript an – viele weitere sind zudem in Arbeit. Die kleineren Features, die Gosu hervorheben, umfassen unter anderem die „Binding Expressions„.

JAXenter: Kannst du die Kernprinzipien der Sprache darlegen?

Scott McKinney: Gosu wurde Schritt für Schritt entwickelt und getestet, um den direkten Usability- und Performance-Anforderungen unserer umfassenden Enterprise-Produkte gerecht zu werden. Tausende Entwickler arbeiteten an Gosu und im Laufe der Entwicklung sind Millionen von Codezeilen geschrieben worden.

Früh haben wir erkannt, dass die statische Typisierung ein Schlüsselelement unserer Sprache werden wird. Statisch-deterministische Analysefunktionen, wie zum Beispiel sofortiges Editor-Feedback, automatische Code-Vervollständigung, Code-Navigation, die Nutzung von Features, Refactoring usw., wären sonst nicht machbar gewesen. Und ohne die Bereitstellung dieser Funktionalitäten, hätten unsere Entwickler und usnere Kunden einem massiven Nachteil gehabt. Im Bezug auf die Nutzbarkeit statischer Typisierung haben wir außerdem bemerkt, dass Typinferenz ein wichtiges Thema sein wird, um Gosu prägnanter und „scriptbarer“ zu machen.

Grundsätzlich wollten wir, dass Gosu für die meisten Programmierer vertraut wirkt und zugänglich sowie leicht zu erlernen ist. Zu diesem Zweck ist Gosu im Kern eine entspannte, imperativ/OOP-Sprache. Java-Programmierer sollten bspw. keine Schwierigkeiten haben, auf Gosu zu wechseln.

Wir haben allerdings auch verstanden, dass Gosu sich für eine höhere Produktivität moderner Ideen bedienen und sich andere Sprachen zum Vorbild nehmen muss, die diese erfolgreich umgesetzt haben. Dazu gehören funktionale Programmierung, Typ-Erweiterung, dynamische Features, reifizierte Generics und strukturelle Typisierung – um einige zu nennen. Im Wesentlichen wollen wir erreichen, dass Gosu Entwickler stärkt, sie aber nicht mit komplizierten oder unpraktischen Features überfordert.

JAXenter: Wie würde ein typisches Programm mit Gosu aussehen?

Scott McKinney: Gosu ist eine Universalsprache, die eine Vielzahl an OOP-Typen unterstützt. Dazu gehören Klassen, Aufzählungstypen, Interfaces, Structures, Annotationen, Erweiterungen, Programme, Templates, Funktionen und benutzerdefinierte Typ-Plug-ins. Programmtypen sind dabei Gosus praktischere Antwort auf Javas main-Klassen-Idiom. Eine Programmdatei ist in gewisser Weise eine leere Leinwand, auf der man Top-Level-Variablen, -Statements und -Klassen in beliebiger Anordnung definieren kann. Ein Programm ist außerdem ein First-Class-Type – genau wie eine Klasse. Programme können etwa bspw. auch dem Namen nach referenziert und programmatisch ausgeführt werden.

Hier ist ein einfaches Beispiel, das einige der vorgestellten Features demonstriert. Die Datei Plasma.gs ist als First-Class-Type „Plasma“ direkt aufruf- und ausführbar:

uses javax.swing.*
uses java.awt.*
uses java.awt.image.*
uses java.awt.event.ActionEvent
uses java.awt.image.BufferedImage#*
uses java.lang.Math#*
var size = 400
EventQueue.invokeLater(\ -&gt; showPlasma())
function showPlasma() {
 var frame = new JFrame("Plasma") {:Resizable = false, :DefaultCloseOperation = JFrame.EXIT_ON_CLOSE}
 frame.add(new Plasma(), BorderLayout.CENTER)
 frame.pack()
 frame.setLocationRelativeTo(null)
 frame.Visible = true
}
class Plasma extends JPanel {
 var hueShift: float
 property get plasma: float[][] = createPlasma(size, size)
 property get img: BufferedImage = new BufferedImage(size, size, TYPE_INT_RGB)
 construct() {
	PreferredSize = new Dimension(size, size)
	new Timer(50, \ e -&gt; {hueShift+=0.02 repaint()}).start()
 }
 private function createPlasma(w: int, h: int): float[][] {
	var buffer = new float[h][w]
	for(y in 0..|h)
 	for(x in 0..|w) {
       var value = sin(x / 16) + sin(y / 8)
         + sin((x + y) / 16) + sin(sqrt(x * x + y * y) / 8) + 4
       value /= 8
       assert value &gt;= 0 &amp;&amp; value &lt;= 1 : "Hue out of range"
       buffer[y][x] = value as float
 	}
	return buffer
 }
 override function paintComponent(g: Graphics) {
	for(y in 0..|plasma.length)
 	for(x in 0..|plasma[0].length)
       img.setRGB(x, y, Color.HSBtoRGB(hueShift + plasma[y][x], 1, 1))
	g.drawImage(img, 0, 0, null)
 }
}

Dieses Beispiel veranschaulicht, wie man Top-Level-Variablen, -Funktionen und -Klassen in einer einzigen Datei zu einem Programm oder Skript zusammensetzen kann. Gosus Compiler kann aber auch jederzeit dazu verwendet werden, um das Programm zu einer konventionellen .class-Datei zu kompilieren. Was Gosu für das Scripting ideal macht, ist die Möglichkeit, das Programm direkt aus dem Quelltext heraus auszuführen.

JAXenter: Für welche Art von Anwendungen eignet sich Gosu besonders gut? Für welche eher weniger?

Scott McKinney: Gosu wurde designt, um für jedwede Projektgröße skalierbar zu sein, von kleinen Scripts bis hin zu Enterprise-Anwendungen mit Millionen von Codezeilen. Verwendet werden kann es überall dort, wo auch eine gewöhnliche JVM eingesetzt werden kann. Größere Gosu-Projekte können mithilfe des Plug-ins für IntelliJ verwirklicht werden, das die gesamte Breite und Tiefe der IntelliJ-Features unterstützt. Außerdem kann Gosu, wie bereits erwähnt, aufgrund seiner natürlichen Skriptfähigkeit auch als mächtige und prägnante Skriptsprache verwendet werden – es wurde sogar ein eval()-Konstrukt in die Sprache eingebaut. Zudem integriert Gosu JavaScript direkt im Typsystem und unterstützt JSON nativ. Für die Entwicklung von Android Apps hingegen ist Gosu derzeit eher nicht geeignet. Eine Roadmap für die zukünftige Unterstützung dieses Anwendungsfalles ist aber bereits in Arbeit.

JAXenter: Wie ist der derzeitige Status Quo der Sprache?

Scott McKinney: Gosu ist eine erwachsene Sprache, die seit 2003 in vielen Großunternehmen stark genutzt wird. Aktuell laufen viele Millionen Zeilen operativen Gosu-Codes über die gesamte Welt verteilt. Dabei ist komplett Open Source und kann auf GitHub gefunden werden.

JAXenter: Welche Pläne gibt es für die Zukunft von Gosu?

Scott McKinney: Das Gosu-Team wächst weiter und es gibt zahlreiche Innovationen. Zum Beispiel arbeitet ein seperates Team zurzeit an der Aktualisierung des Plug-ins für IntelliJ und fügt eine Menge neuer und toller Features hinzu. Wir arbeiten auch an einer Lernplattform, bei der wir mit unserer eigenen IDE „Gosu Lab“ den akademischen Bereich und kleinere Projekte ansprechen wollen. Im Rahmen des Gosu Platform Projects sind zahlreiche kleinere Projekte in Arbeit, etwa gosu-web, gosu-js und gosu-db. Diese kann man ebenfalls auf GitHub einsehen. Natürlich arbeiten wir weiterhin an Verbesserungen der Kernsprache – vor kurzem habe ich auf unserer Homepage über einige der neueren Funktionen gebloggt.

JAXenter: Wie steigt man am besten in die Arbeit mit Gosu ein?

Scott McKinney: Für den Einstieg lohnt sich ein Blick auf den Abschnitt „Getting Started“ auf unserer Webseite. Wir sind derzeit dabei, unsere Webseite im Sinne einer besseren User Experience umzugestalten und mit mehr Inhalten zum Lernen von Gosu zu füllen. Den neusten Gosu-Build kann man hier finden.
 

Scott McKinney is a staff engineer at Guidewire where he designed and created Gosu. He currently leads the Gosu engineering team and pounds code by the truckload while listening to way too much retro synthwave.
 

Die Pirates of the JVM

Gehen wir auf Schatzsuche! In der Infografik „Pirates of the JVM“ verbirgt sich so manches Programmiersprachen-Juwel, das inspirierte Entwickler auf der Java-Plattform für sich entdecken werden. Doch sehen Sie selbst…

Haben Sie Lust auf Schatzsuche zu gehen? In unserem Gewinnspiel „Pirates of the JVM“ ist Ihr Rätseltalent gefragt. Belohnt werden Sie mit 3 tollen Preisen…

PIRATES OF THE JVM – DAS GEWINNSPIEL

Piratenflagge via Shutterstock.com / katyam1983

Geschrieben von
Kommentare
  1. Daniel2017-04-05 17:07:19

    Wird es auch einen Artikel über JavaX geben?

    JavaX homepage:

    http://ai1.lol/1003253/raw/goodies

    Youtube - Channel des Entwicklers, mit vielen Beispielen

    https://www.youtube.com/channel/UCSvK6EfxnMTajbe-Qpc6NvA

    Oh, das ist weder ein Joke noch Satire. Würde mich sehr freuen, da mal etwas darüber zu lesen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.