IBM's 63-pass Fortran compiler

Seen in a discussion on writing compilers, a reference to IBM’s Fortran for the 1401, which compiled in a series of 63 phases, each making a simple transformation and everything running within 8000 characters of core memory (6-bit characters). Here’s the paper:

Serial compilation and the 1401 FORTRAN compiler by L. H. Haines

This paper discusses a compiler organization in which phases act sequentially on a source program held in core storage.

A brief description of each phase of the 1401 FORTRAN compiler is given to illustrate the general scheme.

The 1401 FORTRAN compiler has 63 phases, an average of 150 instructions per phase, and a maximum of 300 instructions in any phase.

Of course, a different example which immediately comes to mind is the single-pass Turbo Pascal compiler for the PC, which was tiny by today’s standards:

a full Pascal compiler, including extensions that it made it practical for commercial use, tightly integrated with an editor. And the whole thing was lightning fast, orders of magnitude faster at building projects than Microsoft’s compilers. The entire Turbo Pascal 3.02 executable–the compiler and IDE–was 39,731 bytes.

Also notable, from 1983, ACTION! was a single-pass compiler for the 6502-based Atari 8-bit machines. It’s Algol-like, and the implementation is apparently very hairy:

the source code is tremendously complicated by the amount of codesize optimization taking place, and discussion in the AtariAge forums from the folks who got it released indicates that writing this compiler pushed the author to his very limits

Another nearby comment:

I first encountered a many-many pass compiler when working on the IBM 1800 (same architecture as the IBM 1130) where the Fortran II compiler had 29 passes. It was challenging, as the machines often had only 4k and the removable cartridge disks were 5 megs.

2 Likes

This was particularly interesting to me because of my interest in small-memory (4-8 KiB) systems. Thanks for the reference!

The source program is stored backwards in order to use the 1401 machine instructions that cause address registers to decrement when processing data.

Shades of my life as a 6502 programmer! I also regularly use both zero-based and one-based array indices, sometimes within the same subroutine, for similar reasons.

1 Like