Est. 2001 Advanced

Parrot

Parrot is the register-based virtual machine that grew out of the Perl 6 project: born in August 2001 from an April Fools' joke about Perl and Python merging, designed by Dan Sugalski to run every dynamic language on one runtime, and the platform Rakudo Perl 6 ran on for its first seven years. Its more than a hundred monthly releases from 2006 to 2016, its Parrot Design Documents, and its compiler toolkit (PGE, PCT and NQP) shaped Perl 6 far more than its bytecode ever did; MoarVM replaced it as Rakudo's runtime in 2015, the last supported release was 8.1.0 in February 2016, and the project posted an inactivity notice in August 2021 - though its last release manager was still committing fixes in December 2025

Created by Dan Sugalski - designer and 'architect' of Parrot from its start in 2001 until he passed the role to Chip Salzenberg on 21 March 2005; Simon Cozens made the first check-in on 29 August 2001, named the project after his own April Fools' prank and managed releases 0.0.1-0.0.4; Leopold Tötsch was 'patchmonster' and release manager from 0.0.13 (October 2003) to 0.4.5 (June 2006); Allison Randal was architect from 0.4.6 (August 2006) to 2.8.0 (September 2010) and chaired the Parrot Foundation; Christoph Otto was architect from 2.9 (October 2010) until about 5.0 (January 2013); Reini Urban and Bruce 'Util' Gray alternated as release managers from 2013 to 2016

Paradigm A language-agnostic process virtual machine for dynamic languages rather than a language: a register machine with four register kinds (I integer, N float, S string, P 'PMC' - Polymorphic Container, originally 'Parrot Magic Cookie'), first-class continuations, closures, lexical pads, exceptions, multiple dispatch, an object metamodel, native-call (NCI) bindings and hybrid OS/green threads (from 4.11.0). Programmed directly in Parrot Assembly (PASM) or the higher-level Parrot Intermediate Representation (PIR), or targeted from high-level languages through the Parrot Compiler Toolkit (PGE grammars, PAST/POST trees, NQP)
Typing Dynamic at the PMC level - a P register holds any PMC, and every PMC answers a common vtable of operations (add, get_string, invoke, get_attr ...) so that each hosted language can supply its own semantics for numbers, strings, arrays, hashes, subs and objects; I, N and S registers are statically typed native integers, floats and encoding-aware strings. Strings carry their encoding and charset (ICU-backed Unicode) rather than being bags of bytes
First Appeared 2001 - the name comes from Simon Cozens' perl.com April Fools' story of 1 April 2001 ('Programming Parrot', a fake announcement that Perl and Python would merge); the first check-in to the Parrot CVS repository is dated 29 August 2001; Parrot 0.0.1 was released on 10 September 2001, and Cozens' perl.com article 'Parrot: Some Assembly Required' introduced it on 18 September 2001
Latest Version 8.1.0 'Andean Parakeet' (16 February 2016, Reini Urban) is the last tagged and announced release; the repository's VERSION file was bumped to 8.2.0 the next day and the ChangeLog carries an 8.2.0 entry dated 15 March 2016 that was never tagged. After three commits in 2017 and the inactivity notice of 25 August 2021, Reini Urban made some 44 commits in December 2025 (compiler-warning, memory-leak and GC fixes, GitHub Actions CI), after a handful of configure clean-ups by James E Keenan in late November, under a ChangeLog heading for a prospective 8.3.0

Parrot was the virtual machine the Perl community built for Perl 6 - and, more ambitiously, for every dynamic language. Conceived by Dan Sugalski in 2000-2001 as a register machine rather than the stack machines of Java, .NET and Perl 5, it promised that Perl, Python, Ruby and Tcl could compile to one bytecode, share one garbage collector and one object model, and call each other’s libraries. For a decade it was the beating heart of Perl 6: Rakudo was written inside its repository, its grammar engine parsed Perl 6 rules, and its “Not Quite Perl” compiler language became the language Rakudo is still written in. But the ambition was larger than the volunteer workforce, Perl 6 itself took fifteen years to reach a stable release, and in 2013 one of Rakudo’s developers wrote MoarVM as a leaner replacement. Rakudo suspended Parrot support in February 2015, the last Parrot release was 8.1.0 in February 2016, and the project posted an inactivity notice in August 2021. Parrot’s story is an unusually well-documented case study in language-runtime engineering: its Parrot Design Documents, monthly release cadence and public post-mortems are still read by people building virtual machines.

History and Origins

An April Fools’ joke, and a real Perl 6 engine

