Title: Targeting Parrot
1Targeting Parrot
- Léon Brocard
- Fotango Ltd.
- acme_at_astray.com
2Outline
- What is Parrot?
- Why target Parrot?
- Targeting
- Modifying Parrot
3Targeting?
set I0, 24 set I2, 1 set I3, 1 set I4, 1
set I5, 3 LBL1 gt I5, I0, LBL2 print I5
print "\n" add I4, I2, I3 set I2, I3 set
I3, I4 set I1, I5 inc I5 branch LBL1 LBL2
end
public class Fib static void Main() int
n 24, a 1, b 1, f 1, i 3
while(i lt n) puti(i) puts("\n")
f a b a b b f
i
4Parrot is
- Virtual machine for dynamic languages
- Register-based (I, N, S, P)
- Portable (bytecode-based)
- High-level
- Fast
- Moving target
5Targeting consists of
- Parsing the source language
- (Doing some data structure munging)
- Outputting assembler / machine code
6Java Virtual Machine
int x, y, z x 1 y 1 z x y
iconst_1 istore_1 iconst_1 istore_2 iload_1 iload_
2 iadd istore_3
7Targeting
- Expression by expression
- Parrot does not have for, while
- Use branch instead
8Parrot Virtual Machine
- Two stage (assemble.pl, parrot)
print Hello world!\n end
0000000 0004 0000 0000 4018 0080 0000 0010
0000 0000020 55a1 0131 524c 5045 0000 0000 002c
0000 0000040 0001 0000 0073 0000 0020 0000 0000
0000 0000060 0000 0000 0001 0000 000d 0000 6548
6c6c 0000100 206f 6f77 6c72 2164 000a 0000 000c
0000 0000120 0018 0000 0000 0000 0000
0000 0000134
9Parrot Virtual Machine (2)
- Two stage (assemble.pl, parrot)
./assemble.pl hello.pasm -o hello.pbc
./parrot hello.pbc Hello world!
10Main methods of targeting
- Output Parrot source code (.pasm)
- Output Parrot bytecode
- Output interpreter (BASIC)
- Output code (cola, jako)
- Hybrid
11Parrot is dynamic
- Not only for dynamic languages, but also fairly
dynamic itself - Modify Parrot for your own use
- Modify the virtual machine
- Modify the opcodes
- Modify the PMCs
12Targeting
- Want to run your language under Parrot?
- Got an existing parser? Simply retarget your
language at Parrot
13Parrot is a register machine
- Mostly for speed
- add I0, I1, I2
- Also a stack machine, so if targeting a stack
language, use the stack for ease of translation
restore I1restore I2add I0, I1, I2save I0
14Adding ops
- What was that about a stack machine?
op iadd() INTVAL x INTVAL y
stack_pop(interpreter, interpreter-gtuser_stack,
x, STACK_ENTRY_INT)
stack_pop(interpreter, interpreter-gtuser_stack,
y, STACK_ENTRY_INT) x x y
stack_push(interpreter, interpreter-gtuser_stack,
x, STACK_ENTRY_INT,
STACK_CLEANUP_NULL) goto NEXT()
15Register allocation
- Use registers for speed
- Use graph colouring, du-chains for lexicals and
symbolic temporaries - Register spilling use spill weights
- Compilers Principles, Techniques and Tools by
Alfred V. Aho, Ravi Sethi, and Jeffrey D. Ullman
16Register allocation imcc
- imcc intermediate compiler for Parrot by Melvin
Smith and Angel Faus - handles register allocation and spillage
(infinite number of typed temporaries or named
lexicals) - in the future constant folding, expression
evaluation, instruction selection, other
optimisations
17Register allocation imcc
_MAIN save "" set I0, 4 add I0, I0, 1
set I0, I0 print I0 print "\n" end ret
.sub _MAIN .arg "" .local int out I0 4
I1 I0 1 out I1 print out print
"\n" end ret
18Adding PMCs
- A little more involved (docs/vtables.pod)
- SchemePair PMC
- car, cdr and all that jazz
- Add ops which use the PMCs
- Caveat tricky, underdocumented atm.
19Calling Conventions
- PDD03 Parrot Calling Conventions
- Caller-save
- Important for exposing public subroutines
- Mostly ignoreable
20Garbage collection
21Debugging
- Parrot debugger
- pdb
- Trace with the -t flag
- or print statements
22TODO -)
- Wait for Parrot to have more features, target
some more languages at it and then finish these
slides - Ship parrot with your language?
- Type conversions / stack manipulations / PMC /
control / subroutines / exceptions /
23If you remember one thing
- Computer languages can easily be targeted at
Parrot
24Thank you