Rust long compile times are mainly caused by LLVM, and the amount of IR that is given to it.
"Lisp on Small Pieces" from 1994
https://www.amazon.com/exec/obidos/ASIN/0521562473/acmorg-20
It is not 70's, but 26 years should be enough to get hold of such knowledge.
Or "Modern Compiler Implementation" from 1998, a little more young.
https://www.cs.princeton.edu/~appel/modern/
Or rather "The Implementation of Functional Programming Languages", from 1986, now getting closer to 70's.
https://www.microsoft.com/en-us/research/publication/the-imp...
I can still have a look into my SIGPLAN paper collection to dust off some ML papers.
The large amount of IR given to LLVM is closely related to the amount of abstractions that Rust uses. It's especially relevant for iterators where a "simple" `for` loop expands to `into_iter()`, `iter.next()`, `match`, `drop`, and arithmetic expands to calls to overloadable operator methods, all moves are `memcpy` to clean up, and so on.
Speaking of which just use OCaml bytecode backend or Haskell interpreter to see how slow complex languages are.
This is what is missing to Rust and cranelift might help to deliver, alongside not having to keep compiling the whole world from scratch.
Avoiding that means doing the flattening earlier, in a higher level IR.
* GHC does exactly what I suggested rustc needs to do- it does the flattening on an earlier, higher-level IR than LLVM's. (It is also not exactly a fast compiler, though!)
* I'm not sure if this applies to F#, but in C#, LINQ compiles faster by not doing as much (if any) flattening in the first place.