On 1 April 2001 Simon Cozens published “Programming Parrot” on perl.com: a fake interview in which Larry Wall and Guido van Rossum announced that Perl and Python would merge into a single language called Parrot. Guido was reportedly quoted as wanting a name that began with “P” and sounded right in /usr/bin/, with the Monty Python dead-parrot sketch supplying it, and O’Reilly produced a mock cover for a Programming Parrot book. The prank landed at a moment when the joke had a kernel of truth. Larry Wall had announced Perl 6 in July 2000 as a from-scratch rewrite, and Dan Sugalski, who had taken charge of the interpreter design, was already planning an engine that would not be tied to Perl. When the real project needed a name, it took the joke’s, and Cozens - “as penance”, as the Parrot FAQ later put it - became its first release manager.

The code began on 29 August 2001, when Ask Bjørn Hansen set up the CVS repository and Cozens checked in his working directory with the note “Dan, feel free to nuke.” Parrot 0.0.1 shipped on 10 September 2001. Cozens’ perl.com article “Parrot: Some Assembly Required” (18 September 2001) described the state of play: a register machine with 32 registers each of integer, floating-point, string and PMC type; a Parrot assembler and disassembler; more than a hundred commits in the first week; and Gregor Purdy’s tiny Jako language already compiling to Parrot bytecode. PMCs - “Parrot Magic Cookies”, later renamed Polymorphic Containers - were described as “almost like Perl 5’s SVs, only more so”: tagged values whose behaviour is defined entirely by a vtable of function pointers, so that a Python integer and a Perl integer could live side by side and each behave as its language expected.

The Sugalski years (2001-2005)

Sugalski’s design was worked out in public in Parrot Design Documents (PDDs) and on his blog Squawks of the Parrot. The register-machine choice was defended on pragmatic grounds - the Parrot FAQ argued that “we’re already running with a faster opcode dispatch than any of them are, and having registers just decreases the amount of stack thrash we get”, pointing to Apple’s 68K emulator as a register-based VM that worked - and on the grounds that decades of hardware-compiler literature on register allocation could be reused. Continuations were first-class from the start, subroutine calls were built on them, and the calling conventions (PDD 03) were designed to let any language’s calling semantics be expressed.

Early releases were managed by Cozens (0.0.1-0.0.4), Jeff Goff (0.0.5-0.0.8, the first with release names such as “Octarine”), and Steve Fink (0.0.9 “Nazgul” to 0.0.11 “Dubloon”). Sean O’Rourke’s prototype Perl 6 compiler and Goff’s Python and Ruby experiments joined the languages/ tree in 2002, along with Melvin Smith’s IMCC, the “intermediate code compiler” whose input language became PIR. Leopold Tötsch took over as release manager and “patchmonster” with 0.0.13 “Screaming Pumpkin” on 31 October 2003 and held the job until mid-2006. O’Reilly’s Perl 6 Essentials (2003) and Perl 6 and Parrot Essentials (2004), by Allison Randal, Sugalski and Tötsch, gave the VM its first book-length treatment.

The most public episode of this period was the “Pie-thon”. At OSCON 2003 Sugalski bet Guido van Rossum that Parrot would run a pure-Python benchmark faster than CPython by the following year’s conference; his blog of 14 July 2003 set the stakes at “$10, a round of drinks, and a pie at 10 paces” and specified the rules (Python 2.3 bytecode, at least 30 seconds of runtime, best of three on the same x86 Linux box). Parrot 0.1.0 “Leaping Kakapo” appeared on 29 February 2004, but by OSCON in August the bytecode translator ran only four of the seven benchmarks. Sugalski conceded at the Python lightning talks; Guido graciously declined to throw the pie, and - by Sugalski’s own account in “Pies away anyway” (1 August 2004) - he was pied instead at The Perl Foundation’s auction that evening.

In March 2005 Sugalski posted “Passing on the hat” to the perl6-internals list: “it’s been four and a half years … and I’ll admit, I’m just tired.” He handed the architect’s role to Chip Salzenberg, the former perl 5.004 pumpking, and by the autumn had left the project altogether. His “Parrot post-mortem” of 20 October 2005 - a candid list of what went right (“trusting the code gnomes”) and what went wrong - remains one of the most-quoted retrospectives on open-source VM design.

Funding, foundations and monthly releases (2005-2010)

The same spring the Dutch NLnet Foundation began funding Parrot through The Perl Foundation, reportedly with Tötsch as the principal paid developer; release 0.2.0 of 8 May 2005 was named “NLnet” in thanks. NLnet’s own review two years later found “a marked increase in the pace of development in early 2005”, and from 0.2.x onwards Parrot shipped roughly every month - by 2007 on a fixed monthly schedule (nominally the third Tuesday), with the release-manager hat rotating among Jerry Gay, Patrick Michaud, Will Coleda, Matt Diephouse, chromatic, Jonathan Worthington, Bob Rogers, Bernhard Schmalhofer and others. Allison Randal became architect with 0.4.6 in August 2006 and, on 18 June 2007, moved the project from Perl’s GPL/Artistic dual licence to the Artistic License 2.0.

