Perl 6

Die Zukunft des Programmierens

Parrot - Mehr als eine Virtual Machine

Schon Perl 5 ist kein reiner Interpreter, sondern kompiliert den Code in einen Bytecode, der von einer virtuelle Maschine (VM) ausgeführt wird.

Schnell wurde klar, dass der perl5-Interpreter keine geeignete Plattform ist, um Perl 6-Code auszuführen. Also haben sie viele bekannte Perlhacker, wie z.B. Allison Randal daran gemacht, eine neue Virtual Maschine zu schreiben.

Der Name kam ursprünglich von einem Aprilscherz, in dem Larry Wall (Perl) und Guido van Rossum (Python) unterstellt wurde anzukündigen, dass sie Perl und Python zu einer Programmiersprache verschmelzen würden.

Tatsächlich wird es aber nicht unbedingt eine offizielle Perl 6-Implementierung geben wie bei Perl 5, sondern Perl 6 ist eine Sprachspezifikation, so wie ANSI C. Die auf Parrot basierte Perl 6-Implementierung Rakudo ist auch nicht offizieller oder weniger offiziell als der Rest, gilt aber innerhalb der Gemeinde der Perlprogrammierer als sehr erfolgsversprechend.

Design

Es gibt schon viele VMs, wieso also eine neue schreiben?

Einer der Hauptgründe für die Neuentwicklung einer VM war, dass die meisten bisherigen VMs für statisch typisierte Sprachen (Java, .NET) geschrieben und optimiert sind, während Perl und viele anderen interpretierten Sprachen dynamisch typisiert sind, d.h. Typ-Überprüfungen für Variablen werden zur Laufzeit gemacht, nicht zur Compile-Zeit.

Um hohe Geschwindigkeiten zu erreichen, ist Parrot registerbasiert, im Gegensatz zu stackbasierten VMs wie z.B. die von Java.

Parrot kennt beliebig komplexe Datentypen und bringt seinen eigenen Garbage Collector mit, der sich darum kümmert, ungenutzten Arbeitsspeicher zu befreien und dem Betriebssystem zurück zu geben.

Parrot benutzt keinen Stack für Funktionsaufrufe, sondern sogenannte "Continuations". Sie speichern den aktuellen Status des Interpreters (insbesondere die Register) ab, und erlauben es, beliebig weit in der Call Chain zurückzuspringen, ohne den Stack für jeden Funktionsaufruf dazwischen aufräumen zu müssen. Damit sind z.B. Exceptions sehr effizient implementierbar.

Parrot Assembler

Parrot unterstützt vier verschiedene Code-Formate:

  1. PIR, "Parrot Intermediate Representation", ist eine einfach zu schreibende Assembler-Sprache, die recht viel abstrahiert, d.h. als Programmierer muss man sich um recht wenig kümmern, es schreibt sich fast wie eine höhere Programmiersprache.
  2. PASM, "Parrot Assembly", ist ein einfacherer Assembler, und zwingt den Programmier (oder den Compiler, der PASM produziert) z.B. dazu, sich selbst um die Allokierung von Variablen zu kümmern, wie man das von X86-Assembler kennt.
  3. PBC, "Parrot Byte Code" ist das, was Parrot letztendlich ausführt. Alle anderen Eingabeformate werden nach PBC umgewandelt bevor sie ausgeführt werden.
  4. PAST, "Parrot Abstract Syntax Tree" ist eine Darstellung als AST, die nur dafür gedacht ist, von Compilern generiert zu werden, nicht von Menschen per Hand erzeugt zu werden. Damit muss nicht jeder Compiler den AST "zu Fuß" nach PIR oder PASM übersetzen, sondern kann das von den "Parrot Compiler Tools" machen lassen.

Parrot Compiler Tools

Parrot ist nicht nur eine Virtuelle Maschine, sondern kommt auch mit einigen Tools, die das schreiben neuer Compiler besonders einfach machen soll.

Das wichtigste Tool ist die Parrot Grammar Engine (PGE), eine Implementierung von Perl 6 Rules, die das parsen einer Programmiersprache so einfach wie möglichen machen soll.

Für jede Grammatikregel kann man in NQP ("Not Quite Perl 6") eine Funktion schreiben, die das aktuelle Match-Objekt nach PAST konvertiert, oder in ein anderes Format, das man dann weiterverarbeiten kann.

Der PCT-Compiler übersetzt PAST (indirekt) nach PBC.

Rakudo - Perl 6 auf Parrot

Rakudo wird vor allem von Patrick Michaud und Jonathan Worthington entwickelt, es hat jedoch eine breite Basis weiterer Entwickler.

Rakudo ist in einer Mischung von Programmiersprachen geschrieben, und übersetzt Perl 6-Code wahlweise nach PIR, oder führt ihn direkt aus.

Rakudo besteht zur Zeit (September 2009) etwa 15,500 Tests der offiziellen Testsuite, und ist damit eine der am weitesten fortgeschrittenen Perl 6-Compiler.

Der Parser ist in Perl 6 Regexes geschrieben, die von PGE compiliert werden. Jede dieser Regexes kann eine Aktion auslösen, die daraus einen AST baut. Diese Aktionen sind in "Not Quite Perl 6" (NQP) geschrieben, einer Untermenge von Perl 6. Die eingebauten Funktionen sind größtenteils in PIR geschrieben, und zeitkritische Algorithmen wie etwa der Multi-Dispatcher sind in C geschrieben.

Links