zurück zum Artikel

Rakudo *: Zwischenschritt auf dem Weg zu Perl 6

Sprachen

Mit "Rakudo *" (sprich star) ist die erste Version eines Perl-6-Interpreters erschienen [1], die für ein größeres Publikum bestimmt ist. Zweifellos ein großer Moment für die Entwickler, aber was genau dürfen Perl-Anwender davon erwarten und welche Auswirkungen hat die Ankündigung auf Perl 5?

Der Name gibt darauf keine Antwort, da er weder Perl 6 noch bekannte Bezeichnungen wie Alpha, Beta oder RC (Release Candidate) enthält. Das war eine kluge Entscheidung [2] von Projektleiter Patrick Michaud [3], denn der Moment des Fragens, was der Name bedeutet, ermöglicht, eine Botschaft nachzuliefern und einiges an für Perl 6 ungünstig verlaufener Öffentlichkeitsarbeit zu reparieren.

Entgegen vielfacher Wahrnehmung war die OSCON 2000 (damals noch "The Perl Conference") lediglich der Geburtsort der Idee, dem zunächst ein etwa zweijähriger, öffentlicher Prozess der Meinungssuche folgte, was genau an Perl zu verbessern sei. Während dieser Zeit begann Dan Sugalski die neue virtuelle Maschine Parrot [4] zu entwerfen und zu implementieren. Ebenso wie die nachfolgende Ausarbeitung der Syntax der Suche nach der perfekten Sprache ähnelt, die alles enthält, was heute Entwickler erfolgreich anwenden (plus einiges mehr), strebt Parrot ein anspruchsvolles Ziel an. Es möchte Virtual Machine (VM) für möglichst viele dynamischen Sprachen werden, die alle in einem Programm benutzbar sein sollen, womit die Programme Zugriff auf die Bibliotheken sämtlicher implementierter Sprachen hätten. Dazu braucht es universelle Parser-Werkzeuge, die Quellcode in logische Einheiten teilen können, Syntaxbaum-Umwandler, die die logischen Strukturen erkennen und schrittweise in eine Sprache übersetzen, die die VM versteht (was letztlich Bytecode ist), Bytecode Interpreter und Subsysteme die Bytecode-Befehle ausführen, Optimierer und vieles andere mehr.

Die Infrastruktur ist zumindest soweit ausgereift, dass Entwickler vor zweieinhalb Jahren vor staunendem Publikum einen Parrot-Compiler für die Spaßsprache LOLCODE [5] an einem Nachmittag geschrieben hatten. Während der Zeit begann die Arbeit an der heutigen Form des Perl-6-Compilers für Parrot, den man Rakudo [6] nennt. Er wird wohl als das lang ersehnte Perl 6.0 über die Ziellinie laufen, sich jedoch nicht so nennen. Denn alles darf sich Perl 6 nennen, das die zurzeit etwa 40.000 Einzeltests zählende Testsuite besteht, die große Teile der sich immer noch leicht ändernden Spezifikation (Synopsen [7]) abdeckt. Das ist mehr als Rhetorik, denn mindestens fünf weitere Implementierungen (Pugs, elf, Mildew/SMOP, Perlito, viv) verfolgen mit unterschiedlicher Technik unterschiedliche Ziele. Eine der Implementierungen enthält die in Perl 6 formulierte Spezifikation der Syntax [8], die der Kopf des Sprachteams, Larry Wall, pflegt.

Da Tests und kleine Beispielskripte nicht das "echte Programmiererleben" sind, begannen [9] Johan Viklund und Carl Mäsak mit der Wikisoftware November [10] die erste größere Perl-6-Anwendung, die die Seite
november-wiki.org [11] betreibt. November wurde damit Motor für eine Reifephase, nach der Rakudo wohl gut genug für eine größere Öffentlichkeit ist. Dazu trägt eine neue Generation des Parrot-Werkzeugs NQP bei, das Rakudo erlaubt, die Perl-6-Syntax wesentlich genauer zu befolgen. Das und die Tatsache, dass sich wesentliche Teile der Syntax nicht mehr ändern werden, erlauben die Vorhersage, dass sich das "Geschehen" immer weiter in Details und Optimierungen verlagern wird.

Jetzt braucht es die Erfahrung vieler Anwender, damit Sprache und Interpreter massentauglich und produktionsreif werden können. Aber die vielen Module, die für manchen Perl erst wirklich nützlich machen, sind noch zu schreiben. Zwar gibt es mit "Blizkost" (in Rakudo * enthalten) einen neuen Ansatz, die Perl-5-Module innerhalb von Parrot von einem Perl-5.10-Interpreter ausführen zu lassen, und Rakudo-Nutzer werden zudem die Sprachen Ruby und Python sowie deren Module verwenden können, aber der Aufbau eines CPAN6 oder 6PAN ist auch ein wichtiges Ziel. Noch mehr Modulautoren könnten jetzt mit der Programmierung beginnen, weshalb ihnen öffentlich Wirksames präsentiert werden sollte.

