Parrot virtual machine
Parrot is a
register-based
virtual machine being developed using the
C programming language and intended to run
dynamic languages efficiently. It uses
just-in-time compilation for speed to reduce the interpretation overhead. It is currently possible to compile
Parrot assembly language and PIR (an intermediate language) to Parrot bytecode and execute it.
Parrot was started by the
Perl community, and is developed with help from the
open source and
free software communities. As a result, it is focused on license compatibility (
Artistic License and
GNU GPL), platform compatibility (
Unix,
Microsoft Windows,
Mac OS X and
Classic,
VMS,
Crays,
Windows CE,
Palm OS, and others), processor architectures compatibility (
x86,
SPARC,
DEC Alpha,
IA-64,
ARM, Palms, old Macs), speed of execution, small size (around 700k depending on platform), and being flexible enough to handle the varying demands of Perl,
Python,
Tcl,
Ruby,
Scheme, and other dynamic languages. It is also focusing on improving introspection, debugger capabilities, and compile-time semantic modulation.
The differing properties of
statically and dynamically typed languages have motivated the design of Parrot. Current popular virtual machines such as the
Java virtual machine and the
Common Language Runtime have been designed for statically typed languages, while the languages targeted by Parrot are dynamically typed.
Virtual machines like the Java virtual machine and the current Perl 5 virtual machine are also
stack based. The developers see it as an advantage of the Parrot machine that it has registers, and therefore more closely resembles an actual hardware design, allowing the vast literature on compiler optimization to be used generating code for the Parrot virtual machine so that it will run bytecode at speeds closer to compiled languages like C.
Besides a subset of the planned
Perl 6, an increasing number of languages can be compiled to
Parrot assembly language including
APL,
BASIC,
Befunge,
Brainfuck,
Cola,
Forth,
Jako,
Lisp,
m4,
Miniperl,
Ook!,
Parakeet,
OpenComal,
PHP,
Plot, Pheme,
Punie,
Python,
Ruby,
Scheme,
Span,
Tcl,
URM, and
YAL. Most of these other language implementations are currently still incomplete and experimental.
There is strong interest in parts of the Ruby community. The Python community is taking more of a wait-and-see attitude, due to already having
Psyco, a
just-in-time Python-to-machine-code compiler,
Jython, a Python-to-Java-bytecode compiler, and
IronPython to compile to the
.NET platform, as well the in-development
PyPy, a rewrite of Python in Python itself aimed to provide static code generation as well as high-level optimization.
Parrot is a
free software project, distributed under the same terms as Perl; that is, dual-licensed under both the
GNU General Public License and the
Artistic License.
The project started to implement
Perl 6 and originally had the very dull name "The software we're writing to run Perl 6". The name
Parrot came from an
April Fool's joke in which a hypothetical language named
Parrot was announced that wouldunify
Python and
Perl [
1]. The name was later adopted by this project, which aims to support Perl and Python. Several little languages are being developed along with it which target the Parrot virtual machine.
* First source code released to the world
September 10,
2001.
* Version 0.1.0 "Leaping Kakapo" released
February 20,
2004.
* Version 0.1.1 "Poicephalus" released
October 9,
2004.
* Version 0.1.2 "Phoenix" released
March 6,
2005.
* Version 0.2.0 "NLNet" released
May 8,
2005.
* Version 0.3.0 "Alex" released
October 1,
2005.
* Version 0.4.0 "Luthor" released
December 4,
2005.
* Version 0.4.1 "Foghorn Leghorn" released
January 8,
2006.
* Version 0.4.2 "GPW" released
February 22,
2006.
* Version 0.4.3 "Cold Conure" released
April 2,
2006.
* Version 0.4.4 "Feather" released
May 14,
2006.
* Version 0.4.5 "no name" released
June 19,
2006.
* Version 0.4.6 "no name" released
August 9,
2006.
Parrot code has three forms.
Bytecode is natively interpreted by Parrot.
Parrot Assembly Language (PASM) is the low level language that compiles down to bytecode.
Parrot Intermediate Representation (PIR) is a slightly higher level language than PASM and also compiles down to
Bytecode. It is the primary target of language implementations. PIR transparently manages Parrot's inter-routine calling conventions, provides improved syntax, register allocation, register spilling, and more. PIR code is usually stored in files withthe suffix ".pir".
IMCC is the Intermediate Code Compiler for Parrot and compiles PIR.
Registers
Parrot is register-based like most hardware
CPUs, unlike most virtual machines, which are stack-based. Parrot provides four types of registers:
* I: native integer type
* N: floating point numbers
* S: advanced string registers with
Unicode support
* P: PMC, or
Parrot Magic Cookie — Parrot object type
Up until version 0.3.0, Parrot typically provided 32 registers of each type, with the possibility of enabling 64 registers. Later versions provide an unlimited number of registers; each function can allocate as many registers of each type as it needs.
Arithmetic operations
set I1, 4
inc I1 # I1 is now 5
add I1, 2 # I1 is now 7
set N1, 42.0
dec N1 # N1 is now 41.0
sub N1, 2.0 # N1 is now 39.0
print I1
print ", "
print N1
print "\n"
end
The current tagline of the Parrot project is
"one bytecode to rule them all," a reference to
Tolkien's
One Ring from
The Hobbit and
The Lord of the Rings.
*
Common Language Runtime*
Java virtual machine*
mod_parrot*
Parrot homepage