in reply to is perl p-code?

According to wikipedia, p-code is "the assembly language of a hypothetical CPU".

Perl does compile to an intermediary form, and it does have the appearance of assembly language. Perl never serialised the opcodes into a binary for that hypothetical CPU, but the possibility is there.

I always thought of perl as a purely interpreted language.

It's definitely not purely interpreted.

Also, does anyone have any flow-diagrams of how source code makes it to machine code for each category (compiled, JIT, & interpreted)?

Perl code is compiled into a tree of Perl opcode. Optimisations are applied, then the tree is turned into a link list. (I might have the order wrong.) The product looks like:

>perl -MO=Concise,-exec -E"say 'Hello, World' for 1..3" 1 <0> enter 2 <;> nextstate(main 47 -e:1) v:%,{,2048 3 <;> nextstate(main 47 -e:1) v:%,{,2048 4 <0> pushmark s 5 <$> const[IV 1] s 6 <$> const[IV 3] s 7 <#> gv[*_] s 8 <{> enteriter(next->c last->f redo->9) lKS/8 d <0> iter s e <|> and(other->9) vK/1 9 <0> pushmark s a <$> const[PV "Hello, World"] s b <@> say vK c <0> unstack v goto d f <2> leaveloop vK/2 g <@> leave[1 ref] vKP/REFC -e syntax OK

The opcodes are then executed using the following loop in run.c:

while ((PL_op = op = op->op_ppaddr(aTHX))) { }

(That's the whole thing.)

There's no jit compiling yet. Work is being down to provide the option to compile Perl5 to LLVM bytecode. This, in turn, can be jit compiled into machine code. This is the same approach Java uses.