Jump to content

Perl virtual machine

From Wikipedia, the free encyclopedia

This is an old revision of this page, as edited by 89.79.152.249 (talk) at 18:38, 16 July 2010 (Data structures). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

The Perl virtual machine is a stack-based process virtual machine implemented as opcodes interpreter which runs a previously compiled Perl programs. Opcodes interpreter is is a part of Perl interpreter which contains also compiler (lexer, parser and optimizer) in one executable file, commonly /usr/bin/perl on various Unix-like systems or perl.exe on Microsoft Windows systems.

Implementation

Opcodes

The Perl compiler outputs a compiled program into memory as an internal structure which can be represented as tree graph which each node represents an opcode. Opcodes are represented internaly by typedefs. Each opcode has next node and sibling node, so the opcode tree can be drawed as basic OP tree starting from root node or as flat OP list in the order they would normally execute from start node. Opcodes tree can be mapped to the actual source code, so it is possible to decompile to high-level source code.[1]

Perl's opcodes interpreter is implemented as tree walker which travels by opcode tree in execute order from start node. Each opcode is assigned with internal pp_opname function, i.e. say opcode calls pp_say function of internal Perl API.

The phase of compiling the Perl program is hidden for end user, but it can be exposed with B Perl module[2] or other specialized modules which provides an access to internal API of compilator and opcode walker like B::Concise Perl module[3].

An example of compiled simple Hello world program with a help of B::Concise Perl module, dumped in execute order:

$ perl -MO=Concise,-exec -E 'say "Hello, world!"'
1  <0> enter 
2  <;> nextstate(main 46 -e:1) v:%,{
3  <0> pushmark s
4  <$> const[PV "Hello, world!"] s
5  <@> say vK
6  <@> leave[1 ref] vKP/REFC

Some opcodes (entereval, dofile, require) call Perl compiler functions which generate another opcodes in the same Perl virtual machine.

Data structures

Perl VM data structures are represented internally by typedefs.

Perl has three typedefs that handle Perl's three main data types: Scalar Value (SV), Array Value (AV), Hash Value (HV). Perl uses a special typedef for simple signed integer type (IV), an unsigned integer (IV), a floating point number (NV) and string (PV).

Perl uses a reference count-driven garbage collection mechanism. SVs, AVs, or HVs start their life with a reference count of 1. If the reference count of a data value ever drops to 0, then it will be destroyed and its memory made available for reuse.

Other typedefs are Glob Value (GV) which contains references to the various objects, Code Value (CV) which contains a reference to Perl subroutine, I/O Handler (IO), a reference to regular expression (REGEXP; RV in Perl before 5.11) and a reference to compiled format for output record (FM).

Special Hash Value is stash, a hash that contains all variables that are defined within a package. Each value in this hash table is a Glob Value (GV).

The internal data structures can be examined with B Perl module[2] or other specialized tools like Devel::Peek Perl module[4].

Other implementations

There is no standarization for Perl language and Perl virtual machine. The internal API should be considered as non-stable and changes from version to version. The Perl virtual machine is tied closely to compiler. These things make very hard to reimplement Perl virtual machine.

The most known and most stable implementation is a B::C Perl module[5] which translates opcodes tree to representation in C language and adds own tree walker.

Another implementation is an Acme::Perl::VM Perl module[6] which is an implementation coded in Perl language only but it is still tied with original Perl virtual machine via B:: modules.

See also

References

  1. ^ "B::Deparse - Perl compiler backend to produce perl code".
  2. ^ a b "B - The Perl Compiler Backend".
  3. ^ "B::Concise - Walk Perl syntax tree, printing concise info about ops".
  4. ^ "Devel::Peek - A data debugging tool for the XS programmer".
  5. ^ "B::C - Perl compiler's C backend".
  6. ^ "Acme::Perl::VM - A Perl5 Virtual Machine in Pure Perl (APVM)".