Pharo Bootstrap (Was Re: Refactoring File Package)

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Pharo Bootstrap (Was Re: Refactoring File Package)

Ben Coman
On Mon, Jun 8, 2015 at 4:08 PM, Guillermo Polito
<[hidden email]> wrote:
> Hi Ben!
>
> I answer between lines. If the discussion continues maybe we should move to
> another thread also ^^.

I don't have much to add, but a new thread none the less.

> El sáb., 6 de jun. de 2015 a la(s) 12:39 p. m., Ben Coman
> <[hidden email]> escribió:
>>
>> On Sat, Jun 6, 2015 at 5:26 PM, Guillermo Polito
>> <[hidden email]> wrote:
>> > Actually we just want to have a kind of split in:
>> >
>> > - essential
>> > - non-essential
>>
>> I guess you have scripts outside the image to shrink the image and
>> then bootstrap it.  However these are not necessarily visible to
>>
>> everyone and I am wondering once the bootstrap goal is achieved
>> you will handle the entropy of ongoing development by many others
>> accidentally introducing dependencies that breaks the bootstrap?
>
>
> Well no. I try to not do that. Currently what I have working is:
>
> - a metacello configuration describing the packages+versions that
> will be part of the built kernel
>
> - a simple script that will create the initial objects of an image before
> class creation (e.g., create Smalltalk, initialize the symbol table, etc). I
> want this guy to be the smallest as possible to avoid what you
> describe above

Ahhh. That is real nice to know.  Very cool.

> - a script to initialize the image after class creation. e.g., create the
> first process, and execute some class side initialize.
>
> Then again, the ad-hoc bootstrap scripts try to be minimal to avoid
> being impacted. Of course they could be impacted by changes of
> APIs, but I think it is still controllable in the size of the scripts :).
> And then, that is why I try to push as many "modularity" concerns to
> Pharo itself, to keep these scripts small.
>
>>
>>
>> Also what I have seen is classes being moved out of their current
>> packaging (sorry I forget the details, but I think it was moved out of
>> System) into a new top-level package, which I think loses something
>> in structure and might pollute the top-level packages.
>
>
> Yes, mea culpa there. Some times when extracting classes from one
> package I didn't put the new package under the System-* or
> whatever top level package.
>
> However, I believe also that the agreement on what are the top-level
> packages is kind of implicit and obscure to me. I remember some
> discussions in the list with the Alt browser from Thierry using the idea
> of top level packages, and others talking about the navigation of the
> system. I check the latest Pharo Image and I found:
>  - AST (should be system?)
>  - Announcements (should be system?)
>  - Collections (should be system?)
>  - Files (should be system?)
>  - Networking (should be system?)
> ...

Also we should consider whether its possible/desirable for packages
AsmJit, Athens, ConfigurationXxxx, Filesystem, Glamour, Graphics, etc
to have just one top-level entry each.

> And then if we check what is inside the System top-level package
> today I'd say it is a sack full of random things, with no evident criteria.
> So maybe we should discuss and agree on how to name packages
> and top-level packages!

Probably a bit hard to do across a mail list.  Maybe an initial stab
at this could be done during a sprint?

>
>>
>> So considering the recent discussion of package tags, I wonder if
>> somehow we could have a "Bootstrap" tag and realtime critics that
>> complain if Bootstrap-tagged-class references any
>> non-Bootstrap-tagged-class.  There might even be several levels of
>> Bootstrap tags.  This would improve ongoing visibility of the
>> bootstrap structure and help the rest of us to not shoot it in the
>> foot.
>>
>> I wonder also if tags might also be extended to method protocols, so
>> you can have a method with the "accessors" tag and also the
>> "bootstrap" tag, so that even a Bootstrap-tagged-class can be further
>> minimised by the methods it needs during bootstrap.  Otherwise I
>> guess to minimise the methods in a Bootstrap-tagged-class, later
>> extension by another package could not add methods to the
>> "accessors" protocol.
>
>
> That would be amazing if I could add meta-data to packages to only
> install specific classes. Because we could keep a coarser granularity
> of packages while keeping the bootstrap small.
>
> However, the problem is that you cannot predict what
> classes/methods the bootstrap will use.

Maybe at certain points of the bootstrap you add the pragma
<bootstrap> to all methods currently in the image.  This would become
a form of documentation, but also perhaps for the next bootstrap
build, you scan for the <bootstrap> methods to install into the
bootstrap image, and the classes get installed merely as a consequence
of being a dependency to allow <bootstrap> methods to be installed.

cheers -ben

> So far, I'm using the class
> builder to build classes in the bootstrap. In such way, I ensure that
> all classes that I create will honor the same invariants as a normal
> class and I don't have to duplicate the creation code :).
>
> That means that we can change the internals of the class builder as
> long as we don't change the API + preconditions and the bootstrap
> will continue working.
>
> Guille