p2 (perl 5+6 = 11) on the potion vm
C ANTLR Makefile Perl Shell C++ Other
Pull request Compare This branch is 3 commits ahead, 627 commits behind p2.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


  ~ p2 ~

      ~ p ooOOOo 2 ~
           oO      %% a fast perl5
        ___/ /          
       /`    \ 
      /v^  `  ,

  p2 is a she. She is a perl5 and possible perl6/nqp backend, based
  on why the luck stiff's potion. See README why potion is exciting.
  Homepage: http://perl11.org/p2/

  parrot example/fib.pir 28  0m1.746s
  perl   example/fib.pl  28  0m0.439s
  potion example/fib.pn  28  0m0.013s
  p2 -B  example/fib.p2  28  0m0.177s
  p2     example/fib.p2  28  <todo: 0.013s>

  parrot example/fib.pir 40  3m36.447s
  perl   example/fib.pl  40  2m19.752s
  potion example/fib.pn  40  0m3.512s
  p2 -B  example/fib.p2  40  0m54.560s
  p2     example/fib.p2  40  <todo: 0m3.512s>

  Its exciting points for perl folks are:

   * Radically simplified and functional core.

   * Should parse most of perl5, just some XS and B tricks not.

   * signatures, fast mop, types, native threads, call-replacing
     macros for perl5.

   * Using most of Damian Conway's p5i recommendations:
     i.e. classes are immutable and final by default.
     See <http://web.archive.org/web/20040207072905/http://www.yetanother.org/damian/Perl5+i/>

   * libp2 is usable as a fast backend for nqp/perl6, but parsing and supporting
     p6 natively without going through nqp should be easier (and faster).

   * Native and fast calling convention, no XS stack args on the heap.
     XS is replaced by dlcall (dynamic ffi), and/or shared libraries
     with normal function calls into the vm.

   * int, str, num are objects, you can optionally type all args and
     lexical variables.  In fact everything is an object as in parrot,
     even the parsed AST, the vm state.

   * Sized arrays are non-autovivifying and initialized with undef,
     resp. if typed 0, 0.0, "".

     my $a[3]; print $a[3] => compile-time error: array out of bounds
     my int $i[3]; print $a[2] => 0
     my num $n[3]; print $n[2] => 0.0
     my str $s[3]; print $a[2] => ""
   * A new pragma "no magic" applies to all visible objects in scope.
       no magic;
       use Config;
       print $Config{'ccflags'};
     => compile-time error: Invalid use of tie with no magic

       no magic;
       use Config ();
       print $Config::Config{'ccflags'};

   * p6model: via scoped mixins, :multi, roles. Like Moose, just better
     and much faster. (roughly estimated 800x faster).
     No multiple inheritance yet, \@ISA == 1.
     Only one parent, depending on another parent, rather multiple
     mixin compositions.

   * ~~ match works because all data are typed objects.
     A destructuring-bind alike new match operator which matches
     structures (list, trees, hashes of hashes) against structures,
     values and types.

   * Just-in-time compilation for x86, x86-64 and ppc done. arm later.

   * Intermediate bytecode format and VM. Load and dump code.  Decent
     speed and cross-architecture. Heavily based on Lua's VM.

   * A lightweight generational GC, based on Basile Starynkevitch's
     work on Qish.  <http://starynkevitch.net/Basile/qishintro.html>
     The compiler will add hooks for objects leaving scope and add
     DESTROY method calls if they are visible at
     compile-time. Run-time created DESTROY methods will not be
     automatically called.

   * Bootstrapped "id" object model, based on Ian Piumarta's soda
     languages.  This means everything in the language, including
     object allocation, parser, compiler and interpreter state are
     part of the object model.  (See COPYING for citations.)
     In fact all objects and classes are closures, which simplifies
     scoping, and makes p2 a functional vm.

   * parsers are scoped and run-time loadable for ffi, p6, and
     other languages.

   * Interpreter is thread-safe and reentrant.  I hope this will
     facilitate coroutines, parallel interpreters and sandboxing.

   * Small core. Under 10kloc. Right now we're like 6,000 or
     something. Install sloccount and run: make sloc.

   * Reified AST and bytecode structures. This is very important to
     me. By giving access to the parser and compiler, it allows people
     to target other platforms, write compilers, debuggers, code analysis
     tools and even fully bootstrapped VMs. I'm not as concerned about
     the Potion VM being fully bootstrapped, especially as it is tied
     into the JIT so closely.

   * Memory-efficient classes. Stored like C structs. (Although the
     method lookup table can be used like a hash for storing arbitrary

   * Fast asynchronous IO

   * The JIT is also used to speed up some other bottlenecks. For
     example, instance variable and method lookup tables are compiled
     into machine code.

  However, some warnings:

   * Strings are immutable (like Lua) and byte arrays are used for I/O
     buffers. All strings and symbols are utf8 internally.

   * Ints cannot hold pointers and need to be boxed. This should be
     transparent though.

   * Limited error handling.

   * No signal handling, ffi, thread-safe GC yet, but in planning.

  ~ thankyous ~

  why the lucky stiff left the ruby community. potion was his last
  public project. It's a work of great art and mastership. I could not
  think of anything better. I think it is better than Go, if potion
  would have had added auto-threads and channels.

  Rob Pike for Go, and the parrot community for parrot.

  Larry Wall for perl5. We miss his leadership and technical excellence.
  Without him nothing got done, and if something was done it was wrong.
  Besides defined-or, which left Tom Christiansen behind.

  why the lucky stiff thanks:
  I am gravely indebted to Basile Starynkevitch, who fielded my
  questions about his garbage collector. I favor French hackers
  to an extreme (Xavier Leroy, Nicolas Cannasse, Guy Decoux,
  Mathieu Bochard to name only a portion of those I admire) and
  am very glad to represent their influence in Potion's garbage

  Matz, for answering my questions about conservative GC and
  for encouraging me so much. Potion's stack scanning code and
  some of the object model come from Ruby.

  Steve Dekorte for the Io language, libgarbagecollector and
  libcoroutine -- I referred frequently to all of them in
  sorting out what I wanted.

  Of course, Mauricio Fernandez for his inspiring programming
  journal housed at http://eigenclass.org/R2/ and for works
  derived throughout the course of it -- extprot most of all.
  Many of my thoughts about language internals (object repr,
  GC, etc.) are informed by him.

  Ian Piumarta for peg/leg. I use a re-entrant custom version
  of it, but the original library is sheer minimalist parsing

  Final appreciations to Jonathan Wright and William Morgan
  who pitched in, back in the wee hours of Potion's history.

  ~ license ~

  See COPYING for legal information.
  potion is an MIT license, which lets you do anything you want with this.
  perl5 code is ARTISTIC and GPL dual licensed, 
  p2 and perl6 code is ARTISTIC 2 licensed.