Annotation of researchv10no/cmd/sml/doc/howto-boot, revision 1.1

1.1     ! root        1:                        How to bootstrap ML
        !             2: 
        !             3: This is stuff that "src/makeml" does for you, but if you're implementing
        !             4: a new runtime system or a new code generator, you need to know what
        !             5: makeml is doing.  This is a summary by Norman Ramsey of information
        !             6: that Andrew Appel should have written down.
        !             7: 
        !             8: runtime/run is the ML loader.  It searches for things it needs in the
        !             9: mo directory.  It takes one argument, which is the name of a
        !            10: structure.  That structure is found in the mo directory and executed
        !            11: for side effects.
        !            12: 
        !            13: runtime/run loads only 4 .mo files:
        !            14:        CoreFunc.mo  Math.mo Initial.mo Loader.mo
        !            15: It passes its argument (a structure name) to Loader.mo, which then
        !            16: loads many other .mo files (the entire DAG of dependencies whose root
        !            17: is CompFoo.mo (or whatever)).
        !            18: 
        !            19: The mo directory contains mo files.  These carry names of top-level
        !            20: structures or functors.  They are copies of the output produced by the
        !            21: code generator.  As such they are machine-dependent.  There is no
        !            22: software support for figuring out to which code generator (or machine)
        !            23: a .mo file corresponds.  Thus it is entirely up to the user to make
        !            24: sure that the .mo files in the .mo directory make sense and are the
        !            25: right ones for the task at hand.
        !            26: 
        !            27: The highest-level structure of a mo file is: 
        !            28:    fn () => (["a","b","c"], fn [a,b,c] => top-level structure or functor)
        !            29: where the ["a", "b", "c"] is a list of names of structures on which
        !            30: the top-level thing depends, and the [a,b,c] are the structures
        !            31: themselves.  Thus a, b, and c are the only free variables in the
        !            32: top-level structure, and the thing in the mo file is actually a closed
        !            33: lambda-term.  Only the run program reads .mo files.  
        !            34: 
        !            35: 
        !            36: The CompFoo structure (created with the Batch functor) is a structure
        !            37: that executes a small batch compiler as a side effect.  IntFoo is a
        !            38: structure that executes the full interactive system as a side effect.
        !            39: The only difference between the two is in the user interface.  The
        !            40: `run' loader is typically used only on one of these two structures, to
        !            41: execute either the batch or the interactive system.  Both the batch
        !            42: and interactive systems support an `export ML' command that saves the
        !            43: currently executing system into a file in a.out format, so that it can
        !            44: be re-executed at will.
        !            45: 
        !            46: 
        !            47: The batch system has three interesting commands that deal with ML
        !            48: source.  They are:
        !            49:    !file   compile file, and write a .mo file for each top-level structure
        !            50:    *file   compile file, and write a .s file for each top-level structure
        !            51:    <file   read in and parse the file
        !            52: All three commands enter appropriate things into the batch compiler's
        !            53: symbol table, so that later files can refer to them, and the
        !            54: appropriate top-level references can be resolved.
        !            55: 
        !            56: It is possible to set batch options with
        !            57:        ^option
        !            58: The options ^printit and ^saveLvarNames will cause useful intermediate
        !            59: code to be written to the .s file, in addition to the assembly code.
        !            60: 
        !            61: 
        !            62: 
        !            63: 
        !            64: Procedure for cross-development
        !            65: 
        !            66: Here's how to build a Mips ML, given a Vax ML.  To be able to begin, we
        !            67: either have to have 
        !            68:    a) the .mo files needed for a Vax image of a compiler for a Vax target
        !            69: or
        !            70:    b) a batch system running on the Vax that generates code for the Vax.
        !            71: 
        !            72: If we have a) we can get to b) by the following steps:
        !            73:    -- type `run CompVax'.  when the dust settles you will be running b).
        !            74:    -- type >batch to save the batch system
        !            75: 
        !            76: The structure CompMipsLittle specifies a batch compiler that will
        !            77: generate code for a little-endian Mips.  Suppose this lives in
        !            78: mipsglue.sml.  Then we run our `batch' with the command !mipsglue.sml,
        !            79: which will create the CompMipsLittle.mo file.  We go park that in the
        !            80: .mo directory.  Similarly we may need to compile other parts of the
        !            81: Mips code generator and create mo files for them.  The list of Mips
        !            82: files is in ./mipsall.
        !            83: 
        !            84: Now we can use the bootstrap loader (run) to create a new batch,
        !            85: batchm, that runs on the Vax but generates code for the mips.  
        !            86: `run CompMipsLittle' will do the job, and then we can export the new
        !            87: batch by `>batchm'.
        !            88: 
        !            89: Now we're in a position to throw out all of our old, boring Vax .mo
        !            90: files, and to replace them with new, exciting Mips .mo files.  We're
        !            91: the only ones who will know the difference---we'll only be able to
        !            92: tell the difference when' run fails to work. `mv mo mo.vax' will save
        !            93: the vax mo files for a rainy day.
        !            94: 
        !            95: Then we run batchm on a long script that compiles the whole compiler,
        !            96: this time generating Mips code.  This process may take about an hour
        !            97: on notecnirp.  The long script is the famous `all'.  We'll then have
        !            98: to go park all the newly-created mo files in the newly-created (Mips)
        !            99: mo directory.
        !           100: 
        !           101: Finally we have all our new improved Mips .mo files in place in the mo
        !           102: directory.  We're not ready to go yet, though, because we don't yet
        !           103: have a Mips loader.  If you've been wondering when we would get a
        !           104: runtime system, this is it.  We move to the Mips, go into ./runtime,
        !           105: remove all the object code, and adjust the Makefile to indicate we're
        !           106: generating a system for the Mips.  We then build a new loader with
        !           107: `make run'.  This will compile the runtime system and the loader and
        !           108: will squirrel them both away in `run'.  Next we `run CompMipsLittle'
        !           109: to get a Mips batch system.  We can also `run IntMipsLittle' to get a
        !           110: Mips interactive system.  We can run the interactive system, and we
        !           111: can use the batch system to make a new compiler.
        !           112: 
        !           113: 
        !           114: Making a new compiler
        !           115: 
        !           116: Use the appropriate batch to generate appropriate .mo files.
        !           117: Then use the boot loader (run) to generate a new compiler.
        !           118: There it is.
        !           119: 
        !           120: 
        !           121: 
        !           122: Baby steps
        !           123: 
        !           124: When debugging the mips code generator, it might be worth replacing
        !           125: CoreFunc with a very simple structure ("hello world"), then using
        !           126: batchm to generate a fake CoreFunc.mo. runtime/run would execute
        !           127: CoreFunc before dying in Math or Initial.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.