Parrot

Eine VM für mehrere Skriptsprachen

Parrot Intermediate Representation

Einführung

Die Parrot Intermediate Representation, oder kurz: PIR, ist eine an PASM angelehnte Sprache. Jedoch ist sie wesentlich einfacher zu lesen und schreiben.


$ cat einfuehrung.pir
.sub main
    I0  = 42                                    # Zuweisung
    N10 = 3.14                                  # Zuweisung
    I1 = 6 * 7                                  # Arithmetik
    N4 = sqrt I1                                # Funktionsaufrufe
    S1 = "So Long, "
    S2 = S1 . "and Thanks for All the Fish"     # Zeichenkettenoperationen
    print I0
    print "\n"
    print N10
    print "\n"
    print I1
    print "\n"
    print N4
    print "\n"
    print S2
    print "\n"
.end

$ parrot einfuehrung.pir
42
3.140000
42
6.480741
So Long, and Thanks for All the Fish

Symbolische Register

In PASM ist man für die Belegung von Registern selbst verantwortlich. Dies führt vor allem bei umfangreichen Programmen schnell zu Fehlern. In PIR kann man die Verwaltung der Register dem PIR-Compiler übernehmen lassen.

Zum einen gibt es beliebig viele nummerierte symbolische Register. Der PIR-Compiler bildet diese auf die 32 vorhandenen ab. Sollten mehr als 32 symbolische Register in Benutzng sein, sichert der PIR-Compiler die zu Zeit nicht benötigten und stellt diese auch wieder her.


$ cat symbolische_register.pir
.sub main
    $I0  = 42
    $I9999999 = 42
    print $I0
    print " "
    print $I9999999
    print "\n"
.end

$ parrot einfuehrung.pir
42 42

Eine weitere Möglichkeit um Register anzusprechen sind Variablen. Diese werden wie die symbolischen Register auf die tatsächlichen Register abgebildet.


$ cat variablen.pir
.sub main
    .local int answer
    .local num PI, e
    answer = 42
    PI = 3.14
    e = 2.7
    print answer
    print " "
    print PI
    print " "
    print e
    print "\n"
.end

$ parrot variablen.pir
42 3.140000 2.700000

Unterprogramme

In PASM sind Unterprogramme simple Sprungziele. Im Gegensatz dazu gibt es in PIR richtige Funktionen. Auch die Parameterübergabe ist einfacher und wird durch den PIR-Compiler beim kompilieren geprüft.


$ cat unterprogramme.pir
.sub main
    .local int a
    .local num b
    .local string c
    (a, b, c) = foo(1, "blah")
    print a
    print " "
    print b
    print " "
    print c
    print "\n"
.end

.sub foo
    .param int n
    .param string message
    # Hier könnte ihr Quelltext stehen
    .return (42, 3.14, "Hallo Pauli")
.end

$ parrot unterprogramme.pir
42 3.140000 Hallo Pauli
Erstellt von Johannes Barop