The pymdl book
Appendix F. Glossary
This glossary collects terms used throughout the book, including historical machine terminology and names specific to pymdl. Entries distinguish the original MDL facility from its implementation here. The cited chapters give the full account; appendices A–C catalogue built-ins, types, and errors.
The era's machine and operating system
ITS -- the Incompatible Timesharing System, the operating system MDL was written for at MIT, running on PDP-10 hardware. The other two supported systems were Tenex and Tops-20, and the manual marks per-system differences throughout. pymdl's default personality is ITS. Chapter 36.
PDP-10 -- Digital's 36-bit machine. Its word is the WORD of chapter 21 and
the reason a FIX is 36 bits. pymdl includes an emulator for executing MDL
machine code. Chapter 36 gives its scope and dated performance measurements. Chapters 21, 36.
DDT -- the ITS debugger, and also its command interpreter; MDL's "superior
process" in the manual's sense is usually DDT. <VALRET "..."> hands it a
command. pymdl has a DDT of its own for looking at emulated memory.
Chapters 25, 36.
ITS file name -- two names and a device, written DSK:DIRECTORY;FIRST SECOND
or, inside MDL, as up to four STRINGs. The space between the two name halves
is where a modern path has a dot. A second name of > selects the newest version on input; pymdl maps
that default to the bare host filename (chapter 2). Chapter 14.
SNAME -- "system name", the directory used by default for file operations;
<SNAME> reads it and <SNAME string> sets it. A hangover from ITS, as the
manual says. Chapter 14.
sixbit -- ITS's six-bit character encoding, used for job and user names.
The STRINGs <UNAME> and <JNAME> return are restricted to it. Chapter 25.
SQUOZE -- a packing of up to six characters of a symbol name into one 36-bit
word, used by the assembler and the loader for every symbol the era's compiled
code refers to. pymdl vendors MIT's own MDL SQUOZE package rather than
reimplementing it. Chapters 21, 33, 35.
Compiled code and its files
RSUBR -- "relocatable subroutine", MDL's name for a compiled program. It is a
VECTOR, so a program can take its LENGTH, which is the visible difference
between a compiled routine and a built-in SUBR. Chapter 33.
RSUBR-ENTRY -- a second entry point into an RSUBR, so several FUNCTIONs
can be compiled into one. Chapters 26, 33.
linking -- in the original MDL, replacing an RSUBR's symbolic
reference with the called routine so later calls skip the lookup. pymdl
retains the RSUBR-LINK flag but resolves symbolic callees on each call;
it does not use the flag to cache them. Chapter 33, section 19.3.
FBIN -- a text file containing the impure part of purified RSUBRs.
Their machine code resides separately in a pure-code file or database,
with associated fixup information. Chapter 33, section 19.8.
NBIN -- a file containing text and binary words, including the code of
impure RSUBRs. Unlike an FBIN, it carries those code vectors in the
file itself. Chapter 33, sections 19.8 and 33.11.
PCODE -- the TYPE representing a reference into a pure-code block,
and the SUBR that constructs such a reference. Its printed form,
%<PCODE name offset>, identifies the block and an offset within it.
Chapter 33, section 19.4.
pure block, purification -- in the original MDL, purification moves objects into storage retained outside the ordinary garbage-collected heap and potentially shared between processes. pymdl models purity and retains purified objects; its storage management is implemented in Python. Purified compiled code can be written to the pure-code database and loaded in a later session. Chapters 24, 31, 33.
GLUE -- combines compiled routines' code and reference vectors into a
group, replacing eligible mediated calls (MCALLs) within that group with
direct calls (PUSHJs). This changes the available debugging information
as well as the call sequence. Chapter 31, section 6.1.
SAV file, .SAV -- a saved session. Historical SAVE files contain an
image of MDL storage; pymdl's SAVE and RESTORE use their own format.
mdlsave.py inspects historical images but does not make them ordinary
pymdl sessions. Chapters 14, 38.
NLIB -- the era's library index file, pairing a catalogue with the data file
that holds the compiled packages. tools/build_mdllib.py builds a real one
through MIT's own LUP. Chapter 30.
LUP -- the era's "library update" program, written in MDL, which builds and
maintains an NLIB. pymdl runs MIT's own copy rather than reimplementing it.
Chapter 30.
pymdl's own vocabulary
pymac -- a Python implementation of a routine originally supplied as compiled or assembled MDL code. A registered peer can be called in place of the PDP-10 routine. Tests compare its observable behavior with the original. Chapters 31, 33.
PYCODE -- the TYPE a natively compiled MDL routine wears, so that a
compiled FUNCTION prints as #RSUBR [#PYCODE NAME NAME #FALSE ()] and a
program can tell what it is looking at. Named so it cannot be mistaken for
anything of MDL's. Chapter 34.
PYCOMPILE -- the family of SUBRs that drive pymdl's native compiler,
distinct from MDL's own COMPILE and FILE-COMPILE, which pymdl also provides.
Chapter 34.
the native compiler -- pymdl's own compiler, MDL to Python, in
src/pymdl/pycomp.py. It refuses what it cannot compile honestly, answering a
FALSE that names the reason, rather than emitting code that would be subtly
wrong. Chapter 34.
the era compiler -- MIT's own MDL compiler, vendored in source and run interpreted by pymdl. It compiles to PDP-10 code, which the emulator then runs. Four configurations of it are kept, and chapter 34 has what each is for. Chapter 34.
the refusal floor -- the rule that pymdl's compiler must either compile a
FUNCTION correctly or decline it visibly. It is what makes "partially
compiled" a safe state. Chapter 34.
personality -- which era operating system pymdl presents: ITS, Tenex or
Tops-20. It changes file-name syntax, which interrupts exist, and a handful of
SUBRs' answers. ITS is the default. Chapters 2, 14.
the oracle -- MIT's MDL 55 running under the separate apsim simulator, driven by
tools/era_session.py, against which pymdl's answers are compared. "Measured,
MDL 55" in this book means an answer obtained this way. Chapter 37, appendix E.
the corpus -- the surviving era MDL sources and binaries this project reads
and runs: the MIT tapes, the vendored compiler and library trees, and the game
sources. src/pymdl/mdl/MANIFEST.tsv records what is vendored and where each
file came from. Chapters 30, 38, appendix G.
apsim -- the PDP-10 simulator used to run the era images from which the oracle answers come. Chapter 37.
Things the manuals name but do not explain
MUDDLE -- MDL's original name, and still the ATOM whose GVAL is the
release number: ,MUDDLE is 55 here. The language was renamed but the
variable was not. Chapter 14.
release 55, release 105 -- the ITS and Tenex release numbers of the interpreter the 1979 manual documents. pymdl provides personalities for both, defaulting to 55; the relevant chapters describe implementation differences. Chapter 1.
LPROG\ !-INTERRUPTS, LMAP\ !-INTERRUPTS, LERR\ !-INTERRUPTS -- the
three ATOMs the interpreter binds to keep track of the innermost PROG, the
innermost MAPF/MAPR, and the last ERROR or LISTEN. The backslash is part
of the PNAME, written so no program types one by accident, and each is an
ordinary rebound local value rather than a search of a stack. Chapters 13, 19.
INITIAL, ROOT, ERRORS, INTERRUPTS, MUDDLE -- the five OBLISTs a
virgin MDL has. A fresh pymdl has two more, the private oblists of the
preloaded pretty-printer and editor, which section 15.5 explicitly allows.
Chapter 18.
PACKAGE (the oblist) -- where package names live, so that USE can find
them; distinct from the PACKAGE function that declares one. Chapters 28, 30.
"the 55", "the era" -- “the 55” means MDL release 55, the main reference for behavioral measurements. “The era” more broadly refers to the historical MDL systems and archived material; it does not identify a single release. Check the release named beside a measurement. Appendix E.