The compilation process can be organized in different ways based on how the source program is analyzed and translated. One common classification depends on the number of times the compiler processes the source code during compilation. Each complete traversal of the source program or its intermediate representation is called a compiler pass. Based on the number of passes performed, compilers are categorized into :
- Single-pass compilers
- Multi-pass compilers
Types of Compiler Passes
Compiler passes are classified based on how many times the source program is processed during compilation.
1. Single Pass Compiler
Reads the source code only once and performs all compilation phases in that single scan.

Key Characteristics:
- Processes source code only once
- Faster compilation
- Simple design
- Less memory usage
- Limited optimization capability
Limitations:
- Difficult to handle forward references
- Limited error detection
- Requires simpler grammar
- Poor optimization
2. Two-Pass compiler / Multi-Pass compiler
- A Two-Pass Compiler processes the source program twice.
- A Multi-Pass Compiler processes it more than two times.
Typically divided into:

First Pass (Front-End / Analysis Phase)
- Lexical Analysis
- Syntax Analysis
- Semantic Analysis
- Intermediate Code Generation
- Platform Independent
Second Pass (Back-End / Synthesis Phase)
- Code Optimization
- Code Generation
- Machine-dependent tasks
- Platform Dependent
Problems that can be Solved With Multi-Pass Compiler
Case 1: Different Languages, Same Machine
If multiple programming languages target the same machine:
- Separate Front-End for each language
- Common Back-End for the same machine

Case 2: Same Language, Different Machines
If one language targets multiple machines:
- One Front-End
- Multiple Back-Ends (one for each machine)
This modularity makes multi-pass compilers more flexible and reusable.

Difference Between One Pass and Two Pass CompilerÂ
| One-Pass Compiler | Two-Pass Compiler |
|---|---|
| Compiles source code in a single pass | Compiles source code in two passes |
| Scans source code once | Scans source code twice |
| Faster | Slower |
| Limited optimization | Better optimization |
| Limited error detection | Better error detection |
| Simple design | More complex design |
| Less memory required | More memory required |
| May not generate intermediate code | Usually generates intermediate code |
| Suitable for simple languages | Suitable for complex languages |