I was amused by <i>&quot;The authors promote using dozens or hundreds of compiler passes, each being as simple as possible.&quot;</i><p>That&#x27;s kind of a desperation move. There was a COBOL compiler for the IBM 1401 with about 79 passes.[1]  They only had 4K or so of memory, but they had fast tape drives, so each pass read the previous intermediate form, did some processing on it, and wrote out the next intermediate form. Except for the passes which did sorts.<p>[1] <a href="http:&#x2F;&#x2F;bitsavers.informatik.uni-stuttgart.de&#x2F;pdf&#x2F;ibm&#x2F;140x&#x2F;C24-3146-3_1401_cobolOper.pdf" rel="nofollow">http:&#x2F;&#x2F;bitsavers.informatik.uni-stuttgart.de&#x2F;pdf&#x2F;ibm&#x2F;140x&#x2F;C2...</a>