It was at Symbolics (lisp machines) back in the 80s. We had a machine configured to be a file server, and another to be a namespace server. ("Namespace" was what we called the equivalent of DNS in the lisp machine world, probably before DNS existed or at least before it became popular.)
Somebody put the namespace server's data files on the file server, because hey, it's for storing files, right?
Things went swimmingly until there was a power cut.
Then it was deduced that there was no feasible boot order: - The file server needed namespace service to figure out who it was. - The namespace server needed file service to get at the files containing its data.
@weekend_editor Not that simple, specially if you moved lots of things in the System Areas, QFASL changes, and or dropped a bit here or there in the DTP fields.
The two systems need to be very, very, very similar for this to work. 🙂
Both on the Lisp side, but also on the QFASL side.
That one, we could solve. Use the compiler on a previous system to compile sources to binaries in the usual way. Build a cold load from those compiler-generated binary files. Then boot the cold load and use it to load in the rest of the system, and save a world load.
This usually took several days, requiring deep debugging of all the dependencies that had inevitably crept in. The folk who did it at Symbolics were called "Wobblies", after the labor union IWW: International Workers of the World.
Meta-point the function (qld) for more. Pretty sure it'll be even in the MIT branch of lispm software you have, since it dates from the time before Symbolics & LMI.
Edited to add: it occured to me too late that you probably already know this, having built MIT-derived world loads yourself! Sorry, didn't mean to sound patronizing.
@weekend_editor E.g., System 78 to System 98/99 would be more or less impossible. The Lisp Machine Lisp language evolved, the 25-bit change, QFASL aren't compatible.
So you'd need to backport the compiler, then also figure out how to almost cross compile things .. and you'd need to figure out how to recompile everything which means having to load lots of things.. Which means running things from an incompatible system.
There were at least a couple instances like that at Symbolics, which I remember.
In one, we changed the .BIN file format (which which in turn was changed from the .QFASL format on the LM-2/CADR). That required the compiler to be hacked to generate binaries for the world being built, in the fashion of cross-compilers.
In another, we switched array layout from column-major to row-major (CL mandated), or in the parlance of the time, "DCP stood the world on its ear."
Those were delicate builds that took the "wobblies" (world-workers) a while to build.
But both of those were just from 1 major release to the next. Trying to make the hop across multiple releases would have been almost a full cross-compiler.
Symbolics had some *sorta* cross compilation to get across major releases with file format changes, array layout changes, etc. Not real cross-compilers.
But the bigger deal was when there was an architecture switch: the LM-2/CADR machines had to make the first binaries for the 3600s (L-machines), and the 3600 series had to make the first binaries for the I machines.
Those were completely different instruction sets, and basically ran the new architecture's rewritten compiler inside a compatibility package on the old architecture. And they (mostly) only had to work once, so the new architecture machines could bootstrap themselves thereafter. So again, not a robust cross-compiler.
No idea how the CLEO stuff (basically PC application delivery) worked.
@larsbrinkhoff@amszmidt@weekend_editor@cstross Not entirely sure what is meant by cross-compiling, but Symbolics had a number of compiler for different languages, certainly including FORTRAN but also C (I think).
I found it hard to write a Forth cross compiler. My mental block was mostly that the same symbol may refer to three different things depending on context. In a way, boostrapping a language using itself can be more confusing than doing it from another language.
@weekend_editor The early L-machine system was around System 78, both used the same Macrocode instruction set for the most part, and the input for CADRLP-like assembler was similar enough that it was a bunch of #+/#- hacks.
It was exactly the same situation with CADR and Lambda -- on the wire, they are entirelly different. But the same input was used (with a few #+ here and there and everywhere).
Remember, this is when the LM-2 still was in use ....