The tooling that made Parrot matter to Perl 6 was built in these years. Patrick Michaud’s Parrot Grammar Engine (PGE, 2004) implemented Perl 6 rules and a hybrid recursive-descent/operator-precedence parser, and Jeff Horwitz’s mod_parrot (introduced on perl.com in December 2004) embedded the VM in the Apache web server. In June 2007 he created the Parrot Compiler Toolkit (PCT), a set of PIR classes for grammars, abstract syntax trees (PAST) and opcode trees (POST), and moved NQP - “Not Quite Perl”, a Perl 6 subset small enough to bootstrap - into the core in November. With PCT a language implementer wrote a PGE grammar and NQP action methods and got a compiler; the languages/ tree grew to roughly three dozen directories by mid-2007 (APL, BASIC, Befunge, C99, .NET bytecode, ECMAScript, Forth, Lisp, Lua, Scheme, Tcl, WMLScript, Z-code and more), and the Perl 6 compiler inside it was named Rakudo in early 2008.

In June 2008 the Parrot Foundation was announced as a Washington State non-profit to hold the project’s copyrights and trademarks, chaired by Randal with chromatic as secretary; parrot.org, a Trac instance and Subversion replaced the Perl-hosted infrastructure. Rakudo left the repository in February 2009, and on 17 March 2009 Randal released Parrot 1.0.0 “Haru Tatsu”: the first “supported” release, with a frozen public API, a formal deprecation policy, a supported release every three months, and all remaining languages sent to their own repositories. Rakudo Star, the first “usable, early adopter” Perl 6 distribution, followed on 29 July 2010, with Parrot as its runtime.

Design Philosophy

Parrot’s design rested on a handful of convictions, most of them set out in the PDDs:

  • Registers, not stacks. Opcodes name registers directly (add $I0, $I1, $I2), avoiding push/pop traffic and letting IMCC do conventional register allocation. Each subroutine frame has as many registers of each kind as it needs, allocated in the call context rather than a fixed global set (the original fixed set of 32 per type was later replaced by per-frame allocation).
  • Four kinds of value. Integers (I), floats (N) and strings (S) are native and fast; everything with language-specific semantics is a PMC (P). Strings carry an encoding and charset rather than being byte buffers, with ICU providing Unicode tables.
  • Semantics live in the PMC vtable. Addition, stringification, method lookup, invocation, iteration and comparison are vtable slots. A hosted language ships its own PMC types (a Perl scalar, a Python list, a Tcl string) and the same opcode does the right thing for each, so cross-language calls need no marshalling.
  • Continuations underneath everything. Subroutine return, exception handling and coroutines were all expressed as continuations; closures and lexical pads (PDD 20) were built in rather than emulated.
  • Language interoperability as the goal. PDD 31 defined how each high-level language (HLL) gets its own namespace and type mappings, so that a Ruby program could load a Perl 6 module.
  • A compiler toolkit, not just a bytecode. PGE, PCT and NQP were meant to make writing a language for Parrot a weekend project, and the Squaak tutorial walked newcomers through one.
  • Design in public. PDD 00 defined the PDD process itself; the numbered documents - calling conventions (03), coding standards (07), garbage collection (09), embedding (10), objects (15), PMCs (17), security (18), PIR (19), lexicals (20), namespaces (21), I/O (22), exceptions (23), events (24), concurrency (25), AST (26), multiple dispatch (27), strings (28), installation (30) and HLL interoperation (31) - were the project’s constitution.

Key Features

PASM, PIR and bytecode

Parrot code exists at three levels. PASM (Parrot assembly) is a one-to-one textual form of the opcodes. PIR (Parrot Intermediate Representation), accepted by IMCC, adds subroutine declarations with parameters and return values, infix syntax that expands to opcodes, symbolic ($I0-style) temporaries with automatic register allocation, and directives for lexicals, namespaces and classes; it was the target of every serious compiler. Both compile to PBC bytecode, a platform-independent packfile format that could be pre-compiled and loaded directly. A minimal PIR program:

.sub 'main' :main
    say "Hello, World!"
.end

And a recursive function showing parameters, typed temporaries and a call:

.sub 'factorial'
    .param int n
    if n > 1 goto recurse
    .return (1)
  recurse:
    $I0 = n - 1
    $I1 = 'factorial'($I0)
    $I0 = n * $I1
    .return ($I0)