Genau das beschloss Patrick Michaud in Gegenwart des Autors auf der YAPC::EU 2009 [12] in Lissabon. Er meinte: "Was auch immer der Stand im zweiten Quartal des nächsten Jahres ist, wird veröffentlicht." Dieses "was auch immer" (englisch Whatever) lässt sich in Perl 6 mit einem Stern ausdrücken, da es für einen Platzhaltertyp namens "Whatever" steht. Patrick brach damit gewollt aus bekannten Versionsschemen aus, da Rakudo * keine Beta, kein RC, keine 0.5 oder 0.9 ist, sondern eine Vorabversion mit Anspruch auf Zuverlässigkeit, weniger auf Vollständigkeit.

Es ist aber nicht sinnvoll, Perl 5 zu verschmähen, um auf ein professionell einsetzbares Perl 6 zu warten, denn das kommt nicht so schnell. Perl 5 entwickelt sich ständig weiter. Besonders mit Perl 5.10 (aktuell ist Perl 5.12), aber auch mit Moose, einem modernen und mächtigen Objektsystem, kamen etliche Perl-6-Ideen hinzu. Viele weitere Konzepte aus Perl 6 sind mit gleichnamigen Perl6::*-Modulen [13] bereits innerhalb von Perl 5 auszuprobieren, allerdings immer in den alten Syntaxgrenzen. Was Rakudo bietet, ist ein "barrierefreier" Vorgeschmack auf einen ausgewiesenen Teil von Perl 6, mit dem sich größere Programme schreiben lassen, die aber in Geschwindigkeit und Speicherverbrauch für viele inakzeptabel sein dürften.


Aber wozu sich mit Perl 6 beschäftigen? Weil Perl 6 eine interessante Sprache ist. Sie hat aus den Fehlern der Vergangenheit gelernt. Vieles, womit sich Perl-5-Anfänger schwer tun, wie kontextsensitive Sigils, eigenwillige Parameterübergabe und die freie, aber umständlich zu schreibende Objektorientierung sind verschwunden oder eine Nicht-Standard-Option. Die Regex-Syntax wurde gründlich aufgeräumt und gehorcht nun klareren Regeln. "use strict" wurde Standard, und auch die Spezialvariablen sowie die Ausnahmebehandlung zeigen, dass Perl erwachsener geworden ist. Der Befehlssatz erinnert nun weniger an eine Unix-Shell, sondern mehr an ein einfaches, aber doch IT-lastiges Englisch. Die wesentliche Perl-Philosophie haben die Schöpfer aber beibehalten.

Nach der Parole "Es gibt mehr als einen Weg" versucht Perl 6, scheinbare Gegensätze wie eine auf Klassen oder Prototypen basierende Objektorientierung, objektorientierte und funktionale Programmierung, strikte und dynamische Typisierung oder auch positionale und benannte Parameter zu verbinden. Damit verlässt Perl die bekannten Grenzen einer "Skriptsprache", bleibt aber seinem alten Grundsatz treu, das Beste aus verschiedenen Welten zu kombinieren. Bereits Perl 1 war eine effektive Fusion aus C- und Shell-Programmierung. Nebenbei erreicht Perl damit auch volle "Buzzword-Kompatibilität", wo sich selbst Fragen nach klinisch sauberen Makros oder "design by contract" nur mit ja, ja und nochmals ja beantworten lassen.

