Hello,

-> 1. Introduction

I am a programmer interested in the parrot vm. In my spare time I have
attempted several times to 'get into' parrot. This time I have
progressed much further, and in doing so I have developed a perspective
that is informed enough for me to hazard some input on the project.

I would like to get a clean parrot install on my machine so I can
hack on it. I have quickly reached the limits of what can be done
without submitting changes to parrot itself.

In short parrot needs work on the install target, and I need to
justify the value of the target to the project before proposing any
changes.

I will first present myself as a use case, and then proceed to the
main point.

-> 2. My use case

My first step was to try and install parrot. It was not enough for me
to simply hack in a "check-out" of the parrot tree. When a project
interests me I want to first take small steps. 

The first step is always to install the project, and get a "-V" dump
and "hello world" to run. If there are example sources I like to run
those and then look at the code.

I was able to reach the "-V" dump and examples/ stage fairly
easily. The largest problem I ran into was ensuring that all of the
necessary pbc/pir/pasm files where there. I will expand on that issue
in a later mail.

The next step is "hello world" on the language I was interested in.  I
would use that "itch" to get a beach-head on PIR, and more importantly
the real showcase of parrot's impressive features would naturally be
the the languages or apps/tools that have been built with parrot.

With hyperbole something like "built scheme in 100 lines with parrot",
or "best etags implementation to date with PGE". The killer app/demo,
think Ruby before/after rails.

At this point things became very difficult, there are a few problems
that all stem from a "check-out" centric work-flow common to all
developers. It works in the check-out but the install is broken.

Caveat:

I have been using linux for a long time. my use case is the opposite
of a more casual user. I took it one small step at a time *for
parrot*, many more will go right to the languages parrot
provides. Assembly was one of the first languages I learned, but many
these days are not even familiar with C.

This is the concise and relevant portions of my use case that I can
present without overloading the subject line.

-> 3. Value of a install target

Maintaining a working install target will greatly benefit the
development of parrot.

I see three major use cases for parrot: The parrot hacker, the
language hacker, and the end-user (languages/apps).

Some time ago it was noticed that the tree of languages was large with
alot of stalled projects. The parrot hackers recognized this and
addressed it by becoming more responsive to the language developers.

I gathered this from a slide presentation, I believe it was: "Parrot:
Present and Future" by Chip Salzenburg ( the link is dead, cannot
confirm ).

This is a critical point. Without the languages running on-top of
parrot, the parrot project would slow to a crawl, or possibly
stall. 

When you get down to it, in a human sense writing something without
users is lonely and boring. Once the itch is scratched the code is
forgotten until it breaks.

The parrot hackers recognized this and addressed it. However the
language hackers are in the same position now as the parrot hackers.

parrot hacker

    | (improving)

language hacker

    | (broken)

language user

I looked at several of the languages in the parrot tree and saw alot
of test-harness like stuff. When I went to run pheme with: (+ 1 1) 
I found pheme broken completely with:

Couldn't find file 'compilers/tge/TGE/Rule.pbc'

[Pheme does work in the parrot tree, remember this is with the
install tree. Also I am not picking on pheme, it's just what I want to
run first.]

Assuming that I want to build a language of my own for whatever
reason, I want to use parrot both as a infrastructure and a deployment
platform. The first to harness the power of parrot, the second to get
users, start some feedback/community/fun-with-peers.

Parrot cannot fully serve the language hackers without serving the
language user as well with a installable parrot. Closing the circle
will accelerate the project by serving the key motives that will
attract brain-share.

Turn the use-case digram above upside-down and and the value of a
install target is instantly apparent.

language user

    |

language hacker

    |

parrot hacker

recap: 

The parrot hackers depend on feedback from language hackers, and in
doing so make sure that parrot works for the in-tree languages.

Language hackers need feedback too, and without a installable parrot
only the macho peers, or "really good friends" will jump all of the
hurdles that a broken parrot install imposes on getting "hello world"
to run. Without a usable install target making a distro build is a
huge burden, and just not practical right now.

-> 3.1 reasonable expectations for a parrot install target

First parrot is still in a developmental stage without a locked-down
ABI/API. Trying to create a ABI/API at this point would be a disaster
IMHO.

What is a reasonable expectation ?

I think that if a parrot hacker gets up and does a slide-show with the
highlights of parrot, that viewers should be able to install parrot
using their distro, and then run the examples given.

Instead of trying to untangle the impossible problem of an API/ABI
re-formulate the problem in this way: 

"what cool features do we want to show off"

The problem is instantly graspable and tractable. As far as
compatibility goes it is already punted. Parrot is known to be in
development, and a distro can put a "API/ABI in development" warning
in the install.

-> 3.2 requirements of a parrot install target.

1. install all of the necessary files into the install image.

   Parrot is badly broken here. below is a list of files I added in my
   install image via ebuild (gentoo build system)

   Some of these files are obviously experiments like STM.pbc but
   things like PGE/{Text,Util}.pbc are used all over the place.

   A distro packager does not know the difference between experiments
   and dependencies without investing in the knowledge of a parrot
   contributer.

