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.