.end

.sub 'main' :main
    $I0 = 'factorial'(10)
    say $I0
.end

The same thing in PASM is visibly lower-level: registers are named explicitly and control flow is by labels and branches.

    set I0, 10
    set I1, 1
loop:
    mul I1, I1, I0
    dec I0
    if I0, loop
    print I1
    print "\n"
    end

Runtime services

Beyond the opcode set (which covered arithmetic, strings, PMC manipulation, control flow, I/O and introspection), the runtime provided:

FacilityNotes
Garbage collectionSeveral collectors over the project’s life; a generational collector (gms) was added in 3.2.0 (March 2011) and is referred to as the default GC in the 7.x release notes, with --gc=ms, ms2 and inf selectable at configure time
ObjectsClasses, roles, attributes and multiple inheritance in the PDD 15 metamodel; NQP later brought its own 6model on top
ExceptionsPDD 23 exception handlers with resumable exceptions, used for die, control flow and language-level exceptions
Multiple dispatchPDD 27 multi-subs and multi-methods selected on PMC types
Native Call InterfaceSignature-based calls into C libraries without writing glue; the runtime library shipped bindings for OpenGL, SDL, ncurses, PCRE, OpenSSL and PostgreSQL
ThreadsHybrid OS/green threads with a --numthreads option from 4.11.0 (December 2012)
EmbeddingA C API (parrot/api.h, PDD 10) for hosting the VM in other programs, exercised by mod_parrot
Toolsparrot_debugger, a profiling runcore, pbc_dump, pbc_merge, and the parrot_config query tool

Compiler toolkit

PGE parsed Perl 6 rules into match objects and could run as recursive-descent or operator-precedence parser within one grammar; PCT’s HLL::Compiler class took a grammar and actions and produced a compiler that could be run interactively, on files or embedded; NQP (and from 2009 nqp-rx, which added Perl 6 regex support to the language itself) supplied the action language. Winxed, Julián Albo’s JavaScript-like language whose compiler was written in Winxed and emitted PIR, was added to the tree in 2011 and became the language much of Parrot’s own tooling was written in.

Evolution

Parrot’s history divides into four phases. The design phase (2001-2005) under Sugalski produced the architecture, the PDDs and the first two books, but releases were irregular and the languages were prototypes. The NLnet-funded, monthly-release phase (2005-2009) under Tötsch, Salzenberg and then Randal produced PGE, PCT, NQP, Rakudo and the Foundation, culminating in 1.0 and its API stability promises. The post-1.0 phase (2009-2012) was one of ambitious refactoring: the i386 JIT was removed in 1.7.0 (October 2009) to be rewritten; 2.5.0 (June 2010) began “Lorito”, a plan to rebuild the ops on a minimal self-hosting core (“M0”) that could be JIT-compiled; 3.0.0 (January 2011) delivered a new embedding API; and 4.11.0 (December 2012) delivered hybrid threads. Randal left for Canonical in 2010 and Christoph Otto became architect, restructuring the project into teams because “the architect position has had a bus number of one”. The maintenance phase (2013-2016) under Bruce Gray and Reini Urban kept the monthly cadence alive - with two scheduled releases skipped in 2013, “pining for the fjords” - while the commit count fell from 7,800 in 2008 to a few hundred a year.

The decisive change was outside the project. Rakudo gained a JVM backend in 2013, and at a YAPC::NA hackathon the same year Jonathan Worthington unveiled MoarVM, which he had been building privately - announced on his blog on 31 May 2013 - as a leaner runtime for NQP and Rakudo, with an internal model closer to 6model than Parrot’s. Within two years MoarVM had “almost entirely replaced Parrot as the language’s runtime of choice” (Worthington’s 2021 VMIL keynote). On 16 February 2015 Patrick Michaud announced that Rakudo would suspend Parrot support after 2015.02: the list refactor, native shaped arrays and grapheme-based strings needed features Parrot lacked, “most of the current userbase had switched to MoarVM”, and no developer wanted to keep the backend alive. Rakudo’s first stable release that December ran on MoarVM. Parrot 8.1.0 followed on 16 February 2016 as the final release; NQP deleted its Parrot backend that August, and Debian dropped the package the same month.

Current Relevance