Frei nach Loriot kann man sagen: Wem es missfiel, dass es in Perl 5 für alles einen Reichtum an Lösungen gibt, wird Perl 6 erst recht nicht mögen. Ebenso dürfte die große Anzahl an Operatoren, die nochmals mit Metaoperatoren kombinierbar sind, nicht Jedermanns Geschmack sein, obwohl sie einen dichten und relativ lesbaren Schreibstil erlaubt. Andererseits gibt es schicke kleine Detaillösungen, wie den Befehl "slurp" (nach dem Modul Slurp [14], der den Dateiinhalt direkt zuweisen kann und ohne File-Handle auskommt.

Die wirklich großen Gründe, sich Perl 6 anzusehen, selbst wenn man alles bisher genannte aus anderen Sprachen kennt, sind folgende. Was die Bekanntheit von Perl als CGI-Sprache auslöste, waren neben den guten Datenbanktreibern die regulären Ausdrücke, die man vorher höchstens in awk sah und danach als PCRE in fast allen Sprachen Einzug fanden. Da aber das Einlesen und Verarbeiten von HTML oder E-Mails zu komplexen und kaum verständlichen regulären Ausdrücken führt, kann man in Perl 6 eine Regex in viele Regeln teilen und sie zu Grammatiken gruppieren. Das erlaubt einen Umgang wie in lex und yacc, und die Grammatiken sind zudem ableit- und erweiterbar wie andere Objekte auch. Parrots früher beschriebene Parser Werkzeuge arbeiten damit, und das ist der Grund, warum sich eine in Perl 6 geschriebene Sprachdefinition zu einem Parrot-Compiler kompilieren lässt.

Auch der zweite große Grund hat mit den Grammatiken zu tun. In Wirklichkeit ist Perl 6 keine Programmier-, sondern eine Metasprache mit einer anfängerfreundlichen Startform, die sich aber zur Laufzeit beliebig verändern lässt. Ähnlich wie Lisp, nur mit weniger Klammern und mit wesentlich mehr Grundvokabeln. Es besitzt eine vollständige Introspektion und zur Laufzeit lassen sich sowohl neue Operatoren definieren als auch die internen Objekte des Interpreters verändern. Selbst der Parser, der die Quellen einliest, ist eine Grammatik, die sich jederzeit anpassen lässt. Mit wenigen Zeilen ist die Sprache somit nach den Bedürfnissen des Projekts auszurichten, oder eigene kleine Sprachen, sogenannte DSLs (Domain Specific Languages), lassen sich einfach schaffen.

Die regulären Ausdrücke von Perl 6 sind eine solche DSL. Die Technik kann helfen, mit wenig Aufwand inkompatible Teile umfangreicher Softwaresysteme zusammenzuführen. In einer schnell komplexer werdenden Datenwelt mit vielen Softwarealtlasten eine sicherlich wichtige Aufgabe. Ein anderer großer Trend der letzten Jahre ist der zur Parallelität. Es ist möglich, Anwendungen für mehrere Prozessoren oder Kerne zu schreiben, aber kaum eine verbreitete Sprache gestaltet es bisher einfach. Perl 6 kennt mehrere Befehle und Operatoren, bei denen es nicht auf die Reihenfolge der Datenverarbeitung ankommt und deren Funktion der Interpreter von sich aus verteilen kann. Somit sind selbst Programmierer, die die dahinter liegenden Konzepte nicht vollständig verstanden haben, in der Lage, Parallelität zu nutzen, so wie Perl 5 Prinzipien der funktionalen Programmierung wie Closures und Funktionen höherer Ordnung einfach nutzbar machte.

Wer sich tiefer mit der Sprache befassen will, kann das mit Rakudo * gelieferte Buch lesen, und wer deutsch bevorzugt, findet im Netz mehrere [15] gute [16] Tutorials [17]. Ebenfalls im Lieferumfang sind das sonst separat zu installierende Parrot, Brücken zu Perl 5 (Blizkost) und anderen Sprachen (Zavolaj) sowie einige Module für eine Grundversorgung in Sachen Datenbank, Vektorgraphik, HTTP und einiges andere mehr.

Rakudo * ist ein relativ robustes, aber vergleichbar langsames Demonstrationsobjekt eines ambitionierten Langzeitprojekts. Wer sich für Computersprachen interessiert oder selbst erleben will, wohin sich Perl entwickelt, kann daran große Freude haben. Er sollte sich für seine Programme jedoch keine zu hohen Ziele stecken, da zwar Perl 6 ausdrucksstark ist, aber bisher nur wenige Module gängige Aufgaben abnehmen können.

Herbert Breunung
schreibt regelmäßig Artikel über Applikationsentwicklung in Perl und Perl 6 und spricht auf Konferenzen im In- und Ausland. Er führt seit Jahren ein freies Softwareprojekt und ist am Aufbau der Perl-6-Dokumentation beteiligt.


URL dieses Artikels:
http://www.heise.de/-1015657

Links in diesem Artikel:
[1] http://rakudo.org/node/75
[2] http://use.perl.org/~pmichaud/journal/39411
[3] http://www.pmichaud.com/wiki/Pm/AboutPm
[4] http://parrot.org/
[5] http://lolcode.com/
[6] http://rakudo.org
[7] http://perlcabal.org/syn/
[8] http://svn.pugscode.org/pugs/src/perl6/STD.pm
[9] http://yapc.tv/2008/ye/lt/lt2-01-masak-vilkund-november/
[10] http://github.com/viklund/november
[11] http://november-wiki.org/
[12] http://yapceurope2009.org/ye2009/
[13] http://search.cpan.org/search?query=Perl6&mode=module
[14] http://search.cpan.org/~robau/Slurp/lib/Slurp.pm
[15] http://perl-6.de
[16] http://wiki.perl-community.de/Wissensbasis/Perl6Tafel
[17] http://wiki.perl-community.de/Wissensbasis/Perl6Tutorial
[18] https://www.heise.de/ct/artikel/Perl-6-Ja-ist-denn-schon-Weihnachten-1047299.html
[19] http://www.pcworld.com/printable/article/id,201743/printable.html
[20] http://rakudo.org/node/73