CH 1
CH 1
Mary’s University
Faculty of Informatics
Department of Computer Science
Compiler Design
Chapter One
Compiler Design - Overview
❖ Hardware is just a piece of mechanical device and its functions are being controlled by a software.
❖ Hardware understands instructions in the form of electronic charge, which is the counterpart of
binary language in software programming.
❖ To instruct, the hardware codes must be written in binary format, which is simply a series of 1s and
0s.
❖ It would be a difficult and cumbersome task for computer programmers to write such codes, which is
why we have compilers to write such codes.
❖ Correctness
❖ Speed of compilation
❖We have learnt that any computer system is made of hardware and software.
❖So, we write programs in high-level language, which is easier for us to understand and
remember.
❖These programs are then fed into a series of tools and OS components to get the desired
code that can be used by the machine. This is known as Language Processing System.
❖Let us first understand how a C program, using C compiler, is executed on a host machine.
❖A linker tool is used to link all the parts of the program together for execution (executable machine
code).
❖A loader loads all of them into memory and then the program is executed.
❖ Before diving straight into the concepts of compilers, we should understand a few other
tools that work closely with compilers.
❖ The difference lies in the way they read the source code or input.
❖ A compiler reads the whole source code at once, creates tokens, checks semantics, generates intermediate code,
executes the whole program and may involve many passes.
❖ In contrast, an interpreter reads a statement from the input, converts it to an intermediate code, executes it, then
takes the next statement in sequence.
❖ If an error occurs, an interpreter stops execution and reports it. whereas a compiler reads the whole program
even if it encounters several errors.
❖ The output of an assembler is called an object file, which contains a combination of machine
instructions as well as the data required to place these instructions in memory.
1.4.4 Linker
❖ Linker is a computer program that links and merges various object files together in order to make an
executable file.
1.4.5 Loader
❖ Loader is a part of operating system and is responsible for loading executable files into
memory and execute them.
❖ It calculates the size of a program (instructions and data) and creates memory space for it.
11/4/2022 Prepared by: Mr. Adugna W. 11
1.5 Compiler Design - Architecture
A compiler can broadly be divided into two phases based on the way they compile.
❖ The analysis phase generates an intermediate representation of the source program and symbol table,
which should be fed to the Synthesis phase as input.
❖ Known as the back-end of the compiler, the synthesis phase generates the target program with the help of
intermediate source code representation and symbol table.
❖ Pass: A pass refers to the traversal of a compiler through the entire program.
❖ Phase: A phase of a compiler is a distinguishable stage, which takes input from the previous stage, processes
and yields output that can be used as input for the next stage.
<token-name, attribute-value>
❖ The next phase is called the syntax analysis or parsing. It takes the token
produced by lexical analysis as input and generates a parse tree (or syntax tree).
❖ In this phase, token arrangements are checked against the source code grammar, i.e.
the parser checks if the expression made by the tokens is syntactically correct.
❖ Also, the semantic analyzer keeps track of identifiers, their types and expressions; whether
identifiers are declared before use or not etc.
❖ After semantic analysis the compiler generates an intermediate code of the source code
for the target machine.
❖ This intermediate code should be generated in such a way that it makes it easier to be
translated into the target machine code.
❖ In this phase, the code generator takes the optimized representation of the intermediate
code and maps it to the target machine language.
❖ The code generator translates the intermediate code into a sequence of (generally) re-
locatable machine code.
❖ The symbol table makes it easier for the compiler to quickly search the identifier
record and retrieve it.
2. Parser generators.
3. Syntax-directed translation engines.
4. Automatic code generators.
5. Data-flow analysis engines.
6. Compiler-construction toolkits.
❖ Scanner generator generates lexical analyzers from a regular expression description of the tokens of
a language.
❖ Parser generator takes the grammatical description of a programming language and produces a syntax
analyzer.
❖ Syntax-directed translation engines produce collections of routines that walk a parse tree and generates
intermediate code.
❖ Code-generator takes a collection of rules that define the translation of each operation of
the intermediate language into the machine language for a target machine.
❖ Data-flow analysis engine gathers the information, that is, the values transmitted from one
part of a program to each of the other parts. Data-flow analysis is a key part of code
optimization.
❖The toolkits provide integrated set of routines for various phases of compiler.
11/4/2022 Prepared by: Mr. Adugna W. 26
11/4/2022 Prepared by: Mr. Adugna W. 27
1.8 History of Compiler
❖ Important Landmark of Compiler's history are as follows:
❖ The “Compiler" word was first used in the early 1950s by Grace Murray Hopper.
❖ COBOL was the first programming language which was compiled on multiple platforms in 1960
❖ The study of the scanning and parsing issues was pursued(followed) in the 1960s and 1970s to
provide a complete solution
❖ A linker tool is used to link all the parts of the program together for execution.
❖ A loader loads all of them into memory and then the program is executed.
❖ A compiler that runs on machine and produces executable code for another machine is
called a cross-compiler.
❖ A parser should be able to detect and report any error in the program.