Parrot is discontinued. README.pod has carried the notice “The Parrot VM is no longer being actively developed” since 25 August 2021, parrot.org no longer serves pages (docs mirrors survive at parrot.github.io), and the Parrot Foundation was dissolved in 2014. The source still builds: the PLATFORMS file records successful builds during 2015 (most dated December) on macOS (clang and gcc), Linux (gcc 4/5 and clang 3), Windows (MSVC 10 and 12, MinGW) and Cygwin, with 2015 reports for MIPS, FreeBSD 10, OpenBSD 4.9 and OpenSolaris 11 and older (2010-2011) reports for ARM, PowerPC, SPARC64, NetBSD and Intel’s icc; the project’s declared “core platforms” were Linux, Win32, OS X, Cygwin, FreeBSD, NetBSD, OpenBSD and Solaris on x86 (32- and 64-bit) plus PPC for OS X. In December 2025 Reini Urban, the last release manager, made some 44 commits cleaning up warnings for modern compilers, fixing memory leaks under AddressSanitizer and adding GitHub Actions CI, under a ChangeLog heading for an unreleased 8.3.0 - so the code compiles on a 2026 toolchain, even though nothing runs on it in production. The repository (617 stars, 146 forks) is the primary source for the project’s history; the ChangeLog goes back to the first commit of 29 August 2001.

What survived is elsewhere. NQP, born as Parrot’s action language, is the implementation language of Rakudo on MoarVM, the JVM and JavaScript. PGE’s approach to Perl 6 grammars lives on in Raku’s grammar engine. MoarVM is itself a register-based VM whose early design was informed by what Parrot got right and wrong. And Sugalski’s post-mortem, Otto’s “bus number of one” post and Michaud’s suspension announcement are cited whenever people discuss why language runtimes succeed or fail.

Why It Matters

Parrot was the first serious attempt at a shared runtime for dynamic languages, predating Microsoft’s DLR (2007) and the JVM’s invokedynamic (2011); its PMC vtables and HLL namespaces were an early answer to the question of how a Python list and a Perl array can coexist in one heap. It normalised the register-machine design for scripting-language VMs at a time when the stack machine was the default (Lua 5.0 made the same choice independently in 2003, and Android’s Dalvik followed in 2008). It pioneered a monthly release cadence with rotating release managers and quarterly “supported” releases years before that became common practice. And for the Perl 6 project it was indispensable: without a VM to target, and without PGE, PCT and NQP, there would have been no Rakudo - the Perl 6 Weekly’s farewell in 2016 called Parrot “one of the giants on whose shoulders Rakudo Perl 6 is standing”. Its failure to become the universal runtime it aimed to be is the other half of the lesson: a volunteer project that tries to serve every language at once, while the one language that needs it most is still being designed, can find that its most important user outgrows it.

Further Reading

  • Repository: github.com/parrot/parrot - docs/parrothist.pod (every release with date, name and manager), docs/pdds/ (the design documents), docs/book/pir/ (the PIR book), ChangeLog, CREDITS, DONORS.pod, PLATFORMS
  • Documentation mirrors: parrot.github.io/parrot-docs7/7.3.0/html/ and the 0.x-6.x series under parrot-docs0parrot-docs6
  • Simon Cozens, “Programming Parrot” (perl.com, 1 April 2001) and “Parrot: Some Assembly Required” (perl.com, 18 September 2001)
  • Dan Sugalski, Squawks of the Parrot (sidhe.org/oldblog): “The Python vs Parrot challenge is on!” (14 July 2003) and “The Parrot post-mortem” (20 October 2005); “Passing on the hat” (perl6-internals, 21 March 2005); “Pies away anyway” (1 August 2004)
  • Allison Randal, Dan Sugalski and Leopold Tötsch, Perl 6 Essentials (O’Reilly, 2003) and Perl 6 and Parrot Essentials (O’Reilly, 2004)
  • NLnet, “Impact of Parrot grant” (nlnet.nl/project/parrot, 16 October 2007; project page last updated 9 November 2007) and press release “NLnet sponsors Parrot” (18 April 2005)
  • Jeff Horwitz, “Introducing mod_parrot” (perl.com, 22 December 2004)
  • Christoph Otto, “Parrot has a new architect. What now?” (reparrot.blogspot.com, 21 October 2010)
  • Patrick Michaud, “Suspending Rakudo support for Parrot” (pmthium.com, 16 February 2015)
  • Perl 6 Weekly, “2016.31 An End Of An Era” (1 August 2016)
  • Jonathan Worthington, “MoarVM: A virtual machine for NQP and Rakudo” (6guts.wordpress.com, 31 May 2013) and “Reflections on a decade of MoarVM” (VMIL 2021 keynote abstract)

Timeline

