Perl virtual machine: Difference between revisions

Content deleted Content added
m Other implementations: typo(s) fixed: standarization → standardization using AWB
m Bot: http → https
 
(6 intermediate revisions by 6 users not shown)
Line 1:
{{Expert-subject|Free Software|date=March 2011}}
The '''Perl virtual machine''' is a [[Stack machine|stack-based]] [[Application virtual machine|process virtual machine]] implemented as an [[opcode]]s [[Interpreter (computing)|interpreter]] which runs previously compiled programs written in the [[Perl]] language. The opcodes interpreter is a part of the Perl interpreter, which also contains a [[compiler]] ([[Lexical analysis|lexer]], [[Parsing|parser]] and [[Compiler optimization|optimizer]]) in one executable file, commonly /usr/bin/perl on various [[Unix-like]] systems or perl.exe on [[Microsoft Windows]] systems.
 
Line 5 ⟶ 4:
 
===Opcodes===
The Perl compiler outputs a compiled program into memory as an internal structure which can be represented as a tree graph in which each node represents an opcode. Opcodes are represented internally by [[typedef]]s. Each opcode has ''next'' / ''other'' and ''first'' / ''sibling'' pointers, so the opcode tree can be drawn as a 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 source code, so it is possible to [[Decompiler|decompile]] to high-level source code.<ref>{{cite web | url=httphttps://perldoc.perl.org/B/Deparse.html | title=B::Deparse - Perl compiler backend to produce perl code}}</ref>
 
Perl's opcodes interpreter is implemented as a tree walker which travels the opcode tree in execution order from the start node, following the ''next'' or ''other'' pointers. Each opcode has a function pointer to a pp_''opname'' function, i.e. the ''say'' opcode calls the ''pp_say'' function of internal Perl API.
 
The phase of compiling a Perl program is hidden from the end user, but it can be exposed with the B Perl module<ref name="B">{{cite web | url=https://metacpan.org/module/B | title=B - The Perl Compiler Backend}}</ref> or other specialized modules, as the B::Concise Perl module.<ref>{{cite web | url=httphttps://perldoc.perl.org/B/Concise.html | title=B::Concise - Walk Perl syntax tree, printing concise info about ops}}</ref>
 
An example of a simple compiled [["Hello, World!" program|Hello world]] program dumped in execute order (with the B::Concise Perl module):
 
<sourcesyntaxhighlight lang="bashconsole">
$ perl -MO=Concise,-exec -E 'say "Hello, world!"'
1 <0> enter
Line 21 ⟶ 20:
5 <@> say vK
6 <@> leave[1 ref] vKP/REFC
</syntaxhighlight>
</source>
 
Some opcodes (entereval, dofile, require) call Perl compiler functions which in turn generate other opcodes in the same Perl virtual machine.
Line 42 ⟶ 41:
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 the simple signed integer type (''IV''), unsigned integers (''UV''), floating point numbers (''NV'') and strings (''PV'').
 
Perl uses a [[Reference counting|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 drops to 0, then it will be destroyed and its memory is made available for reuse.
 
Other typedefs are Glob Value (''GV'') which contain named references to various objects, Code Value (''CV'') which contain a reference to a Perl subroutine, I/O Handler (''IO''), a reference to [[regular expression]] (''REGEXP''; ''RV'' in Perl before 5.11), reference to compiled format for output record (''FM'') and simple reference which is a special type of scalar that point to other data types (''RV'').
Line 81 ⟶ 80:
 
==External links==
*[httphttps://perldoc.perl.org/perlhack.html#Running The Perl internals: running stage]
*[httphttps://perldoc.perl.org/perlguts.html Introduction to the Perl API]
*[https://metacpan.org/module/RURBAN/B-C-1.42/perloptree.pod The "B" op tree.]