Programmiersprache: Crystal erfolgreich auf Version 1.0 gezüchtet

Nach zehn Jahren Entwicklungszeit gilt die von Ruby inspirierte, objektorientierte und statisch typisierte Programmiersprache als stabil.

Lesezeit: 5 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 25 Beiträge

(Bild: Shutterstock)

Von
  • Rainald Menge-Sonnentag

Die Programmiersprache Crystal ist in Version 1.0 erschienen. Die Schöpfer Ary Borenzweig, Brian J. Cardiff und Juan Wajnerman haben in einem gemeinsamen Beitrag die Veröffentlichung des 1.0 Release und die weiteren Pläne verkündet. Insgesamt blickt das Open-Source-Projekt auf eine fast zehnjährige Geschichte zurück.

Die Syntax von Crystal orientiert sich an der von Ruby, und die Sprache zielt durchaus auf erfahrene Ruby-Entwickler. Crystal startete 2011 zunächst unter dem Namen Joy, den Borenzweig aber laut einem Blogbeitrag von 2016 bereits nach drei Tagen auf Crystal änderte. Die Programmiersprache setzt auf statische Typisierung. Entwicklerinnen und Entwickler müssen aber nicht alle Typen explizit definieren, da Typinferenz die meisten herleitet. Im Gegensatz zu Ruby setzt Crystal auf einen Compiler, statt den Code zur Laufzeit zu interpretieren.

Das Readme im GitHub-Repository beschreibt die Motivation hinter der Sprache folgendermaßen: "Wir lieben die Effizienz von Ruby zum Schreiben von Code. Wir lieben die Effizienz von C zum Ausführen von Code. Wir möchten das Beste aus beiden Welten. Wir wollen, dass der Compiler versteht, was wir im Sinn haben, ohne dass wir Typen überall spezifizieren müssen. Wir wollen volles OOP. Oh, und wir wollen keinen C-Code schreiben, damit das Programm schneller läuft."

Für den letzten Punkt bringt die Sprache eine eigene Syntax für den Aufruf von nativen Libraries mit, die sich unter anderem um die passende Typzuweisung über Aliase kümmert. Ein lib-Binding deklariert den Inhalt von C-Bibliotheken. Die darin enthalten Funktionen lassen sich darunter als fun deklarieren.

Außerdem setzt Crystal von Haus aus auf Null-Safety: Standardmäßig dürfen Variablen unabhängig vom Typ nicht den Wert Nil haben, und der Compiler prüft beim Übersetzen auf Null-Referenzen. So führt beispielsweise das Kompilieren des folgenden Codeausschnitts von der Crystal-Site:

if rand(2) > 0
  my_string = "hello world"
end

puts my_string.upcase

zu einer Fehlermeldung, da die Variable my_string je nach Berechnung der Zufallszahl entweder nicht deklariert und somit Nil ist oder die Zeichenkette hello world enthält. Der Compiler meldet dazu folgenden Fehler:

$ crystal hello_world.cr
Error in hello_world.cr:5: undefined method 'upcase' for Nil \
  (compile-time type is (String | Nil))

puts my_string.upcase

Die Programmiersprache hat zudem ein Makrosystem für die Metapgrogrammierung. Die Makros können beliebige Knoten innerhalb des abstrakten Syntaxbaums (Abstract Syntax Tree, AST) aufnehmen. Die Inhalte müssen dabei vollständige Crystal-Anweisungen sein. So benötigt beispielsweise jede def-Anweisung ein abschließendes end.

Crystal-Bibliotheken werden zu sogenannten Shards (also Kristallscherben oder -splittern als Alternative zu den RubyGems) gepackt. Ein zentrales Repository wie RubyGems.org für Ruby, NPM für JavaScript oder PyPI für Python existiert nicht. Stattdessen erfolgt das Einbinden direkt über die in der dependencies-Sektion angegebenen Git-Repositories:

name: my-project
version: 0.1
license: MIT

crystal: 0.21.0

dependencies:
  mysql:
    github: crystal-lang/crystal-mysql
    version: ~> 0.3.1

Wer bereits vor dem aktuellen Release mit Crystal gearbeitet hat, findet seit dem 0.36.1-Release kaum Änderungen an der Sprache selbst. Nennenswert ist eine Erweiterung für den typsicheren Zugriff auf Tupel. Bei der Standard-Library fallen zudem in Version 1.0 zahlreiche zuvor als deprecated (überholt) gekennzeichnete Elemente weg.

(Bild: Crystal-lang.org)

Wichtig ist vor allem die mit dem Versionssprung versprochene Stabilität der Sprache. So soll jeder Code für Crystal 1.0 auf allen künftigen 1.x-Releases ohne "signifikante Inkompatibilitäten" laufen. Das Team verspricht, dass es Features in der Sprache und in der Standard-Library weder entfernen noch in einer Weise ändern wird, die existierenden Code beeinflusst.

Ziel ist, die integrierte Standardbibliothek weiterzuentwickeln, aber dabei stets die Rückwärtskompatibilität im Blick zu halten. Änderungen, die zu Breaking Changes führen, sollen in einem separaten Crystal-2.0-Zweig entstehen. Künftige Minor Releases der aktuellen Sprachversion werden als 1.x erscheinen, und 1.x.y-Patch-Versionen bringen Bugfixes mit.

In einigen Bereichen ist der Kristall noch nicht fertig gezüchtet. Unter anderem läuft die Version 1.0 noch nicht unter Windows. Auch das Multithreading ist derzeit noch eine Baustelle. Schließlich sollen mit Crystal geschriebene Anwendungen mittelfristig auf ARM-Plattformen laufen, wozu es wohl schon einige Schritte in die richtige Richtung gegeben hat, die aber noch nicht zum Ziel geführt haben.

Weitere Details zu der Programmiersprache, dem 1.0-Release und den damit verbundenen Neuerungen lassen sich der offiziellen Ankündigung entnehmen. Die Sprache ist unter Apache-2-Lizenz auf GitHub verfügbar. Die Dokumentation findet sich auf der Crystal-Site.

(rme)