+runtime/parrot/library/CGI/QueryHash.pbc          [main]
+runtime/parrot/library/Data/Replace.pbc           [main]
+runtime/parrot/library/Digest/MD5.pbc             [main]
+runtime/parrot/library/JSON.pbc                   [main]
+runtime/parrot/library/MIME/Base64.pbc            [main]
+runtime/parrot/library/Node.pbc                   [main]
+runtime/parrot/library/PAST-pm.pbc                [main]
+runtime/parrot/library/PAST.pbc                   [main]
+runtime/parrot/library/PAST/Code.pbc              [main]
+runtime/parrot/library/PAST/Exp.pbc               [main]
+runtime/parrot/library/PAST/Op.pbc                [main]
+runtime/parrot/library/PAST/Stmt.pbc              [main]
+runtime/parrot/library/PAST/Stmts.pbc             [main]
+runtime/parrot/library/PAST/Sub.pbc               [main]
+runtime/parrot/library/PAST/Val.pbc               [main]
+runtime/parrot/library/PAST/Var.pbc               [main]
+runtime/parrot/library/PGE/Dumper.pbc             [main]
+runtime/parrot/library/PGE/Glob.pbc               [main]
+runtime/parrot/library/PGE/P6Grammar.pbc          [main]
+runtime/parrot/library/PGE/Text.pbc               [main]
+runtime/parrot/library/PGE/Util.pbc               [main]
+runtime/parrot/library/Parrot/Capture_PIR.pbc     [main]
+runtime/parrot/library/Parrot/Coroutine.pbc       [main]
+runtime/parrot/library/Parrot/HLLCompiler.pbc     [main]
+runtime/parrot/library/STM.pbc                    [main]
+runtime/parrot/library/String/Utils.pbc           [main]
+runtime/parrot/library/TGE.pbc                    [main]
+runtime/parrot/library/YAML/Parser/Syck.pbc       [main]
+runtime/parrot/library/libpcre.pbc                [main]
+runtime/parrot/library/postgres.pbc               [main]

2. equivalent behavior when running in a install tree, and a build tree.

The paths requested by higher-level components are broken, ie:
hard-coded to the layout of the check-out tree. lots of
load_bytecode/include foo.{pir,pasm,pbc}.

The extensions are fairly easy to deal with, just drop the extensions
and DTRT. I will address that in a separate mail.

directory components in paths is a bit more tricky. The loader needs
to be exercised in the same way in both the install-tree and the
build-tree. I have a proposal for this in development, but it is a
little bit more invasive than getting rid of hard-coded extensions.

3. install targets/lists for the languages.

It is not strictly necessary to do a --enable-foo for every language
to enable this, at least for gentoo. For pheme I was able to do this
with the gentoo ebuild compilation phase.

<snip>
if use "pheme" ; then
   cd languages
   emake pheme || "pheme compile failed"
fi
</snip>

any decent distro build system will not have a problem doing more than
one make invocation. With building covered my work-around for the install
is next:

<snip>
if use "pheme" ; then
   einfo "installing pheme language"

   dodir /usr/$(get_libdir)/parrot/languages

   dodir /usr/$(get_libdir)/parrot/languages/pheme
   insinto /usr/$(get_libdir)/parrot/languages/pheme
   doins ${S}/languages/pheme/pheme.pbc

   dodir /usr/$(get_libdir)/parrot/languages/pheme/lib
   insinto /usr/$(get_libdir)/parrot/languages/pheme/lib

   doins ${S}/languages/pheme/lib/pheme_grammar_gen.pir

   for pbc in $( find ${S}/languages/pheme/lib -name '*.pbc' -print ) ; do
#          einfo "installing pbc file $pbc"
           doins $pbc
           
   done    
fi
</snip>

Two major issues here:

3.1. where do languages go ?

This is a distro issue, I will ponder more on it , but ignore it for now.

3.2. What to install ?

This is the showstopper. that find command is hideous. I don't even
need an actual install target that each language maintains. At
this point a flat-file with one-per-line listing of the runtime files
would be just fine.

The big thing to notice here is that I am not talking about breaking
the languages out of the tree. I think that would greatly harm the
parrot project. It is sufficient to have a make target for building,
and a list of files to install, or another make target for installing
if that is deemed necessary.

Full recap:

A parrot install target will benefit the project by providing the
platform needed to drive feedback to language hackers. This will
trickle-down to the parrot hackers accelerating the development
process and bringing in more brain-share and project visibility.

the ABI/API is punted, instead of trying to build a comprehensive
exported API at this stage, instead ask what cool things parrot
hackers would like to show off, and put that in the install list.

Only make build targets and install lists are minimally necessary.
Languages should remain in-tree. Adding a source/built-object to
the install list should be data-driven and dead simple for language
hackers (per-language MANIFEST ?)

Parrot,languages, and apps need to behave the same in both the
install tree, and the build-tree. 

This could be dropped if my later proposal is determined
unsuitable/undesirable, however that will lead to some heavy-handed
release testing/policy etc. It's usually better if something just
breaks in both trees then waiting until tarballs are rolled to find
out what's broken in the install. There are enough day-after release
releases already.

status:

I am working [ spare-time ] on a gentoo ebuild (un-official , I am
_not_ a gentoo dev ), and I am also working up a couple of proposals
for deltas to the parrot tree addressing some of the issues that I
have raised.

P.S: finally !

My thanks for considering these thoughts. Anything seen as criticism
should be considered constructive, as I am very impressed by parrot
and wish to see it flourish.

cheers,
Mike Mattie ([EMAIL PROTECTED])










Attachment: signature.asc
Description: PGP signature

Reply via email to