The compiler is made up of several passes; each pass is implemented as a separate program. Note that it is not necessary for the user to invoke each pass individually, as the C command runs each pass automatically. Note that the machine dependent passes are named differently for each processor, for example those with 86 in their name are for the 8086 and those with 68K in their name are for the 68000.
The passes are:
- The pre-processor - handles macros and conditional compilation
- The syntax and semantic analysis pass. This writes intermediate code for the code generator to read.
- CGEN, CG86 etc.
- The code generator - produces assembler code.
- OPTIM, OPT86 etc.
- The code improver - may optionally be omitted, reducing compilation time at a cost of larger, slower code produced.
- ZAS, AS86 etc.
- The assembler - in fact a general purpose macro assembler.
- The link editor - links object files with libraries.
- This utility converts the output of LINK into the appropriate executable file format (e.g. .EXE or .PRG or .HEX).
- The passes are invoked in the order given. Each pass reads a file and writes a file for its successor to read. Each intermediate file has a particular format; CPP produces C code without the macro definitions and with uses of macros expanded; P1 writes a file containing a program in an intermediate code; CGEN translates this to assembly code; AS produces object code, a binary format containing code bytes along with relocation and symbol information. LINK accepts object files and libraries of object files and writes another object file; this may be in absolute form or it may preserve relocation information and be input to another LINK command.
There are also other utility programs:
- Creates and maintains libraries of object modules
- Produces cross-reference listings of C or assembler programs.