2001
On 1 April Simon Cozens publishes 'Programming Parrot' on perl.com, a fake announcement that Larry Wall and Guido van Rossum are merging Perl and Python into a language called Parrot (the name reportedly chosen because it began with 'P' and evoked the Monty Python dead-parrot sketch), complete with a mock O'Reilly book cover. Dan Sugalski, who has been designing the Perl 6 interpreter since Perl 6 was announced in July 2000, adopts the name for the real thing. Ask Bjørn Hansen sets up the CVS repository and Cozens checks in his work directory on 29 August ('Dan, feel free to nuke'); Parrot 0.0.1 ships on 10 September with Cozens as release manager, and his perl.com article 'Parrot: Some Assembly Required' (18 September) describes a register machine with 32 registers each of integer, float, string and 'PMC' type, over 100 CVS commits in the first week, and Gregor Purdy's Jako mini-language already compiling to Parrot bytecode. Releases 0.0.2 (5 October) and 0.0.3 (8 December) follow
2002
Jeff Goff takes over as release manager for 0.0.5 (16 April) to 0.0.8 'Octarine' (1 September), the first releases with names, and Steve Fink for 0.0.9 'Nazgul' (19 December). Sean O'Rourke's languages/perl6 prototype compiler and Goff's languages/python and languages/ruby directories appear in the tree (July-August), and on 31 May Melvin Smith checks in the first version of IMCC, the register-allocating 'intermediate code compiler' whose input language becomes PIR
2003
At OSCON in July Sugalski bets Guido van Rossum that Parrot will run a pure-Python benchmark faster than CPython by the following OSCON; his blog post of 14 July sets the stakes at '$10, a round of drinks, and a pie at 10 paces'. O'Reilly publishes 'Perl 6 Essentials' by Allison Randal, Sugalski and Leopold Tötsch, the first book with chapters on Parrot. Steve Fink ships 0.0.10 'Juice' (16 March) and 0.0.11 'Dubloon' (20 September); Leopold Tötsch becomes release manager with 0.0.13 'Screaming Pumpkin' (31 October), and a languages/tcl directory is started in October
2004
Parrot 0.1.0 'Leaping Kakapo' is released on 29 February. At OSCON in August Sugalski concedes the 'Pie-thon' bet - the Python-bytecode translator ran four of the seven benchmarks - and, Guido having graciously declined to throw the pie, is pied instead at The Perl Foundation's auction that evening (his own account is the 'Pies away anyway' post of 1 August). 'Perl 6 and Parrot Essentials' (second edition of the 2003 book) appears from O'Reilly. Patrick Michaud's Perl 6 grammar engine, renamed from P6GE to PGE in November, gives Parrot a parser generator based on Perl 6 rules; 0.1.1 'Poicephalus' ships on 9 October, and on 22 December perl.com publishes Jeff Horwitz's 'Introducing mod_parrot', which embeds the VM in the Apache web server
2005
On 21 March Sugalski posts 'Passing on the hat' to perl6-internals: 'it's been four and a half years ... and I'll admit, I'm just tired', handing the architect role to Chip Salzenberg (perl 5.004 pumpking and leader of the earlier Topaz rewrite); his 20 October blog post 'The Parrot post-mortem' reviews what went right and wrong in his tenure. In April the Dutch NLnet Foundation begins funding Parrot development through The Perl Foundation, reportedly with Tötsch as the principal funded developer (NLnet's press release is dated 18 April) - release 0.2.0 on 8 May is named 'NLnet', and NLnet's later impact review notes 'a marked increase in the pace of development in early 2005', with releases now roughly monthly (0.2.1 through 0.4.0 'Luthor', 4 December). Allison Randal starts Punie (Perl 1 on Parrot) in July, François Perrad starts Lua on Parrot in November, and Roger Browne's Amber for Parrot arrives the same month
2006
Salzenberg manages 0.4.6 (8 August) and 0.4.7 'Caique' (14 November) himself and then steps back to lead developer; Allison Randal becomes architect with 0.4.6 and holds the post for four years. Cardinal (Ruby, July) and an ECMAScript compiler (August) are added to the tree by Kevin Tew, and the languages/ tree grows to roughly three dozen directories by mid-2007 (APL, BASIC, Befunge, C99, .NET bytecode, Forth, Lisp, Lua, m4, Scheme, Tcl, WMLScript, Z-code and more)
2007
Release management rotates monthly among Jerry Gay, Patrick Michaud, Will Coleda, Matt Diephouse, chromatic and Randal (0.4.8 in January to 0.5.1 in December). On 18 June Randal switches the licence from Perl's GPL/Artistic disjunction to the Artistic License 2.0 (RT #43165). On 23 June Michaud creates the Parrot Compiler Toolkit (PCT) from his PAST branch - grammar, abstract syntax tree and opcode tree classes that turn a PGE grammar into a compiler - and in November moves NQP ('Not Quite Perl', a Perl 6 subset for writing compiler actions) into compilers/nqp. NLnet's 'Impact of Parrot grant' review (16 October) quotes Jerry Gay: 'nlnet's money has spurred parrot development, and has allowed releases to occur both more frequently and more regularly'
2008
The Perl 6 compiler in languages/perl6 is named Rakudo early in the year, and Rakudo's monthly progress makes Parrot the centre of Perl 6 work. In June the Parrot Foundation is announced as a separate Washington State non-profit to hold the project's copyrights and trademarks, with Randal as chair and chromatic as secretary. Over 2008-09 parrot.org, a Trac tracker and svn.parrot.org replace the Perl-hosted infrastructure. Releases 0.5.2 through 0.8.2 continue on the third Tuesday of each month
2009
Rakudo leaves the Parrot repository for its own in February (Rakudo #14 'Vienna'). Parrot 1.0.0 'Haru Tatsu' (17 March, release manager Allison Randal) is the first 'supported' release, with a frozen public API, a deprecation policy and the promise of a supported release every three months; Pynie, Cardinal, APL and all remaining languages 'left the nest' for separate repositories, docs.parrot.org goes live, and 1.4.0 (July) and 1.7.0 (October) follow as supported releases. In 1.7.0 the old i386/PPC JIT subsystem is removed pending a rewrite, and in November Michaud adds nqp-rx, the regex-capable NQP that Rakudo will build on, to the Parrot tree
2010
Parrot 2.0.0 'Inevitable' ships on 19 January. Rakudo Star, the first 'usable, early adopter' Perl 6 distribution, is released on 29 July on top of Parrot. Release 2.5.0 (June) announces 'Lorito', an ops refactor 'to enable pervasive self-hosting and JIT compilation', with all ops now built by the self-hosted opsc compiler. Randal, hired by Canonical as Technical Architect for Ubuntu in mid-2010, stands down as architect after 2.8.0; on 21 October Christoph Otto (cotto) becomes architect and the project splits leadership into five teams because, as he writes, 'the architect position has had a bus number of one'. The repository moves from Subversion to GitHub (github.com/parrot/parrot, created 11 November)
2011
Parrot 3.0.0 'Beef Stew' (18 January) introduces a new embedding API (parrot/api.h, PDD 10), refactored Packfile PMCs and better Unicode handling for I/O and the command line. On 1 June a snapshot of Julián Albo's Winxed - a JavaScript-flavoured language that compiles to PIR, used for much of Parrot's own tooling - is added to ext/ and built with Parrot. The Parrot Foundation is a Google Summer of Code mentoring organisation, and supported releases continue quarterly (3.3.0 April, 3.6.0 July, 3.9.0 October)
2012
Parrot 4.0.0 'Hyperstasis' ships on 17 January. Reini Urban (rurban) makes his first release, 4.6.0 'Wild Parrots of Telegraph Hill' (17 July), and manages 4.10.0 and 4.11.0. Work on M0 (the Lorito core layer) and an M1 language targeting it is reported in the 4.5.0 notes, and a GSoC project starts LAPACK bindings. Release 4.11.0 (18 December) merges Stefan Seifert's hybrid threads, built on Nat Tucks' 2010 GSoC green threads: 'fast and lightweight OS threads' with a new --numthreads option. Commit volume falls from about 4,600 in 2011 to 1,800
2013
Jonathan Leto releases 5.0.0 'Johnny Five Alive' (17 January), around which time Christoph Otto's term as architect reportedly ends. Bruce 'Util' Gray takes over most monthly releases. Parrot is accepted into Google Summer of Code with three students, and the 5.5.0 notes (June) record that at a four-day YAPC::NA hackathon 'MoarVM was unveiled' - Jonathan Worthington's new NQP/Rakudo backend, announced on his blog on 31 May and intended as a leaner alternative to Parrot. Two scheduled releases (5.8.0 in September and 5.11.0 in December) are skipped, noted in parrothist.pod as 'pining for the fjords'
2014
Parrot 6.0.0 'Red-necked Amazon' (21 January) starts the last full year of releases, with Gray and Urban alternating. Parrot is accepted into GSoC again; Chirag Agrawal's project on GC write barriers reports that 'nqp 6model got 2-4% faster', and a parrot-bench repository publishes benchmark results for every release from 1.8.0 to 6.2.0. The Parrot Foundation is dissolved during the year (Washington State corporate records, as cited by Wikipedia). Debian's last upload, 6.6.0-1 (22 August), migrates to testing on 30 September
2015
Parrot 7.0.0 'Crimson Shining Parrot' (20 January) finishes the packfile API refactor and fixes parser crashes found with the american fuzzy lop fuzzer. On 16 February Patrick Michaud announces that Rakudo will suspend Parrot support after the 2015.02 release - the Great List Refactor, native shaped arrays and NFG strings need features Parrot lacks, 'most of the current userbase had switched to MoarVM', and no Rakudo or NQP developer wants to do the work. Monthly releases continue to 7.11.0 (15 December); the 7.9.0 notes claim about 5% faster execution from building with -O3 instead of -O2 (no benchmark named). Rakudo's first stable 'Christmas' release in December runs on MoarVM
2016
The January supported release, 8.0.0, is skipped; 8.1.0 'Andean Parakeet' (16 February, Reini Urban) is the final release. The VERSION file is bumped to 8.2.0 on 17 February and a ChangeLog entry for 8.2.0 (dated 15 March, adding foldcase string ops and StringHandle methods) is written, but no tag or announcement follows; the year ends with fewer than thirty commits. NQP removes its Parrot backend in the week of 1 August ('without Parrot, Rakudo Perl 6 would not exist today', the Perl 6 Weekly notes), and Debian removes the package from unstable on 28 August
2021
After three commits in 2017 and none in 2018-2020, Bruce Gray adds an 'IMPORTANT NOTICE' to README.pod on 25 August (issue #1243): 'The Parrot VM is no longer being actively developed. The role of Parrot as VM for Perl 6 (now Raku) has been filled by MoarVM, supporting the Rakudo compiler'
2025
Reini Urban returns to the repository in December with some 44 commits (after a few configure clean-ups by James E Keenan in late November): fixes for modern gcc and clang warnings, ASan-clean test runs, IMCC and method-cache memory leaks, a 2015 patch for an ARM SIGBUS in the GC, Unicode bitwise ops, a gperf 3.2 bootstrap and a GitHub Actions workflow (7 December). The ChangeLog gains a heading '2025-??-?? release 8.3.0'; the last commit is dated 19 December and the last push 20 December. The repository has about 617 stars, 146 forks and 449 open issues, and parrot.org itself returns HTTP 503

Notable Uses & Legacy

Rakudo Perl 6 (2008-2015)

Rakudo, the main Perl 6 compiler, was written inside the Parrot repository as languages/perl6 until February 2009 and ran exclusively on Parrot until the JVM backend (2013) and MoarVM (2013-2014) arrived. Rakudo Star, the first Perl 6 distribution (29 July 2010), bundled Parrot; the Rakudo 2015.02 release was the last with Parrot support, and the 'Christmas' Perl 6.c release of December 2015 shipped on MoarVM

Parrot Compiler Toolkit, PGE and NQP

Patrick Michaud's PGE (2004) implemented Perl 6 rules as a parser generator on Parrot; PCT (June 2007) added PAST/POST tree classes and a driver so a grammar plus NQP action methods yields a working compiler; NQP ('Not Quite Perl', 2007) and its regex-capable successor nqp-rx (2009) were the languages those actions were written in. Rakudo, Pynie, Cardinal, Partcl, Lua on Parrot and the Squaak tutorial language were all built with this toolkit, and NQP outlived Parrot as the implementation language of Rakudo on MoarVM and the JVM

Lua on Parrot

François Perrad's Lua compiler, started in languages/lua in November 2005 and later moved to its own repository, was one of the three implementations Parrot's own languages page listed as most complete (with Rakudo and Winxed); Perrad also served as release manager for Parrot 1.1.0 in April 2009

Winxed

Julián Albo's Winxed (2009), a JavaScript-like language with a compiler written in Winxed that emits PIR, became the language of choice for Parrot's own utilities; a snapshot of the compiler has been built and installed with every Parrot release since 3.5.0 in June 2011

Partcl, Punie, Pynie and Cardinal

Will Coleda's Partcl (Tcl, from 2003), Allison Randal's Punie (Perl 1, 2005) and Pynie (Python, 2007, started by Michaud) and Kevin Tew's Cardinal (Ruby, 2006) were the flagship demonstrations of Parrot as a multi-language runtime; they lived in the languages/ directory until 1.0 (March 2009) sent them to separate repositories, and none became a primary implementation of its language

Amber for Parrot and mod_parrot

Roger Browne's Amber for Parrot (2005-2006), an Eiffel-and-Ruby-flavoured scripting language with Design by Contract, was written directly against the VM and is described on its own page on this site. Jeff Horwitz's mod_parrot embedded the Parrot interpreter in the Apache web server so that handlers could be written in PIR or in any Parrot-hosted language

Language Influence

Influenced By

Perl Perl 6

Influenced

Raku MoarVM NQP Winxed Amber for Parrot

Running Today

Run examples using the official Docker image:

docker pull
Last updated: