Introduction
A compiler is a translator that converts the high-level language into the machine language.
- High-level language is written by a developer and machine language can be understood by the processor.
The main purpose of compiler is to change the code written in one language without changing the meaning of the program.
When you execute a program which is written in HLL programming language then it executes into two parts.
- In the first part, the source program compiled and translated into the object program (low level language).
- In the second part, object program translated into the target program through the assembler.
Phases of Compilation
The compilation process contains the sequence of various phases.
Each phase takes source program in one representation and produces output in another representation. Each phase takes input from its previous stage.
Lexical analyzer phase takes source code as input.
- It reads the source program one character at a time and converts it into meaningful lexemes.
- Lexical analyzer represents these lexemes in the form of tokens.
Syntax analysis phase takes tokens as input and generates a parse tree as output.
- In syntax analysis phase, the parser checks that the expression made by the tokens is syntactically correct or not.
Semantic analysis phase checks whether the parse tree follows the rules of language.
- Semantic analyzer keeps track of identifiers, their types and expressions.
- The output of semantic analysis phase is the annotated tree syntax.
Intermediate code generation generates the source code into the intermediate code.
- Intermediate code is generated between the high-level language and the machine language.
- The intermediate code should be generated in such a way that you can easily translate it into the target machine code.
Code optimization is an optional phase and is used to improve the intermediate code so that the output of the program could run faster and take less space.
- It removes the unnecessary lines of the code and arranges the sequence of statements in order to speed up the program execution.
Code generation is the final stage and takes the optimized intermediate code as input and maps it to the target machine language. Code generator translates the intermediate code into the machine code of the specified computer.

Passes in Compiler
One Pass is a complete traversal of the source program.
Compiler has two passes to traverse the source program.
- Multi pass Compiler is used to process the source code of a program several times.
- In the first pass, compiler can read the source program, scan it, extract the tokens and store the result in an output file.
- In the second pass, compiler can read the output file produced by first pass, build the syntactic tree and perform the syntactical analysis. The output of this phase is a file that contains the syntactical tree.
- In the third pass, compiler can read the output file produced by second pass and check that the tree follows the rules of language or not. The output of semantic analysis phase is the annotated tree syntax.
- This pass is going on, until the target output is produced.
- One-pass compiler is used to traverse the program only once. T
- he one-pass compiler passes only once through the parts of each compilation unit. It translates each part into its final machine code.
- In the one pass compiler, when the line source is processed, it is scanned and the token is extracted.
- Then the syntax of each line is analyzed and the tree structure is build. After the semantic part, the code is generated.
- The same process is repeated for each line of code until the entire program is compiled.
LLVM (Case Study)