On Sat, 18 Aug 2001 11:24:47 -0700, Dan Ingalls Dan@SqueakLand.org wrote:
What does this say about our architecture for modules? To me it says that what we want to start with in the image is really just the support necessary to receive a new module. This looks like a fairly small requirement -- it could be satisfied by a combination of Lex's ChangeSet proposal and the existing Environments work, with some cleanups and simplifications. I'm curious if people generally agree about this and, if so, if it would be worth summarizing this requirement as a sub-project of the overall effort.
Well, this baseline kernel-only headless server-type image, with no graphics at all, is something I will be working on over the next few weeks. I'm basically going to try and come up with a stripper that I can run programatically, from headless mode in a full-blown image, that will get rid of just about everything.
If anyone has any specialized strippers that aren't in the latest image, feel free to email them to me.
Later, Jon
-------------------------------------------------------------- Jon Hylands Jon@huv.com http://www.huv.com/jon
Project: Micro Seeker (Micro Autonomous Underwater Vehicle) http://www.huv.com
I agree that what Dan has proposed is a great place to start. Dan proposal brings a breath of sanity to the discussion of modules. He has kept it simple (not to imply that this is not a LOT of work to get to the proposed modules) and made it easy to understand. Dan's proposal seems to fit well with a number of points made by Allen Wirfs-Brock
To help me envision this, where and how do extensions to basic mathematical functions and operations contain in current packages like MathMorphs and Math Pack fit into your scheme? Would these be a series of dependent modules that stepwise add the basic functionality: For Example: Complex number module (no dependents) Vector (array of numbers) module Statistical module (dependent on Vector) Matrices module (dependent on Vector)
Many thanks to Dan! Phil
Dan Ingalls wrote:
-- Folks -
I'm afraid there is much more about all of this that I don't know than that I do know. That said, perhaps it can be an advantage...
I know there are several things we are talking about here, and we need to separate them to come up with clear solutions. What I'd like to do is to propose an operational approach which may help to guide us to getting the "best of both worlds" -- in this case a simple small kernel, but that can support a great group programming engine for large software projects.
[If you're in a hurry, skip to ***** Here's what I mean by an operational approach -- think of how we might release the Squeak system:
- A minimal kernel
This would be something like the 240k "tiny" image I made from Squeak a few years ago (had compiler, files, minimal graphics (only enough to put up a transcript), collections, strings and numbers). I would like to go farther with this by using the OS for the transcript, so that all this thing can really do is read in the next package.
- Basic Graphics
This would be the kernel graphics (Form, Color, etc) common to MVC and Morphic.
- Full Files
The kernel might only know about the current directory. This would fill out the rest, along with all the stuff there now that isn't essential.
- Development system kernel
All the browser models
5a. MVC kernel Enough to support MVC applications
5b. Morphic kernel Enough to support simple Morphic applications
6a. MVC development system
6b. Morphic development system
You can take it the rest of the way, through network support, network applications, 3D support, 3D applications, scripting system, etc. The important thing, that I doubt any of us disagree with, is that the image is built up in a modular way, so that you could do a headless server or a small squeak for PDAs with no space wasted for the other modules you are not using. Ideally, you could end up with the exact same system whether you built it up from the kernel, or pared it down from a jumbo system -- the modules should be loadable or unloadable in a completely, well, modular manner. *****]
What does this say about our architecture for modules? To me it says that what we want to start with in the image is really just the support necessary to receive a new module. This looks like a fairly small requirement -- it could be satisfied by a combination of Lex's ChangeSet proposal and the existing Environments work, with some cleanups and simplifications. I'm curious if people generally agree about this and, if so, if it would be worth summarizing this requirement as a sub-project of the overall effort.
A parallel sub-project would be to extend our tools to work with this new architecture.
This would seem to be the first step to shoot for, because it would enable...
1. A refactoring of the entire system along the lines above 2. More reliable and consistent sharing of major projects in the community 3. A target image specification for the more serious team development tools which could themselves be added as modules.
Do people think this is a reasonable first step?
Does anyone want to propose a spec for what needs to be done?
- Dan
Dan Ingalls wrote:
What I'd like to do is to propose an operational approach which may
***********
help to guide us to getting the "best of both worlds" -- in this case a simple small kernel, but that can support a great group programming engine for large software projects.
[snip]
Basic Modules:
- A minimal kernel
- Basic Graphics
- Full Files
- Development system kernel
5a. MVC kernel 5b. Morphic kernel 6a. MVC development system 6b. Morphic development system
7.. Rest
Perhaps one could exchange 4 and 5a/b.
I like this approach!!
Hannes Hirzel
Dan Ingalls wrote:
- A minimal kernel
This would be something like the 240k "tiny" image I made from Squeak a few years ago (had compiler, files, minimal graphics (only enough to put up a transcript), collections, strings and numbers). I would like to go farther with this by using the OS for the transcript, so that all this thing can really do is read in the next package.
With the latest imagesegments stuff, does this even need the compiler stuff? I like the idea of leaving out all graphics - I think a simple prim or two would provide a transcript-to-os capability.
- Basic Graphics
This would be the kernel graphics (Form, Color, etc) common to MVC and Morphic.
- Full Files
The kernel might only know about the current directory. This would fill out the rest, along with all the stuff there now that isn't essential.
Yup. Enough of these two to allow it to do a command line image processing filter application would be a good boundary.
- Development system kernel
All the browser models
Guess this ought to follow 5/6a & b :-)
What does this say about our architecture for modules? To me it says that what we want to start with in the image is really just the support necessary to receive a new module.
Yes! Start with just enough VM to load an image that can do just enough to load the rest of what you need - including the rest of the VM. We'll get running on Palms yet!
A parallel sub-project would be to extend our tools to work with this new architecture.
This is the one that I really suspect is the hard part. the tools must make it so easy to 'do the right thing' that nobody would consider being naughty.
I wish, how I wish, that I knew how to do it... but at least it sounds like some people have some good ideas.
As for a proposal on how to do any of it: my two-pen'orth is that creating the base image (and probably the addons) seems like a good job for a descendent of the systemTracer. Drive it prescriptively rather than by example. And this would be a really good time to get the newer compiledmethod formats done, and blocks completed.
tim
Dan and all,
Does anyone want to propose a spec for what needs to be done?
Yes. Let's do the simplest thing that could possibly work. We do have environments. They're responding to messages. Let's very simply add:
a) an extension to the change set format that allows us to specify "global Foo is contained in package Bar at location http://squeak.org/packages/Bar.cs" [which will automatically install a place holder environment] b) make the default response to any access to an undefined global be a message asking whether we should download the package or not (if the user wants it then we just download and install it; otherwise we abort the computation).
At this point, we can go ahead and start actually modularizing the system. The above won't deal with any of the esoteric things that were discussed ... but to me it appears as the simplest thing that could possibly work. If we just do the above, we can start to define packages, we can test if they're still working, we can even ship Squeak in a shrunken form.
Cheers, - Andreas
- A minimal kernel
This would be something like the 240k "tiny" image I made from Squeak a few years ago (had compiler, files, minimal graphics (only enough to put up a transcript), collections, strings and numbers). I would like to go farther with this by using the OS for the transcript, so that all this thing can really do is read in the next package.
If you have a mini web server (headless) running in Squeak, I'd say the Smalltalk compiler and the Transcript support aren't really needed. You're not compiling new code, and you can log messages to stdout or a file. So, I'd say they do not belong to a minimal kernel.
As I said before, I like the list from PocketSmalltalk: http://www.pocketsmalltalk.com/whitepaper.html#builtins
The next level up would be the above with compiler support, so that you could maybe use this as a TTY scripting language. Still no GUI, just stdout.
Then on top of that GUI, etc.
Just my 2 cents...
marcio
--On Saturday, August 18, 2001 9:27 PM -0400 Marcio Marchini mqm@magma.ca wrote:
- A minimal kernel
This would be something like the 240k "tiny" image I made from Squeak a few years ago (had compiler, files, minimal graphics (only enough to put up a transcript), collections, strings and numbers). I would like to go farther with this by using the OS for the transcript, so that all this thing can really do is read in the next package.
If you have a mini web server (headless) running in Squeak, I'd say the
Smalltalk compiler and the Transcript support aren't really needed.
Perhaps, but should we really optimize for the absolute minimal case?
You're not compiling new code, and you can log messages to stdout or a file. So, I'd say they do not belong to a minimal kernel.
Well, I disagree at *least* as far as the compiler. Dan *did* say "I would like to go farther with this by using the OS for the transcript, so that all this thing can really do is read in the next package."
Two points: yes on the "Transcript to stdout or file" but also this is a kernal minimal enough for bootstrapping (i.e., reading in the next package).
As I said before, I like the list from PocketSmalltalk:
Which has stuff one could remove. Minimality isn't the only goal, IMHO.
The next level up would be the above with compiler support, so that you
could maybe use this as a TTY scripting language. Still no GUI, just stdout.
Then on top of that GUI, etc.
I heartily agree that *whatever* we have, it should run well headless.
That means that it should run well *without* a gui per se, but that doesn't mean that it needs to *not* include the GUI support. After all, you might want to switch headlessness on or off.
Given how *tweensy* minimal compiler/gui support is (a few ks of bytecode) I'm not sure I see the advantage of leaving it out, especially first round.
Cheers, Bijan Parsia.
At 12:39 PM 8/19/2001 -0400, Bijan Parsia wrote:
--On Saturday, August 18, 2001 9:27 PM -0400 Marcio Marchini mqm@magma.ca wrote: ...
If you have a mini web server (headless) running in Squeak, I'd
say the Smalltalk compiler and the Transcript support aren't really needed.
Perhaps, but should we really optimize for the absolute minimal case?
We shouldn't be optimizing for the minimal cause; however, we should be enabling the minimal case.
You're not compiling new code, and you can log messages to stdout or a file. So, I'd say they do not belong to a minimal kernel.
Well, I disagree at *least* as far as the compiler. Dan *did* say "I would like to go farther with this by using the OS for the transcript, so that all this thing can really do is read in the next package."
Two points: yes on the "Transcript to stdout or file" but also this is a kernal minimal enough for bootstrapping (i.e., reading in the next package).
This is where it's important to make the distinction between "components" and "modules". When thinking about modules, you don't have to worry about bootrstrapping. Modules get externally assembled. If you have a set of proto-kernel modules with orthogonal functionality you can assemble them into a variety of actual kernels that support different usages. Some of those kernels wound support dynamic component binding (hence booting strapping) while others might only support complete, self-contained applications.
Allen
--On Sunday, August 19, 2001 9:50 AM -0700 Allen Wirfs-Brock Allen_Wirfs-Brock@Instantiations.com wrote:
At 12:39 PM 8/19/2001 -0400, Bijan Parsia wrote:
--On Saturday, August 18, 2001 9:27 PM -0400 Marcio Marchini mqm@magma.ca wrote: ...
If you have a mini web server (headless) running in Squeak, I'd
say the Smalltalk compiler and the Transcript support aren't really needed.
Perhaps, but should we really optimize for the absolute minimal case?
We shouldn't be optimizing for the minimal cause; however, we should be enabling the minimal case.
Yes.
You're not compiling new code, and you can log messages to stdout or a file. So, I'd say they do not belong to a minimal kernel.
Well, I disagree at *least* as far as the compiler. Dan *did* say "I would like to go farther with this by using the OS for the transcript, so that all this thing can really do is read in the next package."
Two points: yes on the "Transcript to stdout or file" but also this is a kernal minimal enough for bootstrapping (i.e., reading in the next package).
This is where it's important to make the distinction between "components" and "modules". When thinking about modules, you don't have to worry about bootrstrapping.
Aha, yes, ok.
Modules get externally assembled. If you have a set of proto-kernel modules with orthogonal functionality you can assemble them into a variety of actual kernels that support different usages. Some of those kernels wound support dynamic component binding (hence booting strapping) while others might only support complete, self-contained applications.
Ok, this all sounds good.
From the point of view of initially chunking the system, I suspect Dan's
minimal kernal is still the *right* kernal or close to it. I.e., from there you can build up (to what we have now) or pare down (to the microkernal).
Cheers, Bijan Parsia.
At 11:24 AM 8/18/2001 -0700, Dan Ingalls wrote:
--
- A minimal kernel
This would be something like the 240k "tiny" image I made from Squeak a few years ago (had compiler, files, minimal graphics (only enough to put up a transcript), collections, strings and numbers). I would like to go farther with this by using the OS for the transcript, so that all this thing can really do is read in the next package.
I'd suggest targeting a much smaller kernel with some of the other functions mentioned above showing up it additional layers. For these lowest layer I wouldn't necessarily recommend thinking in terms of component composition. Instead I would think of modules that can be statically composed to produce the kernels of Squeak images that are optimized for differing environments and uses. Examples of such customized Squeaks might be: Classic Squeak -- Fully reflective exploratory programming environment Advanced Application Squeak -- Morphic based, reflective application programs without development tools Appliction Squeak -- Morphic or MVC applications, non reflective,no development tools Basic Application Squeak -- Non-GUI applications (full file and network support), non reflective,no development tools Micro Squeak -- Basic collections, numerics, and external system calls (basic embedded uses) Kernal Squeak -- Supports fundamental Smalltalk language execution semantics
In designing the core modules most of the above possible Squeak variants should be kept in mind. A critical test of the modularity system is whether it is flexible to allow definition of modules that are composable to achieve this range of variations.
The true minimum would consists only of the classes and methods that are essential for representing compiled Smalltalk code and executing it on the virtual machine. This includes Undefined Object, CompiledMethds, contexts, class objects, probably Symbol and Process, and a few other things. Most of the common methods of these classes don't need to be present as the operation of the virtual machine doesn't depend upon them. As a point of reference, when we did this at ParcPlace-Digitalk we were able to emit a minimal image that computed 3+4 and whose total size was about 10K bytes. Note that at this level, Object (or is it ProtoObject these days) isn't even essential.
The next layer would probably added the essential classes and methods used by all application programs. This is probably pretty close to what ANSI Smalltalk specifies as Fundamental Protocols. Other ANSI Protocols could be organized into optional, but typically present modules.
An optional layer would added sufficient introspective reflection to support debugging and inspection.
Another optional layer would added the reflection protocols needed to support dynamic addition of classes and methods. Note that images without this layer must be statically generated by some sort of image writer (something like a SystemTracer). From what I've heard about the ModSqueak work it sounds like it is close to provided the necessary infra structure to do this.
Dynamic binding of "image segments" should be supported either via the above layer or perhaps by an additional layer.
I would make the compiler a component. It really doesn't belong at this level of the system at all.
- Basic Graphics
This would be the kernel graphics (Form, Color, etc) common to MVC and Morphic.
fine
- Full Files
The kernel might only know about the current directory. This would fill out the rest, along with all the stuff there now that isn't essential.
Fine, does networking go here?
I would list the MVC and Morphic Kernels next, rather than the develop kernel. Development tools are an application so they should be at a higher level.
- Development system kernel
All the browser models
ModSqueak's "semantic model" would probably go here too.
5a. MVC kernel Enough to support MVC applications
5b. Morphic kernel Enough to support simple Morphic applications
6a. MVC development system
6b. Morphic development system
You can take it the rest of the way, through network support, network applications, 3D support, 3D applications, scripting system, etc. The important thing, that I doubt any of us disagree with, is that the image is built up in a modular way, so that you could do a headless server or a small squeak for PDAs with no space wasted for the other modules you are not using. Ideally, you could end up with the exact same system whether you built it up from the kernel, or pared it down from a jumbo system -- the modules should be loadable or unloadable in a completely, well, modular manner. *****]
What does this say about our architecture for modules? To me it says that what we want to start with in the image is really just the support necessary to receive a new module. This looks like a fairly small requirement -- it could be satisfied by a combination of Lex's ChangeSet proposal and the existing Environments work, with some cleanups and simplifications. I'm curious if people generally agree about this and, if so, if it would be worth summarizing this requirement as a sub-project of the overall effort.
I have a message pending (I just need to type it) on why ChangeSets may not be the answer.
We also not need to assume that a complex system is dynamically constructed by binding additional modules (I would call such things components) to a running image. That is one way to do it, but an equally valid way is statically generate the complex image from. I think to cover the full range of uses you have to consider both approaches.
If some of the above seems to be slightly out of left field I suggest taking fresh look at:
http://www.smalltalksystems.com/publications/_awss97/INDEX.HTM http://www.smalltalksystems.com/publications/_awss97/SSDCL1.HTM
Allen
A parallel sub-project would be to extend our tools to work with this new architecture.
This would seem to be the first step to shoot for, because it would enable...
1. A refactoring of the entire system along the lines above 2. More reliable and consistent sharing of major projects in the community 3. A target image specification for the more serious team development tools which could themselves be added as modules.
Do people think this is a reasonable first step?
Does anyone want to propose a spec for what needs to be done?
- Dan
Allen wrote:
Another optional layer would added the reflection protocols needed to support dynamic addition of classes and methods. Note that images without this layer must be statically generated by some sort of image writer (something like a SystemTracer). From what I've heard about the ModSqueak work it sounds like it is close to provided the necessary infra structure to do this.
I was thinking of doing something similar with Oasis- I would need to learn how to construct images from scratch, but I can already load, test, and modify Squeak code within an Oasis "Component".
Could someone point me to a nice, accurate, concise description of what an image file needs to be?
- les
I have a message pending (I just need to type it) on why ChangeSets may not be the answer.
It's sort of how I started out with Oasis... I just wanted a place to dump code where I could look at it without it causing trouble for my image. Later on I made that into a place where I could compile the code, instantiate objects, and interact with them, without clobbering my image. Which sounds very straightforward- but nothing that I did in Oasis was easy to accomplish.
What I found as I built Oasis was that there were very deep-seated non-modularities permeating everything. It's not just the tools, or even the code, but perhaps even more significantly, the attitude. Everything *knows* that there is only one namespace. That was true, of course, an entirely reasonable assumption at the time. But that means that there are much bigger mountains to move ( forget about getting to do something as easy as climbing them ) than you may be thinking. To give an example- In Oasis, I can load the entire class library for VisualWorks into a single module. There you have all the code in one module, just like it wanted to be. But... you can't use it, because you can't initialize this class library- over 200 classes need to be initialized, but the code to do it trips over itself... if I remember correctly, it went something like this: can't initialize Object, because Collections are initialized... can't do Collections, because something else isn't ready... Symbol and String are cyclicly dependent on each other, neither can proceed... The issues go deeper than just having some mechanisms like namespaces. "Just add namespaces" will not solve these problems.
As a counter-example, I *can* load a modified version of PocketSmalltalk's class library into a module, and I *can* instantiate and interact with objects defined by PocketST's classes. The reason is simple- I *can* initialize PocketSt's class library, because it was designed to be brought up from scratch. So, this is the route I would pursue, given that I already have Oasis- construct a class library similar to PocketSt's, but using Squeak's code ( I'd just use PocketSt's, but I don't believe it is open-source, though I could easily be wrong about that ). The benefit of such an approach is that I have a very clear picture of just what I have in the module, and whether it works. The hurdles I would have to overcome are that I would have to be able to generate Squeak's bytecodes, ( meaning that I might have to either port Squeak's parser and compiler to VisualWorks, since that is where Oasis lives these days, or run them on top of PocketSt inside Oasis, which I've explored a bit in the past ), and I would have to know how to generate a new Squeak image from scratch. Both of these things are justifiable extensions to the existing Oasis capabilities, as far as I'm concerned, so I'd be willing to give it a try if someone will tell me what I need to know about the image formats, and what the VM expects.
- les
Les,
I have a message pending (I just need to type it) on why ChangeSets may not be the answer.
It's sort of how I started out with Oasis... I just wanted a place to dump code where I could look at it without it causing trouble for my image.
[...]
What I found as I built Oasis was that there were very deep-seated non-modularities permeating everything. It's not just the tools, or even the code, but perhaps even more significantly, the attitude. Everything *knows* that there is only one namespace.
To what extent is this related to change sets?! I've seen more than a few apps that were shipped in the form of change sets and a number of them does have multiple CS to prevent the kind of problems you're mentioning. So it seems to me that what you're saying is that the equation module/component == 1 change set is not right - but I don't see anything in your post that would render the use of change sets generally questionable.
Cheers, - Andreas
From: Andreas Raab Andreas.Raab@gmx.de
What I found as I built Oasis was that there were very deep-seated non-modularities permeating everything. It's not just the tools, or even the code, but perhaps even more significantly, the attitude. Everything *knows* that there is only one namespace.
To what extent is this related to change sets?! I've seen more than a few apps that were shipped in the form of change sets and a number of them does have multiple CS to prevent the kind of problems you're mentioning. So it seems to me that what you're saying is that the equation module/component == 1 change set is not right - but I don't see anything in your post that would render the use of change sets generally questionable.
In the near term, for the immediate task at hand, it may not be a great issue. You are not likely to be terribly concerned at this point with the core classes, where class initialization is a serious problem if you are trying to bring this up from scratch. I don't think that class initialization will be as serious a problem for the non-core classes in the packages you are interested in.
If I understand correctly what is being proposed by the Changesets as Packages idea, is that existing chunks of code for which there are already changesets ( and therefore some mechanism of keeping track of all of the individual pieces of that chunk of code ) would be used as the definition of a package of functionality. That's fine as far as it goes... but it will not go very far. It will work fine as long as you don't have to worry about overlapping method or class definitions. Once that happens, it will not be enough. What you need to consider is the probability that two different packages are going to conflict, and what will be neccessary to resolve that conflict.
You will find that in the general case the probability is somewhat higher than you would like. You will also find that in the general case, the effort to resolve a given conflict can also turn out to be somewhat higher than you like. Method definition conflicts are very common, class definition conflicts less common but nonetheless more frequent than you would like. It would be nice if we could count on improved programmer discipline to avoid these problems, but I wouldn't bank on that.
Basically, rather than considering the case where you have an image with only a handful of packages loaded, consider the case where you wish to be able to quickly load, use, and unload many times that number of packages as quickly and effortlessly as possible. You do not want to be tripped up by bad loads, or the inability to unload, or problems with conflicting definitions for methods or ( especially ) classes. You want things to proceed as seamlessly and effortlessly as possible, with the least intervention required on the part of the user.
You need to allow conflicting definitions to exist simultaneously- Collage's Layers are one such mechanism, where in specificatoin space you might have more than one definition in the image for a class or method, but only one is chosen to actually be active in the image. If neccessary, you provide a third definition that resolves the conflict, and that is the one chosen to be active in the image. Another mechanism to allow this would be to have strongly isolated environments, such as those in Oasis. There you could have two conflicting definitions of a method , with *both* active in the image, with no need for a third definition that would attempt to resolve the conflict, because the conflict would not exist in the operational sense- although they would appear to have the same selector, in actual fact the selectors are different objects, and therefore indexed separately. The behavior expected by each provider is the behavior seen by that provider, and no other. ( or so we think... I'll state that more strongly when I have a chance to actually test this... there are many things that I am working on right now ).
So, what I am basically saying is that looking at ChangeSets as package definitions is not a bad first step. But I do not think it will take you very far before you realize that other steps are needed... which of course is entirely acceptable, since this is most likely going to be an interesting learning experience for everyone involved.
- les
There are essentially two approaches (both of which are useful and educational) to the problem of building smaller modular images.
1. Start with the Image and Toss - The most popular has been to use a tool such as Stripper of Packager as we called it to remove classes, methods, instvars, globals and instances from the image. Packager also allowed renaming of symbols to smallints as does Pocket SmallTalk I believe. This approach avoids some of the initialization problem because it always starts from an initialized image. The problem is that it requires a lot of image and package knowledge expertise to perform the work and often developers unintentionally make it challenging to untangle an image so that it can be shrunk.
2. Start with an empty Image and Add - the approach hear is to build up a set of modular images from a set of carefully selected classes. The problem of course with this approach is that it means that all interdependencies need to be fixed in the existing classes. Often people give up and decide to write their own new class libs as in Pocket SmallTalk. The risk here is that once you decide to build an image you often own it for a lot longer than you intended. <grin>
3. A compromise approach is to start with an image containing the initialized classes even if it is a cycle the they add in the classes carefully to build up the image. This finesses the hard problem of getting all classes to initialize themselves properly in some correct order. It also allows one to use the familiar classes even if the lack the modularity and independence that one might ideally like.
It would be really useful to have an Image Analysis and Planning Tool which allowed one to understand the interdependencies between classes/methods and globals. Ideally one would be able to plan a reorganize of the image without actually doing it in place. Being able to see the impact of many changes before making them would reduce the image FUD which one faces when trying to decide if you really dare make those sweeping changes that you think are either trivial or impossible. Hopefully the work by Stephan et al may come to play in such a tool. Our experience with running the Packager is that the more often people ran it the more they learned about problems in their image and the more concerned they became about writing more modular code.
Regards, Dave
Dave dave@bedarra.com wrote...
It would be really useful to have an Image Analysis and Planning Tool which allowed one to understand the interdependencies between classes/methods and globals. Ideally one would be able to plan a reorganize of the image without actually doing it in place. Being able to see the impact of many changes before making them would reduce the image FUD which one faces when trying to decide if you really dare make those sweeping changes that you think are either trivial or impossible. Hopefully the work by Stephan et al may come to play in such a tool. Our experience with running the Packager is that the more often people ran it the more they learned about problems in their image and the more concerned they became about writing more modular code.
I agree it is essential to be able to do this kind of refactoring of the module structure again and again. When I did the Environments work, I took some time to refactor the systemOrganization somewhat, as this is what I used as the basis for the module structure produced by reorganizeEverything.
It ain't a tool, but the essence of a tool can be found in
Smalltalk tallyIndirectRefs
I can't even understand it now, but when I did, I know it gave me what I needed to move classes around between modules in such a way as to minimize foreign references. It is intended to be run after reorganizeEverything, so it may take me a couple of days to learn it again.
In a way, I think that merely getting this stuff to work again and making a few exploratory tools would be a great step toward a modular Squeak. If executing a couple of doits would carve Squeak up and let us take stats, then all the hotshots on this topic could look at the result and tell us what else is needed for a phase I solution.
Here is a proposal along those lines: This week I have to work hard on another project, and next week I'll be out of town and other-focused. However, before I leave town, I will try to have this stuff working again to the point that the image can be refactored and stay running. Then while I'm away, people can have fun messing around with the structures and the factoring. It should be instructive whether or not we end up using any of it.
- Dan
Dan Ingalls wrote:
I agree it is essential to be able to do this kind of refactoring of the module structure again and again. When I did the Environments work, I took some time to refactor the systemOrganization somewhat, as this is what I used as the basis for the module structure produced by reorganizeEverything.
It ain't a tool, but the essence of a tool can be found in
Smalltalk tallyIndirectRefs
However, before I leave town, I will try to have this stuff working again to the point that the image can be refactored and stay running. Then while I'm away, people can have fun messing around with the structures and the factoring. It should be instructive whether or not we end up using any of it.
- Dan
--
Dan, this is already working (still) in 3.1a. I've been using it when I looked at the Environments stuff.
There is one fix that you would want however after converting to Environments, make this change to avoid an image crash when an exception is raised:
Dictionary>>includesKey: key "Answer whether the receiver has a key equal to the argument, key."
^(self at: key ifAbsent: [nil]) notNil
I posted this as a fix.
Do exploreIt on "Smalltalk tallyIndirectRefs" for best results.
The third returned dictionary is the most interesting one imo. The others mostly say that 700 classes would be happier if they were placed in Smalltalk (doh).
It lists non-modular refs by occurrence count. This shows that most go to things like the basic collections, note that Tools, Morphic et al are references to other namespaces. Hopefully most Color refs are from the graphics packages, which should be ok, and so on. But there is a lot of work cut out for us.
Henrik
269->#Array 254->#Color 168->#OrderedCollection 135->#String 111->#Tools 110->#Smalltalk 106->#Form 95->#Morphic 95->#Time 95->#Dictionary 88->#WriteStream 82->#Display 77->#Character 70->#Sensor 64->#Preferences 57->#Cursor 52->#Transcript 52->#FileDirectory 52->#FileStream 47->#ReadStream
etc.
Dave's experience with initialization pretty much matches mine although I have tended to prefer the constructive approach.
I think part of the problem people have had adapting to additive modules is that many existing classes libraries haven't been designed with initialization or re-initialization in mind. In many cases Classes (or probably more importantly mutually dependent sets of classes) that needed complex initialization have often been initialized with ad hoc doIts that aren't captured as reusable code. Even, if the initialization code is placed in a change set or file-in as a do-it it tends to get forgotten because it doesn't show in the browser when looking at the class.
I think to make additive modules work reliably and repeatedly you need the following support for initialization:
1) Initialization code needs to be treated as first class code entities by the language and tools. Team/V did this and this is the reason that the ANSI Smalltalk language definition includes class and global variable initializers as language elements.
2) Initialization order needs to be well defined and repeatable. Team/V and ANSI Smalltalk both claim this but only if a programmer completely specifies the initialization order in some inconvenient way. This is one area where I think Java has done a better job. The Java rule could be loosely stated this way: a class is automatically initialized the first time an executing method references the class by name. I think the Squeak vm (or alternatively compiler) could be pretty easily adapted to support this semantics. If anyone wants to try let me know and I'll try to provide a more complete "specification".
3) The development environment needs to support placing a class (or module) into an uninitialized state. Note that this isn't strictly necessary in a pure runtime environment but it is quite essential for incremental development. Without it, you can't get an application into a predicable initial state as you add and modify code. If you can't do this, you can't really test your initialization code.
As part of the ParcPlace-Digitalk Firewall project we successfully refactored the VisualWorks class libraries into a set of additive modules and were able to reliably and reproducibly generate a new fully functioning VisualWorks images purely from source modules. One of the hardest part of this refactoring was identifying the initialization requirement of all the classes and writing appropriate initializers. [BTW, I've always contended that these new images we generated were the first "Smalltalk-80" images that didn't share some image bits (via cloning) from Dan's original Smalltalk-76 images]
At 08:48 PM 8/20/2001 -0400, Dave wrote:
There are essentially two approaches (both of which are useful and educational) to the problem of building smaller modular images.
- Start with the Image and Toss - The most popular has been to use a
tool such as Stripper of Packager as we called it to remove classes, methods, instvars, globals and instances from the image. Packager also allowed renaming of symbols to smallints as does Pocket SmallTalk I believe. This approach avoids some of the initialization problem because it always starts from an initialized image. The problem is that it requires a lot of image and package knowledge expertise to perform the work and often developers unintentionally make it challenging to untangle an image so that it can be shrunk.
- Start with an empty Image and Add - the approach hear is to build up
a set of modular images from a set of carefully selected classes. The problem of course with this approach is that it means that all interdependencies need to be fixed in the existing classes. Often people give up and decide to write their own new class libs as in Pocket SmallTalk. The risk here is that once you decide to build an image you often own it for a lot longer than you intended. <grin>
- A compromise approach is to start with an image containing the
initialized classes even if it is a cycle the they add in the classes carefully to build up the image. This finesses the hard problem of getting all classes to initialize themselves properly in some correct order. It also allows one to use the familiar classes even if the lack the modularity and independence that one might ideally like.
It would be really useful to have an Image Analysis and Planning Tool which allowed one to understand the interdependencies between classes/methods and globals. Ideally one would be able to plan a reorganize of the image without actually doing it in place. Being able to see the impact of many changes before making them would reduce the image FUD which one faces when trying to decide if you really dare make those sweeping changes that you think are either trivial or impossible. Hopefully the work by Stephan et al may come to play in such a tool. Our experience with running the Packager is that the more often people ran it the more they learned about problems in their image and the more concerned they became about writing more modular code.
Regards, Dave
I appreciate the need for initialization. Let's make it simpler than Java/ANSI Smalltalk by requiring a module to be a persistent immutable object. We should not care how an object came to be in a particular state, only that we can make a mutable copy of that state.
When you look at it this way, initialization code is just one way to create a copy of a particular object state and should not be fundamental to our definition of modules.
-----Original Message----- From: squeak-dev-admin@lists.squeakfoundation.org [mailto:squeak-dev-admin@lists.squeakfoundation.org]On Behalf Of Allen Wirfs-Brock Sent: Monday, August 20, 2001 11:05 PM To: squeak-dev@lists.squeakfoundation.org Cc: modsqueak@bluefish.se Subject: Re: [modules] {Image Shrink and Initialization}
Dave's experience with initialization pretty much matches mine although I have tended to prefer the constructive approach.
I think part of the problem people have had adapting to additive modules is that many existing classes libraries haven't been designed with initialization or re-initialization in mind. In many cases Classes (or probably more importantly mutually dependent sets of classes) that needed complex initialization have often been initialized with ad hoc doIts that aren't captured as reusable code. Even, if the initialization code is placed in a change set or file-in as a do-it it tends to get forgotten because it doesn't show in the browser when looking at the class.
I think to make additive modules work reliably and repeatedly you need the following support for initialization:
- Initialization code needs to be treated as first class code entities by
the language and tools. Team/V did this and this is the reason that the ANSI Smalltalk language definition includes class and global variable initializers as language elements.
[remainder snipped]
On Tuesday 21 August 2001 11:22, Richard Staehli wrote:
I appreciate the need for initialization. Let's make it simpler than Java/ANSI Smalltalk by requiring a module to be a persistent immutable object. We should not care how an object came to be in a particular state, only that we can make a mutable copy of that state.
When you look at it this way, initialization code is just one way to create a copy of a particular object state and should not be fundamental to our definition of modules.
This is the style I prefer, as I have mentioned in other messages. But there are problems here as well.
If the "width" instance variable of a persistent object is 320, what does this mean? Could it really be 1/4 of the screen's horizontal resolution when the programmer created it? In that case it might have to be changed to 150 to work on my system.
You might argue that the program was broken in the first place and should be rewritten to explicitly maintain the proper invariants. But in practice most people come from a programming background where they depend on late initializations to get the job done. See http://www.colorforth.com for an extreme example.
As I have already said, both styles have their merits and we should think about them very carefully. Since I have adopted the "persistent objects, pre-initialized" approach I am working on solving its problems. But it isn't as simple as it seems.
-- Jecel
- Initialization order needs to be well defined and repeatable. Team/V
and ANSI Smalltalk both claim this but only if a programmer completely specifies the initialization order in some inconvenient way. This is one area where I think Java has done a better job. The Java rule could be loosely stated this way: a class is automatically initialized the first time an executing method references the class by name. I think the Squeak vm (or alternatively compiler) could be pretty easily adapted to support this semantics. If anyone wants to try let me know and I'll try to provide a more complete "specification".
A bit of warning: the Java initialization is not that simple, because you need to detect cycles and also work despite concurrency. The Java spec has the steps necessary, and having implemented it myself I can say it is not that trivial, but once implemented you don't need to get back to it. But some people still don't quite understand how the initialization works, getting lost in the different initialization exceptions that can be triggered.
marcio
One other approach to keep from standing on your head is to keep the load time initialization story very simple by first running an "install" step to "bake" an initialized image. Install can do other useful things like identify machine type, OS version, national language, directories etc. The separation of install from load/run allows components to be moved between systems; and binary components to be relocated etc.
Marcio Marchini wrote:
- Initialization order needs to be well defined and repeatable. Team/V
and ANSI Smalltalk both claim this but only if a programmer completely specifies the initialization order in some inconvenient way. This is one area where I think Java has done a better job. The Java rule could be loosely stated this way: a class is automatically initialized the first time an executing method references the class by name. I think the Squeak vm (or alternatively compiler) could be pretty easily adapted to support this semantics. If anyone wants to try let me know and I'll try to provide a more complete "specification".
A bit of warning: the Java initialization is not that simple, because you
need to detect cycles and also work despite concurrency. The Java spec has the steps necessary, and having implemented it myself I can say it is not that trivial, but once implemented you don't need to get back to it. But some people still don't quite understand how the initialization works, getting lost in the different initialization exceptions that can be triggered.
marcio
Dave wrote:
It would be really useful to have an Image Analysis and Planning Tool which allowed one to understand the interdependencies between classes/methods and globals. Ideally one would be able to plan a reorganize of the image without actually doing it in place. Being able to see the impact of many changes before making them would reduce the image FUD which one faces when trying to decide if you really dare make those sweeping changes that you think are either trivial or impossible. Hopefully the work by Stephan et al may come to play in such a tool. Our experience with running the Packager is that the more often people ran it the more they learned about problems in their image and the more concerned they became about writing more modular code.
Five years ago I thought this would be pretty important... so that is actually what I've spent most of my time building in Oasis. I don't recall if I've described some of those before, but basically they are as follows... throughout the last few years I've routinely used these models to analyze entire image's worth of class libraries... and in Oasis, I can indeed do this while such code is nicely tucked away in its own environment.
Referencing Model - a very coarse-grained analysis which tells me which classes refer to which globals. Very simple, easy, and fast to compute. Those of you who are looking at schemes such as partitioning along class category lines to find out what cross-references exist are doing something similar to this.
Expectations Model - a much finer-grained model, this model can be used in lots of ways, though I've been focusing on a much harder analytical problem ( below ). "Expectations" refers to the notion that in Smalltalk we do not have types, rather we have expectations- all we know is that we "expect" to be able to send a message to a particular object, that this message send will answer some object, and perhaps we have further expectations on what messages we can send to that result. This model gathers information about where messages are being sent, and to whom, throughout a given chunk of code. From it, you can learn many things. I think that this is similar to what CodeCrawler provides.
Shard Model - Smalltalk does not have Interfaces as first class objects. But there are cases where one would like very much to be able to rapidly peer deep inside a large mass of code to find out what messages are being sent back and forth to the objects acting in the various roles in that code. The belief is that while Smalltalk does not have Interfaces, nonetheless they actually do exist, although implicitly, rather than explicitly. Shards are the fragmentary evidence that Interfaces exist.
( skipping some steps )
Facet Model - A Facet is what Java would call an Interface. That is, a Facet is a particular piece of the total Interface of an object. If you really believe that the Interfaces exist, then there ought to be a way to extract them from their implicit existence. This may or may not still be a hard problem. It has most definitely been an extremely difficult one up to this point... but perhaps that is no longer the case. The evidence from the Shard model has been overwhelmingly in favor that the Facets do exist... but getting that last step out of the way has been very difficult. This is where I've actually spent the vast majority of my time on Oasis- the problem has strong appeal, the evidence from the Shard model is very supportive, but until recently none of the algorithms I've tried to complete this process worked. I now have one that is looking much more promising, so at last I have the chance to explore this on its merits, rather than on perceptions. I am very hopeful, not just to have completion on this particular problem, but so that it will cease to devour what little time I have to work on Oasis, so that I can finally turn my attention to some other issues and get Oasis into a shareable state.
- les
Les Tyrrell wrote:
I've routinely used these models to analyze entire image's worth of class libraries...
<snip increasingly advanced stuff>
Les,
this could certainly be useful for us here in Squeakville in the future. How hard would it be to port them? Some of them? The easy ones? ;-)
I am guessing it might be easier than most of Oasis, since this has more of clever algorithms to it than APIs, so to speak.
Henrik
I've been looking at that. The analytical tools are somewhat independent- Referencing is not very involved, but Expectations needs to walk parse trees ( other than that should be easily ported ). Beyond that, the ony requirement of the more advanced models is that the Expectations model exist.
The major thing is getting them into intelligeable shape... Referencing and Expectations are pretty good, but static models ( I haven't had the use case need for models that would be dynamic- but if Expectations were dynamic, then it could do tree-shaking algorithms for image stripping, for instance ). The Shard model is littered with the debris of many failed attempts to get at Facets... and the Facet model is brand new. In between them lies the Aliasing model, which *hopefully* is primarily an accellerator. It seem to work well, but again is a static model, as are the Shard and Facet models.
Henrik Gedenryd wrote:
Les Tyrrell wrote:
I've routinely used these models to analyze entire image's worth of class libraries...
<snip increasingly advanced stuff>
Les,
this could certainly be useful for us here in Squeakville in the future. How hard would it be to port them? Some of them? The easy ones? ;-)
I am guessing it might be easier than most of Oasis, since this has more of clever algorithms to it than APIs, so to speak.
Henrik
Les Tyrrell wrote:
Both of these things are justifiable extensions to the existing Oasis capabilities, as far as I'm concerned, so I'd be willing to give it a try if someone will tell me what I need to know about the image formats, and what the VM expects.
I found this page on the swiki: http://minnow.cc.gatech.edu/squeak/769
Karl
----- Original Message ----- From: "Les Tyrrell" tyrrell@iserve11.lis.uiuc.edu To: squeak-dev@lists.squeakfoundation.org; "Dan Ingalls" Dan@SqueakLand.org Cc: modsqueak@bluefish.se Sent: Sunday, August 19, 2001 5:07 PM Subject: Re: [modules] What should be the first step?
I have a message pending (I just need to type it) on why ChangeSets may not be the answer.
It's sort of how I started out with Oasis... I just wanted a place to dump code where I could look at it without it causing trouble for my image. Later on I made that into a place where I could compile the code, instantiate objects, and interact with them, without clobbering my image. Which sounds very straightforward- but nothing that I did in Oasis was easy to accomplish.
What I found as I built Oasis was that there were very deep-seated non-modularities permeating everything. It's not just the tools, or even the code, but perhaps even more significantly, the attitude. Everything *knows* that there is only one namespace. That was true, of course, an entirely reasonable assumption at the time. But that means that there are much bigger mountains to move ( forget about getting to do something as easy as climbing them ) than you may be thinking. To give an example- In Oasis, I can load the entire class library for VisualWorks into a single module. There you have all the code in one module, just like it wanted to be. But... you can't use it, because you can't initialize this class library- over 200 classes need to be initialized, but the code to do it trips over itself... if I remember correctly, it went something like this: can't initialize Object, because Collections are initialized... can't do Collections, because something else isn't ready... Symbol and String are cyclicly dependent on each other, neither can proceed... The issues go deeper than just having some mechanisms like namespaces. "Just add namespaces" will not solve these problems.
As a counter-example, I *can* load a modified version of PocketSmalltalk's class library into a module, and I *can* instantiate and interact with objects defined by PocketST's classes. The reason is simple- I *can* initialize PocketSt's class library, because it was designed to be brought up from scratch. So, this is the route I would pursue, given that I already have Oasis- construct a class library similar to PocketSt's, but using Squeak's code ( I'd just use PocketSt's, but I don't believe it is open-source, though I could easily be wrong about that ).
All the PocketSt work is under an open-source license similar to the Apache license.
The benefit of such an approach is that I have a very clear picture of just what I have
in the module, and whether it works. The hurdles I would have to overcome are that I would have to be able to generate Squeak's bytecodes, ( meaning that I might have to either port Squeak's parser and compiler to VisualWorks, since that is where Oasis lives these days, or run them on top of PocketSt inside Oasis, which I've explored a bit in the past ), and I would have to know how to generate a new Squeak image from scratch. Both of these things are justifiable extensions to the existing Oasis capabilities, as far as I'm concerned, so I'd be willing to give it a try if someone will tell me what I need to know about the image formats, and what the VM expects.
- les
Hi!
At 11:24 18.08.01 -0700, Dan Ingalls wrote:
What does this say about our architecture for modules?
I'd like to add my opinion on this topic. I'm sorry, if these points were already discussed. Dan's suggested modularization makes sense. Taking Allan's posting "Component's or Modules" in account, I'd prefer a component-based approach because that's more dynamic and IMHO better suited for Squeak.
So I'd suggest that there's a tiny core which manages components. Components, in my definition, are self-describing (fully reflective) units of code which expose behavior via one or more interfaces. The core can load and unload the components (either by filing-in or removing change sets or by some different approach like image components, self-describing serialized objects etc - I don't know) and register them. A Squeak system is now plugged together from different, often replaceable components.
Here's an example: The core should have some way to communicate with the user. Let's call that a console. It can print some text or read in some text. There're at least three possible implementations for that behavior: Using the Squeak graphics, using the plattform console, or using something like a serial interface for Squeak systems without an OS. All these components should support the same IConsole interface (it give it some name) and depending on which component is loaded, Squeak will behave differently.
Each object, which wants to use a component's service has to query for the supporting interface and should expect that this interface doesn't exist. So somewhere in the core, some code should execute this
Console := Components componentByInterface: IConsole
to get some previously registered component for console behavior.
Once an interface has been defined, it may not be changed anymore. The only way to extend that interface is to create a new version, which must support all old services and of course the additonal services. If you request an interface, you should also ask for a certain version, otherwise you'd get the latest version and that might be not what you want. I find it helpful for development, that a version number of 0 denotes, that an interface isn't stable yet so that the rule, it will not change, is not in effect yet.
For the beginning, components could be defined as simple change sets (which should be enhanced however to support automatic removal). Based on this foundation, concepts for versioning the code, for requirements and storage can be developed.
However, I'd like to see the migration of Squeak into a component based architecture first.
Here are some suggestions for components
Core (Object, Boolean, all base classes like Collections) Compiler (everything needed to compile text to bytecode) Browser Model (stuff like "senders") FileIO SocketIO MVCUI MorphicUI
but also smaller stuff like
Console File Dialog Source code formatting
So everything, that might be replaced because of a different combination of modules, a full features morphic file dialog doesn't makes sense in a command-line-only system, should get a well defined pluggable interface.
Code modules are still needed, but this should IMHO be the second step. Regarding name spaces, I'd delay that for the modules, having module name spaces instead.
bye -- Stefan Matthias Aust // The essence of magick is simplicity
I noticed that when the "help bubble" contains longer text, the text tends to stick out of the bubble in upper right and lower right corners. Also, there seems to be too much space on the left of the text. See the attached GIF. I am using the image with latest (yesterday's) updates.
For my son's birthday I bought him a 6-month subscription to the EverQuest online adventure game. If you haven't played it, then I suggest that you obtain a copy and try it -it is VERY kool and quite cheap ($10 per copy + $10/month online fees, with the first month free).
It is so cool that I think it could be the "killer" app for Squeak if a limited client/server Squeak implementation could be devised and made part of the default image or at least available as a standard module.
EverQuest is a first-person-shooter graphical MUD with upwards of 1,000 players online simultaneously. The interactions are overwhelmingly complex and quite fun.
In addition to the "wow" factor of letting every kid host his/her own baby graphical MUD, a Squeak-based implementation would allow all sorts of collaboration between researchers, teachers, students, etc. Sorta a graphical realtime Swiki.
Just a thought.
I don't own a copy of Everquest so I'm not 100% sure, but I'd bet that when you carefully read through the EverQuest license agreement, you'll find out that the thing you propose is quite illegal. I'm very sure that "Ultima Online" agreement specifically says that if you play it using anything else than the official client, your account can be immediately terminated without any compensation.
Lawson English wrote:
It is so cool that I think it could be the "killer" app for Squeak if a limited client/server Squeak implementation could be devised and made part of the default image or at least available as a standard module.
EverQuest is a first-person-shooter graphical MUD with upwards of 1,000 players online simultaneously. The interactions are overwhelmingly complex and quite fun.
on 8/19/01 8:56 AM, Frantisek Fuka at fuxoft@terminal.cz wrote:
I don't own a copy of Everquest so I'm not 100% sure, but I'd bet that when you carefully read through the EverQuest license agreement, you'll find out that the thing you propose is quite illegal. I'm very sure that "Ultima Online" agreement specifically says that if you play it using anything else than the official client, your account can be immediately terminated without any compensation.
I didn't make it clear, but Stefan already guessed that I meant a *generic* Everquest-like client/server system, NOT something that would hook into Everquest or some other existing commercial system.
I'll continue this in a reply to my original article...
At 05:09 19.08.01 -0700, Lawson English wrote:
For my son's birthday I bought him a 6-month subscription to the EverQuest online adventure game. If you haven't played it, then I suggest that you obtain a copy and try it
Sounds like the father who buys his newborn child an electric model train :-)
I never played EverQuest or Ultima Online or any other graphical MUD, but I know the old MUDs, am an enthusiastic fantasy role player, and can therefore perhaps imaging that this kind of game as a high coolness factor.
Actually, I'm playing with the idea to create such kind of game (perhaps with a much smaller scale) on my own for a long time now some of my friends would love the idea to flesh out and build a fantasy world and/or play such a game, but they lack the skill to program such a system.
If you were suggesting to create a EverQuest client in Squeak, that would be illegal, I think, but if you think about creating a whole client/server system, let's continue to talk about that :-)
I admit, for various reasons I thought about writing such an environment in Java, actually, writing a Self-like language in Java which then would be the language to code the world in. But Squeak might be an alternative, at least for a prototype.
In addition to the "wow" factor of letting every kid host his/her own baby graphical MUD, a Squeak-based implementation would allow all sorts of collaboration between researchers, teachers, students, etc. Sorta a graphical realtime Swiki.
Sure, gaming is just one aspect of such a virtual universe.
Perhaps, this will also fit somewhere in the strategy of Squeakland? I don't know.
bye -- Stefan Matthias Aust \ Truth Until Paradox
There is a project that aims to create a free Ultima Online/Everquest-like server called World Forge (www.worldforge.org).
They have a number of clients written in a variety of languages...I think the "goal" is to have a server that can have it's world rendered isometric (UO style) or 3D (Everquest-style). It might be an interesting project to create a client in Squeak...the spec is totally open, unlike UO and EQ.
On Sun, Aug 19, 2001 at 07:32:05PM +0200, Stefan Matthias Aust wrote:
At 05:09 19.08.01 -0700, Lawson English wrote:
For my son's birthday I bought him a 6-month subscription to the EverQuest online adventure game. If you haven't played it, then I suggest that you obtain a copy and try it
Sounds like the father who buys his newborn child an electric model train :-)
I never played EverQuest or Ultima Online or any other graphical MUD, but I know the old MUDs, am an enthusiastic fantasy role player, and can therefore perhaps imaging that this kind of game as a high coolness factor.
Actually, I'm playing with the idea to create such kind of game (perhaps with a much smaller scale) on my own for a long time now some of my friends would love the idea to flesh out and build a fantasy world and/or play such a game, but they lack the skill to program such a system.
If you were suggesting to create a EverQuest client in Squeak, that would be illegal, I think, but if you think about creating a whole client/server system, let's continue to talk about that :-)
I admit, for various reasons I thought about writing such an environment in Java, actually, writing a Self-like language in Java which then would be the language to code the world in. But Squeak might be an alternative, at least for a prototype.
In addition to the "wow" factor of letting every kid host his/her own baby graphical MUD, a Squeak-based implementation would allow all sorts of collaboration between researchers, teachers, students, etc. Sorta a graphical realtime Swiki.
Sure, gaming is just one aspect of such a virtual universe.
Perhaps, this will also fit somewhere in the strategy of Squeakland? I don't know.
bye
Stefan Matthias Aust \ Truth Until Paradox
on 8/19/01 1:00 PM, Kevin Fisher at kgf@golden.net wrote:
There is a project that aims to create a free Ultima Online/Everquest-like server called World Forge (www.worldforge.org).
They have a number of clients written in a variety of languages...I think the "goal" is to have a server that can have it's world rendered isometric (UO style) or 3D (Everquest-style). It might be an interesting project to create a client in Squeak...the spec is totally open, unlike UO and EQ.
Thanks for the pointer. It would be interesting to see if a Squeak-based version of World Forge *server* could be made. Making such a beast work AND making it work fast enough for a commercial-quality game would tax the design philosophy of Squeak, Modular Squeak and the native code interface, I think...
At 16:00 19.08.01 -0400, Kevin Fisher wrote:
There is a project that aims to create a free Ultima Online/Everquest-like server called World Forge (www.worldforge.org).
I just browsed though the provided documentation. The screen shots look great and it's interesting that there ATLAS protocol is a classless SELF-like object system but I couldn't find enough details to guess the current project state and/or the features.
IMHO, the real work isn't setting up a client/server protocol but to come up with a flexible world object model, interesting, easy to learn rules which still allow great flexibility and finally with a rich game world that doesn't become boring after a few hours.
MUD - to answer the other email - is a Multi User Dungeon (often also Dimension). Something like a text adventure combined with a chat program which can be played by multiple players simultaneous. One unique feature of MUDs is that players can help to create, extend and flesh out the world buy using a simple (unfortunately often C-like) in-game language.
They have a number of clients written in a variety of languages...
Well, it looks like "variety" means C or C++ :-)
I think the "goal" is to have a server that can have it's world rendered isometric (UO style) or 3D (Everquest-style).
...or even textual like in nethack.
It might be an interesting project to create a client in Squeak...
But it look like to get at least some documentation, one has to read the source and extract the information. That's IMHO a large barrier to start...
bye -- Stefan Matthias Aust // Find the moon is our mission!
On Mon, Aug 20, 2001 at 10:19:37AM +0200, Stefan Matthias Aust wrote:
At 16:00 19.08.01 -0400, Kevin Fisher wrote:
There is a project that aims to create a free Ultima Online/Everquest-like server called World Forge (www.worldforge.org).
I just browsed though the provided documentation. The screen shots look great and it's interesting that there ATLAS protocol is a classless SELF-like object system but I couldn't find enough details to guess the current project state and/or the features.
Most of the real discussion goes on in their newsgroups...I occasionally stick my head in there to see how the project is progressing.
They seem to move in experimental stages, releasing specialized test servers to test some new concept or another. I think they just finished with a test server that had a small "economy" experiment where you would play the role of a pig farmer. :)
IMHO, the real work isn't setting up a client/server protocol but to come up with a flexible world object model, interesting, easy to learn rules which still allow great flexibility and finally with a rich game world that doesn't become boring after a few hours.
MUD - to answer the other email - is a Multi User Dungeon (often also Dimension). Something like a text adventure combined with a chat program which can be played by multiple players simultaneous. One unique feature of MUDs is that players can help to create, extend and flesh out the world buy using a simple (unfortunately often C-like) in-game language.
They have a number of clients written in a variety of languages...
Well, it looks like "variety" means C or C++ :-)
Oh? I thought I saw a Python client there at one time...the clients seem to live and die by the season though, so it could have been abandoned for something else. :) The "stock" client they do their tests on is an isometric engine..I haven't tried the 3D clients.
I think the "goal" is to have a server that can have it's world rendered isometric (UO style) or 3D (Everquest-style).
...or even textual like in nethack.
Well, you can always use the AAlib if you want ascii graphics. I still remember that demo of Quake using AAlib...fragging in ASCII is..um..unique. :)
It might be an interesting project to create a client in Squeak...
But it look like to get at least some documentation, one has to read the source and extract the information. That's IMHO a large barrier to start...
You may want to check their newsserver for documentation information. I know at one time they did have the protocol written down..perhaps the web site has fallen behind?
I admit, for various reasons I thought about writing such an environment in Java, actually, writing a Self-like language in Java which then would be the language to code the world in. But Squeak might be an alternative, at least for a prototype.
Stefan, did you see my post about http://spair.swiki.net/21 ?
I hope that someone might take the initiative and use it to create a complete Self implementation in Squeak.
- Stephen
At 10:18 20.08.2001 -0400, you wrote:
Stefan, did you see my post about http://spair.swiki.net/21 ?
No, not yet. I just came back to the Squeak list last weekend.
However, did you see my effort, porting the original SELF system to VisualWorks? --> http://www.3plus4.de/self/
I hope that someone might take the initiative and use it to create a complete Self implementation in Squeak.
Sounds interesting. I'll have a look at it.
bye -- Stefan Matthias Aust // Truth Until Paradox
-----Original Message----- From: squeak-dev-admin@lists.squeakfoundation.org [mailto:squeak-dev-admin@lists.squeakfoundation.org] On Behalf Of Stefan Matthias Aust Sent: Monday, August 20, 2001 1:06 PM To: squeak-dev@lists.squeakfoundation.org Subject: RE: Killer Squeak App?
At 10:18 20.08.2001 -0400, you wrote:
Stefan, did you see my post about http://spair.swiki.net/21 ?
No, not yet. I just came back to the Squeak list last weekend.
However, did you see my effort, porting the original SELF system to VisualWorks? --> http://www.3plus4.de/self/
No, that's the first I've seen of it. It's interesting that you took the approach of trying to load the Self snapshot file. I hadn't thought of that. I think the first step would be to get a Self compiler working in Squeak. Also, how do you like the Self syntax overall? I haven't used Self that much...there are a few things that I'm not so sure I like, but I'll reserve any comment until I've had more experience with it.
Another thing that I thought would be interesting is running Python in Squeak (interesting to see how well it could perform that is). Prototype objects might be a convenient place to start a Python implementation since they allow for the dynamic addition of instance variables (like Python). I don't think you'd need the delegation capability for Python though.
- Stephen
At 14:00 20.08.2001 -0400, Stephen Pair wrote:
However, did you see my effort, porting the original SELF system to VisualWorks? --> http://www.3plus4.de/self/
No, that's the first I've seen of it. It's interesting that you took the approach of trying to load the Self snapshot file. I hadn't thought of that.
Well, originally I only wanted to test whether my parser works but then I wondered, how many primitives do I need to bootstrap the thing. After a few hours of work I noticed, a lot of. Most of them are crude hacks but I eventually managed to read in most non-UI files.
I think the first step would be to get a Self compiler working in Squeak.
That would be easy. I've a working scanner/parser/compiler.
Also, how do you like the Self syntax overall?
In the last squeak, I changed my mind an nowadays, Self has not enough syntax for my taste. You really have to get used to all that (| .. |) object declarations ( ) method declarations, implicit self sends and the fact that even local variables doesn't exist. I really the clean concept, but using "name := 'sma'" instead of "name: 'sma'" or even "objects[1] := objects[2]" instead of "objects at: 1 Put: objects at: 2" would be more readable IMHO.
Another thing that I thought would be interesting is running Python in Squeak (interesting to see how well it could perform that is).
Well, look at http://www.3plus4.de/squeak (bottom of the page) for my start for the parser. A abandoned that project because Ruby is so much cooler than Python.
bye
-- Stefan Matthias Aust // Truth Until Paradox
Stefan Matthias Aust wrote:
In the last squeak, I changed my mind an nowadays, Self has not enough syntax for my taste. You really have to get used to all that (| .. |) object declarations ( ) method declarations, implicit self sends and the fact that even local variables doesn't exist.
I'd like to hear your opinion: do you think it is an advantage to allow receiver self to be implicit? I have started to think that this breaks the simple principle of always having the "receiver message" pattern and thereby causes more irregularity than advantages. But I'd like to hear others' opinion on this, I don't have a strong opinion yet. Jecel and John Maloney might have something wise to say about this as well?
I really the clean concept, but using "name := 'sma'" instead of "name: 'sma'" or even "objects[1] := objects[2]" instead of "objects at: 1 Put: objects at: 2" would be more readable IMHO.
It is wacky that you also address temps with the "temp: value" syntax. In effect 'self' is the inner context (cf. thisContext), not the object owning the method!
A second effect of not having := is that there must be a lot more parentheses in the code. Ie.
x := y blah: z becomes x: (y blah: z)
This is a second thing I've come to think of as a possible disadvantage.
Henrik
Henrik Gedenryd wrot:
Stefan Matthias Aust wrote:
In the last squeak, I changed my mind an nowadays, Self has
not enough
syntax for my taste. You really have to get used to all
that (| .. |)
object declarations ( ) method declarations, implicit self
sends and
the fact that even local variables doesn't exist.
I'd like to hear your opinion: do you think it is an advantage to allow receiver self to be implicit? I have started to think that this breaks the simple principle of always having the "receiver message" pattern and thereby causes more irregularity than advantages. But I'd like to hear others' opinion on this, I don't have a strong opinion yet. Jecel and John Maloney might have something wise to say about this as well?
I have questions about the notion of name resolution being tied in with message lookup. My gut tells me that these shouldn't be so intertwined. If you really want name resolution via a message send, then do "self orderedCollection" otherwise just use "OrderedCollection" and allow the compiler to resolve it. You could take it a step further and have the compiler ask the mirror to resolve the name (in which case, you can resolve names however you want)...this is analagous to the current implementation where the compiler looks to the class for help in resolving names.
Therefore, if you want to have flexibility in name resolution, dropping the "self" keyword would make that a challenge.
Regarding delegation in Squeak and compiling methods, there are really three issues to resolve:
- a syntax for a directed resend (the current super syntax will accomplish an undirected resend). I had thought about using a * following the variable name (i.e. "parent* doSomething"))...I don't particularly care for the Self syntax here, however it does allow for other types of messaging (i.e. "anObject async.doSomething). I think the Self syntax is "parent resend.doSomething".
- Allowing for overriding of slot getters and setters: For this, I was thinking that the using the normal Smalltalk instVar access and assignment operators would be fine (the compiler would turn these into bytecodes appropriate for prototypes). In this way, you could also do direct instvar access in other methods (but obviously this impacts the re-usability).
- Saving of method source: I thought a simple solution to this would be to have the ProtoBehavior hold onto the source strings, and allow one to instruct it to not to keep method source if that isn't desired. (it would also be a simple matter to write something that could install a constructor on an existing method in the class system). On the other hand, we could go for something more advanced that would allow source to be written into the changes file, we could accomplish that by allowing prototypes to be owned by some existing class, given a name, and kept in some dictionary off the class. OTOH if we had a nice virtual object memory system, we wouldn't need a source or changes file in the first place, and storing source in the virtual image wouldn't be an issue. ;)
- Stephen
On Wednesday 22 August 2001 17:14, Henrik Gedenryd wrote:
Stefan Matthias Aust wrote:
In the last squeak, I changed my mind an nowadays, Self has not enough syntax for my taste. You really have to get used to all that (| .. |) object declarations ( ) method declarations, implicit self sends and the fact that even local variables doesn't exist.
I'd like to hear your opinion: do you think it is an advantage to allow receiver self to be implicit? I have started to think that this breaks the simple principle of always having the "receiver message" pattern and thereby causes more irregularity than advantages. But I'd like to hear others' opinion on this, I don't have a strong opinion yet. Jecel and John Maloney might have something wise to say about this as well?
Since my Self/R has considerably *less* syntax than regular Self, I am not the right person to address Stefan's concerns.
But having used the "implicit self" trick in NeoLogo as well as Self and variations, I can say it is much more readable than what you might think from a first impression. It does make a missing statement separator (".") harder to spot since it becomes a run time error instead of being flagged by the compiler as in Smalltalk.
I really the clean concept, but using "name := 'sma'" instead of "name: 'sma'" or even "objects[1] := objects[2]" instead of "objects at: 1 Put: objects at: 2" would be more readable IMHO.
It is wacky that you also address temps with the "temp: value" syntax. In effect 'self' is the inner context (cf. thisContext), not the object owning the method!
Exactly. If you write "self temp: value" it will work for "instance variables" but fail for "temporaries".
A second effect of not having := is that there must be a lot more parentheses in the code. Ie.
x := y blah: z becomes x: (y blah: z)
This is a second thing I've come to think of as a possible disadvantage.
Self has two things that combine to make it need less parentheses than Smalltalk: all but the first keyword of a selector are capitalized and keywords parse from right to left. So the above expression would be
x: y blah: z
and Smalltalk's
x := y between: 0 and: (z min: 255)
would become
x: y between: 0 And: z min: 255
-- Jecel
Thanks Jecel,
these are all very informative comments. I don't want to start a flame war and I know you like Self (ok, an understatement perhaps), but neither of the three issues is an uncontestably perfect solution.
Jecel Assumpcao Jr wrote:
But having used the "implicit self" trick in NeoLogo as well as Self and variations, I can say it is much more readable than what you might think from a first impression. It does make a missing statement separator (".") harder to spot since it becomes a run time error instead of being flagged by the compiler as in Smalltalk.
It seems this would mean that you cannot simply read the code to see that it is syntactically correct either (since its correctness is not a static property). Unless you take clues from line breaks and such. But in all fairness some ST syntax mistakes slip through the compiler in much the same way.
It is wacky that you also address temps with the "temp: value" syntax. In effect 'self' is the inner context (cf. thisContext), not the object owning the method!
Exactly. If you write "self temp: value" it will work for "instance variables" but fail for "temporaries".
But this is unfortunately still inconsistent, the implicit receiver is sometimes self, sometimes "thisContext".
Since the context is seen as an extension of the object (the context has the object in a parent* slot), I thought the simple solution would be to simply consider (the implicit) self to be this "extended" version of the receiver object.
A second effect of not having := is that there must be a lot more parentheses in the code. Ie.
x := y blah: z becomes x: (y blah: z)
This is a second thing I've come to think of as a possible disadvantage.
Self has two things that combine to make it need less parentheses than Smalltalk: all but the first keyword of a selector are capitalized and keywords parse from right to left. So the above expression would be
x: y blah: z
and Smalltalk's
x := y between: 0 and: (z min: 255)
would become
x: y between: 0 And: z min: 255
Whoa. Less parentheses yes. More readable? Hmm. Also, making the parsing be sensitive to the capitalization of selector substrings is an "unorthodox" approach to say the least. And parens help the eyes to segment things.
Another problem with the automatic accessors instead of assignment is that you can't protect state from outside access and modification (unless you add other mechanisms for hiding methods from the outside). There was some feature of that kind in early versions IIRC?
In all, weighing the pros and cons of the syntax changes doesn't as obviously come out in Self's favor as one first thinks. But of course it is in the skill of an author to present any feature to its best advantage, letting the downsides slip in the editing process ;)
Henrik
On Thursday 23 August 2001 06:48, Henrik Gedenryd wrote:
Thanks Jecel,
these are all very informative comments. I don't want to start a flame war and I know you like Self (ok, an understatement perhaps), but neither of the three issues is an uncontestably perfect solution.
Just to make my position clear: I like many languages and use different ones for different applications. For the kind of application I spend most of my time developing (interactive and media rich) I strongly prefer Smalltalk. Some of the other Smalltalks I have used, like Smalltalk Express (ex V/Win), are pretty similar to Squeak while others, like Self, are a bit more different. Other Smalltalks I have studied, such as Smalltalk-72 and MIT ConcurrentSmalltalk, are far more different.
There are many good points in all of them, and it is impossible to label the differences as "better" or "worse" since so much depends on one's taste. The point of this thread is to let each person decide what they like best, and for that they must be aware of what options exist.
Jecel Assumpcao Jr wrote:
But having used the "implicit self" trick in NeoLogo as well as Self and variations, I can say it is much more readable than what you might think from a first impression. It does make a missing statement separator (".") harder to spot since it becomes a run time error instead of being flagged by the compiler as in Smalltalk.
It seems this would mean that you cannot simply read the code to see that it is syntactically correct either (since its correctness is not a static property). Unless you take clues from line breaks and such. But in all fairness some ST syntax mistakes slip through the compiler in much the same way.
It is a slight difference. Compare the Squeak
| temp c | c := Color new named: 'red' "." temp := 3. ...
with the same thing in Self
| temp. c | c: color copy named: 'red' "." temp: 3. ...
Squeak complains about "temp" being a new selector and you can easily notice the missing ".". If we had used the name of an existing selector, "copy" for example, then Squeak would have inserted an error message before the ":= 3." saying "nothing more expected".
In Self, this will compile with no problems and then try to send "temp:" to the string 'red', probably resulting in a "message not understood" error.
Exactly. If you write "self temp: value" it will work for "instance variables" but fail for "temporaries".
But this is unfortunately still inconsistent, the implicit receiver is sometimes self, sometimes "thisContext".
Not quite - the implicit self is always "thisContext", while the explicit self (as in my example) is always "self".
Since the context is seen as an extension of the object (the context has the object in a parent* slot), I thought the simple solution would be to simply consider (the implicit) self to be this "extended" version of the receiver object.
That is exactly it. The explicit self I used in my example has not been extended with the local temporaries, but it obviously still has the instance variables. The implicit self has both.
x: y between: 0 And: z min: 255
Whoa. Less parentheses yes. More readable?
You can put in the parentheses if you like. Anyway, it is hard to tell what is readable or not from a first impression. I have seen many novice C programmers start out with
#define BEGIN { #define END } #define AND && #define OR ||
Does this make C more readable? It does to them. I find the "graphic" characters break up the text nicely and make quickly scanning the source easier.
Hmm. Also, making the parsing be sensitive to the capitalization of selector substrings is an "unorthodox" approach to say the least.
Would it be so bad to have "Class" mean one thing and "class" another? ;-)
Sorry - I couldn't resist.
And parens help the eyes to segment things.
Indeed. In fact, Dan's proposal for a more readable syntax was to replace colons with parenthesis, remember?
Note that I am just explaining how things are and why they were done this way, not giving my opinion on their merits.
Another problem with the automatic accessors instead of assignment is that you can't protect state from outside access and modification (unless you add other mechanisms for hiding methods from the outside). There was some feature of that kind in early versions IIRC?
Yes - Self 1 and 2 had "privacy declarations" for slots. Since Self 3 the virtual machine has simply ignored them and all slots are effectively public because this proved to complicate lookup too much for the programmers to follow. The idea was to put privacy back in once something better was designed. That would be the "viewpoints" in the Us language (which is a small, but very significant patch to Self).
In all, weighing the pros and cons of the syntax changes doesn't as obviously come out in Self's favor as one first thinks. But of course it is in the skill of an author to present any feature to its best advantage, letting the downsides slip in the editing process ;)
It depends much more on the taste of the reader. See the threads on making Squeak more like Python or on having a "nicer" array access syntax.
-- Jecel
I suspect that implicit self probably makes Self code more difficult for beginners to read for exactly the reason you state: it doesn't follow the "receiver message" pattern. However, I must add that:
1. I haven't taught Self to anyone who didn't already know Smalltalk, so I have no evidence one way or the other, and 2. The expert Self programmer quckly becomes used to implicit self.
I'll also add that I find Smalltalk code a little more pleasant to read. I like look of assignment arrows. That, of course, is purely a matter of personal opinion and aesthetics.
-- John
At 11:14 PM +0200 8/22/01, Henrik Gedenryd wrote:
Stefan Matthias Aust wrote:
In the last squeak, I changed my mind an nowadays, Self has not enough syntax for my taste. You really have to get used to all that (| .. |) object declarations ( ) method declarations, implicit self sends and the fact that even local variables doesn't exist.
I'd like to hear your opinion: do you think it is an advantage to allow receiver self to be implicit? I have started to think that this breaks the simple principle of always having the "receiver message" pattern and thereby causes more irregularity than advantages. But I'd like to hear others' opinion on this, I don't have a strong opinion yet. Jecel and John Maloney might have something wise to say about this as well?
Dan Ingalls wrote:
What does this say about our architecture for modules? To me it says that what we want to start with in the image is really just the support necessary to receive a new module. This looks like a fairly small requirement -- it could be satisfied by a combination of Lex's ChangeSet proposal and the existing Environments work, with some cleanups and simplifications. I'm curious if people generally agree about this and, if so, if it would be worth summarizing this requirement as a sub-project of the overall effort.
A parallel sub-project would be to extend our tools to work with this new architecture.
This would seem to be the first step to shoot for, because it would enable...
- A refactoring of the entire system
along the lines above
- More reliable and consistent sharing
of major projects in the community
- A target image specification for the
more serious team development tools which could themselves be added as modules.
Do people think this is a reasonable first step?
Does anyone want to propose a spec for what needs to be done?
Dan,
Here is the latest installment of the "modularity of modularity" series. I think that right now we don't really need to work out how the system should be partitioned. If we just put a basic modularity system in place, then when it is in place we can beginto work on the breakdown of the system, to refine and change it into more appropriate pieces.
As the basis for structuring all the code within the image, I think Environments will serve our efforts well. The foundation looks quite solid enough to build on. It is also complementary to the ModSqueak work (which seems to just plug into a namespaces facility) and other code loading/management, version management solutions, and so on that may happen. Moreover, E:s make up the "innermost" piece that will underly everything else that we will need to add.
Also, I've seen no proposal that is strongly different from it. Rather, everything that's come up can be introduced by more or less incremental changes to the existing Environments scheme. For example, even something as fundamental as to use a different kind of module composition scheme.
Therefore I had the following idea. Why don't we sooner rather than later let Environments "go live", ie. put it into use by making the test pilot image operate under the Environments scheme.
(In effect we would put Environment reorganizeEverything in a change set postscript, but also provide ready-made images).
The reason is that while E:s are quite good already, we need to make it more stable, and up to the task so to speak. And this won't happen as long as it sits as stale code. It seems that not many Squeakers have looked at the Environments code. It has been in the standard image for 1.5 years, and nothing has happened!
Since it will be "test pilot mode", some initial instability should be acceptable, and people have a choice of staying with the latest final version.
And whenever we would choose to make such a radical change, it would have to be a bumpy ride for a while anyway. And unless people start using it for whatever they normally do, it will never become usable. It is the classic problem of bootstrapping, chicken or egg, etc.
By making this change, people will start using it, and only then will tool improvements, bug fixes, etc. start to come, and only in that way will it become usable. In the short time I've used it, I've already fixed one current showstopper in this way (exceptions crash the image hard), and made one semantic change (don't look for globals in the environments of superclasses).
Over time, change sets will come in to 1) fix bugs 2) add features 3) even improve the semantics 4) refactor existing code by using the new system (this was your original topic). All these things can be done incrementally.
Thinking about it, I can't think of any other way of doing it that would work. It won't happen that we'll be able to release a full, perfect solution at once. It needs to be worked out over time.
Now a suggested concrete plan of action:
There are a few things that I think need to be changed in the current E:s scheme, for instance we need a stronger scheme for module composition than single inheritance (I've outlined most of that in an earlier mail).
In a day or two I'll post a proposal for a very simple substrate for module composition that also includes a basis for dependency management. I have looked rather closely at the ModSqueak code as well.
We might want to put changes such as those in place before making the switch. We'll have to decide on a scheme first of course. But we don't even need to do that before making the switch, eg. if there is no consensus.
Also, a few of us might want to start ahead before then, to weed out the worst problems.
Lastly, we might want to finalize 3.1 before the switch (soon) and let this change happen in early 3.2 alpha. (I don't think this version change is absolutely necessary, but others may.) It seems suitable that the current round of update collection, started by Stefan (sma) and others, is finished before 3.1 is finalized.
Henrik
Folks -
What a joy to read mail this morning. I think we're on the way.
Jon, Marcio, Allen, and Stefan, I agree completely about your improved layering for the kernel; clearly the compiler does not belong in the real core, which is should only be the support for the execution engine.
At the same time, I'm more partial to working with a live image than with static composition (as you know). It's just my sense of urgency to go forward, which I can see how to do with our live image. I have no problem with a follow-up project that might restructure a few things so that both approaches were equally well supported.
Obviously, the dynamic image model has some problem starting with a compiler-free core (though image segments could be used to bring in the compiler), but I see no problem with a core that is layered, and the compiler can be thrown out, but not brought back in.
Phil, I don't have an immediate answer to your question about layering of the mathematical support, but isn't it great to be thinking about it! I had fun in my tiny kernel project (which as all point out could be tinier still), using Floats to cover the few cases where LargeIntegers were needed. Clearly the inner kernel has some minimal support for numbers and math, and then there's a more comprehensive package that gets added later for those applications that need it.
Andreas and Henrik, I like (of course ;-) your enthusiasm for taking a simple step forward that will allow us to start factoring the system, and that will provide a target for the higher-level support of modularity and group development. I await Henrik's proposal for how to go about this, and meanwhile I'll dust off the old environments code to make sure it works, and remind myself of what else is needed.
- Dan
squeak-dev@lists.squeakfoundation.org