Jump to content

Parrot virtual machine: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Extension (talk | contribs)
Autrijus (talk | contribs)
m →‎Registers: Parrot's registers are now variable-sized.
Line 29: Line 29:


===Registers===
===Registers===
Unlike most virtual machines (which are stack-based), Parrot is register-based, just like most hardware [[Central processing unit|CPUs]]. It provides four types of registers, typically with 32 registers of each type:
Unlike most virtual machines (which are stack-based), Parrot is register-based, just like most hardware [[Central processing unit|CPUs]]. It provides four types of registers:


* I0-I31: native integer type
* I: native integer type
* N0-N31: floating point numbers
* N: floating point numbers
* S0-S31: advanced string registers with [[Unicode]] support
* S: advanced string registers with [[Unicode]] support
* P0-P31: PMC, or ''Parrot Magic Cookie'' — Parrot object type
* P: PMC, or ''Parrot Magic Cookie'' — Parrot object type


Up until version 0.3.0, Parrot typically provides with 32 registers of each type, with the possibility to enable 64 registers. Later versions provide unlimited amount of registers; each function can allocate as many registers from any types as it is needed.
It is possible to enable 64 registers, for enhanced speed in certain scenarios.


===Arithmetic operations===
===Arithmetic operations===

Revision as of 19:35, 30 October 2005

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, 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.

Static and dynamic languages

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 BASIC, Befunge, Brainfuck, Cola, Forth, Jako, Lisp, m4, Miniperl, Ook, Parakeet, OpenComal, PHP, Plot, 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.

License

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.

History

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 would unify Python and Perl [1]. The name was later adopted by this project, whose intent includes the unification of Perl and Python. Several tiny languages are being developed along with it which target the Parrot virtual machine.

The Parrot source code was first released to the world on September 10, 2001. Parrot 0.1.0 "Leaping Kakapo" was released on February 20, 2004. Parrot 0.1.1 "Poicephalus" was released on October 9, 2004. Parrot 0.1.2 "Phoenix" was released on 6 March, 2005. Parrot 0.2.0 "NLNet" was released on May 8, 2005. Parrot 0.3.0 "Alex" was released on October 1, 2005.

Internals

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 the primary target of language implementations. PIR transparently manages Parrot's inter-routine calling conventions, provides improved syntax, register allocation, register spilling, and more.

IMCC is the Intermediate Code Compiler for Parrot and compiles PIR. It is also known as IMC and is usually stored in files with the suffix ".imc".

Examples

Registers

Unlike most virtual machines (which are stack-based), Parrot is register-based, just like most hardware CPUs. It 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 provides with 32 registers of each type, with the possibility to enable 64 registers. Later versions provide unlimited amount of registers; each function can allocate as many registers from any types as it is needed.

Arithmetic operations

   set I1, 10
   inc I1        # I1 is now 11
   add I1, 2     # I1 is now 13
   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

Culture

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.

See also

Articles at parrotcode.org
Articles at sidhe.org