On Thu, Jul 07, 2005 at 07:52:31AM -0400, Michal Wallace wrote: > I'm the guy running the pirate project (python-on-parrot). Leo says > that you and I ought to chat, and I think he's right. :)
Wonderful. Cc'ing both pirate and p6c as I'm sure both lists will find this discussion fruitful. :-) > Here's the deal: about a year ago, Klaas-Jan Stol (who does the Lua > compiler) and I were kicking some ideas around ont the parrot list > about a generic AST/emitter layer for our compilers, that could be > used as a library or take a scheme-like syntax as input. (Leo's PAST > implementation sprang from that, but he says it's still a proof of > concept) S-expression is a nice concrete syntax indeed. The existing PAST, with node types as language-specific as "Py_Print" and "Py_Print_nl" and as Parrot-specific as "PCC_Sub", is perhaps not well-suited as a common ground. > Anyway, we've got a guy with a google/perl foundation sponsorship to > actually do this work for the summer. The plan is to factor out > pirate's ast/emitter into something everybody can use. I've been > looking at python, lua, and haskell (through jhc - I'm a haskell fan > too) as use cases, but of course it would be silly not to not to get > you involved. That's fantastic news! > Basically we want to make sure the Parrot AST is there and strong > enough for you to target. :) During my stay in Leo's, I have created not one, but two ASTs that currently works in concert to compile Perl6 into Parrot. We can already run our unit test with a running Test.pm module compile to Parrot. One is PIL, the Pugs Intermediate Language, with 14 node types, listed at the top of http://svn.openfoundry.org/pugs/src/Pugs/Compile.hs as GADT constructures: PNil :: PIL [a] PNoop :: PIL Stmt PVal :: Val -> PIL Literal PVar :: VarName -> PIL LValue PExp :: PIL LValue -> PIL Expression PLit :: PIL Literal -> PIL Expression PThunk :: PIL Expression -> PIL Expression PCode :: SubType -> [TParam] -> PIL [Stmt] -> PIL Expression PStmt :: PIL Expression -> PIL Stmt PStmts :: PIL Stmt -> PIL [Stmt] -> PIL [Stmt] PApp :: TCxt -> PIL Expression -> [PIL Expression] -> PIL LValue PAssign :: [PIL LValue] -> PIL Expression -> PIL LValue PBind :: [PIL LValue] -> PIL Expression -> PIL LValue PPad :: Scope -> VarName -> PIL LValue Another is a tree form of PIR, defined as Haskell data type in: http://svn.openfoundry.org/pugs/src/Emit/PIR.hs as well as a set of Parrot objects in http://perlcabal.org/~autrijus/pir.txt (the emitter is currently only available in the Haskell side, but shouldn't be hard to port over to C or PIR). With the trunk version of Pugs, you can generate PIL and PIR in the command line like this: ./pugs -CPIL -e '...' > dump.pil ./pugs -CPIR -e '...' > dump.pir PIL corresponds closely to desugared Perl6, and hence is not Parrot-specific at all; PIR corresponds closely to desugared PIR, and hence ties closely to the Parrot architecture. I wonder which level do you expect the "Parrot AST" to resemble most? Anyway, that's what we have at this moment. Pugs's aim is comparable to PyPy's -- i.e. a complete Perl 6 implementation in Perl 6, with parser, semantic analyzer, standard prelude and the object space. Depending on the target platform, it is my hope that PIL can be transformed further into ANF/SSA or other AST forms for optimization. If PAST ends up being a more nicely abstracted PIR-tree, I'm sure PIL can retarget that with ease; if you consider PAST to be essentially Parrot independent, maybe we should look at how PIL and your planned Python AST differ, and work to unify them into a single tree. Thanks, /Autrijus/
pgpMMLUlgXgrr.pgp
Description: PGP signature