(cross-posted from
http://pugs.blogs.com/pugs/2006/03/a_tale_of_two_p.html-- this
provides some background of the ongoing Vienna^2 hackathon's
progress on bootstrapping Pugs on Perl 5 and Parrot, simultaneously, sharing
as much code and structure as possible.)

Just some short sketches as I'm quite exhausted after another day of nonstop
hacking.

Ingy and I generalized the "use v6-pugs" concept into
Filter::PMC<http://svn.kwiki.org/ingy/Filter-PMC/lib/Filter/PMC.pm>,
taking advantage of Perl 5.6+'s feature that when you say "use Foo", it
looks *first* at the Foo.pmc file, and only if it's stale or nonexistent
(which is, like, always), will it load Foo.pm.

See fglock's ongoing work on
Pugs::Grammar::Rule<http://svn.openfoundry.org/pugs/perl5/Pugs-Compiler-Rule/lib/Pugs/Grammar/>for
the zeroth application of this idea --
Rule.pm<http://svn.openfoundry.org/pugs/perl5/Pugs-Compiler-Rule/lib/Pugs/Grammar/Rule.pm>is
processed on author's side, and
Rule.pmc<http://svn.openfoundry.org/pugs/perl5/Pugs-Compiler-Rule/lib/Pugs/Grammar/Rule.pmc>is
uploaded/installed along with it, so the user won't need a copy of
pugs,
or an installed version of v6.pm -- it's all just pure Perl 5 code.

This is wonderful news, as it solves four major problems for
source-filterish technlogies like Inline<http://search.cpan.org/dist/Inline/>,
Spiffy <http://search.cpan.org/dist/Spiffy/>,
Switch<http://search.cpan.org/dist/Switch/>(and of course,
*v6*):

   - The user doesn't need to install the filtering modules themselves;
   the .pmc code is precompiled into normal Perl 5 code.
   - Debugging is now much easier, as you have both the original and
   transformed programs available.
   - Embedded Perls (say in mod_perl) can load them without triggering
   INIT problems, as the .pmc are just regular Perl code.
   - Finally and most importantly, this makes source filters *composable*,
   and you can have nested chunks of layered compilers inherits or delegates to
   each other. This is great for eg. porting the Perl 6 macro system to Perl 5.

As a consequence, the release of v6.pm and Pugs::Compiler::Rule has been
delayed for one day, so that we can have more robust cross-validation
between .pm and .pmc files, and have them play nicely with other Filter::PMC
technologies.

In other news, Leo and I populated the *languages/pugs/* tree in Parrot,
bringing in all the Value
PMCs<http://svn.perl.org/parrot/trunk/languages/pugs/pmc/>we need for
bootstrapping PIL^N on Parrot. We just need to figure out
Pad/Namespace storage and primitive mappings, and we'll instantly get a
running Perl 6 object space -- with Classes and Roles -- on top of parrot.

The porting of Value PMCs largely involves finding a base PMC type and
extend from it, although Parrot's notion of treating all PMCs as
scalar/array/hash/sub/ref *containers* means we'll get some oddities in the
object model:

   - *"1.id == 1.id"* doesn't hold, as two boxing attempts always produce
   two PugsInt objects
   - "*int('12345678901234567890')*" overflows, as PugsStr cannot coerce
   to PugsInt, and always have to go through a native I register (which is
   limited in size)
   - "*given 1 { $_++ }"* won't throw an exception, and will indeed *
   silently* change the "1" in-place!

It'd make more sense if a PMC can declare that it's not a container at all,
and avoid the FETCH/STORE type vtable entries altogether, or at least
declare it only supports one container interface or the other. I've
submitted an overview on
perl6-internals<http://www.nntp.perl.org/group/perl.perl6.internals/33240>as
well.

That's it for today. See you tomorrow!

Reply via email to