Partitioning the image (was Re: Shrinking sucks!)
Ned Konz
ned at squeakland.org
Mon Feb 14 16:35:29 UTC 2005
On Monday 14 February 2005 3:18 am, stéphane ducasse wrote:
> > Btw, the whole discussion about PI subclass or not - at this point I
> > don't have a good opinion.
> > There are arguments both ways it seems.
>
> Yes I do not have any taste yet in any directions...let's learn by
> doing.
It seems to me (having used PI instances, PI subclasses, and (for a while, I
think) having had problems maintaining an instance of a PI subclass) that we
need to lock down at least part of the responsibility of a PI.
I agree with this part of Lex's comment:
> Subclasses are great for experimenting, but if we want to move forward
> and write a bunch of package-aware tools, we need to commit to a single
> model that the tools can rely on. Experimenters can continue to make
> subclasses if they want, but the tool-writers shouldn't need to deal
> with arbitrary changes.
[...]
> It looks like people have a pretty good feel what should go into a
> PackageInfo at this point. The standard #classes, etc., methods are
> very good I think.
From what I think I know and have heard, it seems like a PI:
* Must be able to list the classes that its package introduces (with the
assumption that the package includes the entire contents of those classes,
minus explicit extension methods from other packages)
* Must be able to list the extension methods that its package introduces
(which of course implies a dependency on some other classes)
* May be able to report explicit dependencies on other packages (perhaps
including version dependencies)
* May be able to provide other metadata about the package, including (some
of?) the data needed for the package-level SM card.
* May be able to provide or point to package installation or deinstallation
methods.
* May be able to provide or point to other utility methods like old instance
migration, etc.
But whether or not you use subclasses, the problem of actually instantiating a
PI to use it remains.
Right now PIs come into being as soon as you tell a tool like the MC browser
the name of a package. Because they can map the package name into a list of
class categories (and hence classes) and can also spot extension method
categories in other classes, they can at least enumerate their contents.
This satisfies the first two "must" responsibilities above, but doesn't touch
any of the others.
Going further than those two behaviors would require loading additional
information from somewhere. The obvious sources of that information include:
1. a package file
2. a registry entry somewhere on the net (SM, MC, etc.)
3. direct communication with the source of the package (like for instance
custom HTTP headers or other response to a DAV-like query to the server on
which the package lives)
*Requiring* #2 or #3 means that we're going to prevent one of the modes of
working that we've been comfortable with in the past: easy and casual
distribution of package files via email or other means (FTP servers,
downloads from a Swiki, etc.).
I think it would be a mistake to lose that ease.
The reason that each .mcz file carries around with it its entire ancestry is
to make it possible to email a single .mcz file and have it immediately
usable. If you happen to have some of its ancestors in hand, that gives you
more usable information (you can look at version changes and do merges, for
instance). You can browse a MCZ file without loading it, and see not only its
code but its ancestry and dependencies on other MC packages.
CS files, of course, have much less file-level metadata (limited to preamble,
postscript, and version stamp). But we have made tools that use both the
date/version stamp (Conflict Checker) and allow you to browse the actual
contents without loading the code.
I think that we should allow but not require #2 or #3. That is, I believe that
*all* package-level metadata should be *able to be* included in a PI, and
that it should be possible to read a PI from a package file without loading
that package's (non-PI) code or prerequisites.
Lex also said:
> And thus, Joe Developer shouldn't be making a subclass, either, if they
want the standard tools to work with their package.
Whether or not we allow PI subclasses doesn't much matter much if we made the
standard tools able to instantiate PIs from a package file. In the case of a
PI subclass, obviously its code would have to be loaded and installed from
the file first. But I don't see this as too much of a problem, except that if
the PI wants to provide other services it would tend to be dependent on other
(as yet unloaded) code in the package file.
But in the interest of simplicity, I'd be in favor of not supporting that
model, and just coming up with some way to instantiate a PI from a package
file without having to compile any code.
And Lex also said:
> Also, all PI's should have an optional link to a SM
> entry (and, if we want to be serious about making stable releases, a
> Universes entry). All packages should have installation and
> deinstallation code. (and re-configure code....)
If the PI is allowed to carry with it the metadata that is necessary to create
a new SM entry (as well as being able to link to an existing SM entry) then
we can decouple the tasks of package creation and SM registration, and can
allow automatic registration based on the contents of sufficiently well
identified packages.
So what are we missing? Easy: we don't at present have a package
representation that includes a standard way to hold the information necessary
to create a PI instance.
My suggestion, then, is this:
* We should define the required interface of a PI.
* We should keep the existing name-based (class category/*method category
based) simple PI definition for cases where there are not yet package files,
or where PI instances have not been added to package files. This would give
us compatibility with existing file formats.
* We should require that a PI be able to provide its basic services without
having to compile custom code (this doesn't disallow PI subclasses, but might
require that PIs created from files get converted into instances of the
appropriate subclass upon loading the package).
* We should come up with a standard way to serialize and deserialize PI
instances. And that serialized representation should probably be textual, so
that it can be humanly readable, mailable without damage, and easily included
in changesets and other less-structured files.
* We might come up with a way to add this serialized PI data to the preamble
or postscript of change sets, so that we can leverage existing tools and
still be backwards-compatible.
* We have two existing Zip file formats that represent or can represent
packages: SAR and MCZ (and MCD too, I guess). Both of these should define
optional members to hold the serialized PI. This would give us backwards
compatibility (those members would be ignored by older versions of MC or
SARInstaller).
* We should modify existing tools (MC browser, SARInstaller, Code browser, CS
loader, etc.) to support instantiating PI instances from package files where
possible.
* We should allow well-defined package-level metadata to be optionally
included in a PI. This would, for instance, let us create new SM cards from
package files that include sufficient metadata.
* We should allow future extension of the metadata carried in a PI (perhaps by
allowing arbitrary name/value pairs) in such a way that we don't break
backwards compatibility.
What do you all think?
--
Ned Konz
http://bike-nomad.com/squeak/
More information about the Squeak-dev
mailing list
|