Вы находитесь на странице: 1из 27

Compiler, Interpreter, and Bootstrapping

Motivation:
When we are asked to write a

Compiler for a complex source language or Interpreter for a low level intermediate language or Emulator for a new virtual machine Our strategy?
3/24/2004 COSC4301 assignment 3 1

Motivation continued
Strategy: o machine code VS high level language o scratch VS improve existing code We introduce some basic concepts and give some examples to make stuff clear.
3/24/2004 COSC4301 assignment 3 2

Terminology
Q: Which programming languages play a role in this picture?

input

translator

output

source program (expressed in the source language)


3/24/2004

expressed in the implementation language


COSC4301 assignment 3

target language

Tombstone Diagram
Program P implemented in L P L Translator implemented in L S -> T L

Machine implemented in hardware

Language interpreter in L M L

3/24/2004

COSC4301 assignment 3

Tombstone diagram: Combination rules

P M M

P S

ok
P L M

S -> T M M

P T

ok

P L
Wrong!
COSC4301 assignment 3

S -> T M

Wrong!
5

3/24/2004

Compiler Basics
Host compiler and Cross compiler:

3/24/2004

COSC4301 assignment 3

Compiler Basics continued


Two stage compiler:
Output of the first compiler is the input of the second one

Compile a translator implemented in high level language:

3/24/2004

COSC4301 assignment 3

Interpreter

A language process accept source code and executes it directly

3/24/2004

COSC4301 assignment 3

Interpreters versus Compilers


Each faction hold the inverted set of advantages against the other. This part covered in previous presentation. A comprise exists between two extremes to achieve reasonable compilation and acceptable run time performance. Define an intermediate language more high-level than machine code => easier to compile to more low-level than source language => easy to implement as an interpreter
3/24/2004 COSC4301 assignment 3 9

Interpretive Compilers
Hybrid of compilation and interpretation Pascal/Java 2-stage compiler is good examples compile source into machine independent low-level representation P-code/Byte code interpret P-code through machine dependent interpreter/JVM

Machine independent
3/24/2004

Machine dependent
COSC4301 assignment 3 10

Portable Compilers

Given 2 kits, which one is more portable? k1 Java->JVM M JVM M

k2

Java->JVM JVM

JVM M

For ideal portability, compilers are

. developed in modules for easy exchange.


. implemented in high level language.
3/24/2004 COSC4301 assignment 3 11

Portable Compilers continued


Suppose we have following modules (high level). We have no way to run Pascal program, why?

3/24/2004

COSC4301 assignment 3

12

Portable Compilers continue


We need a interpreter

re-implement

We can expect a fairly easy implantation using high level language implementation
3/24/2004 COSC4301 assignment 3 13

Portable Compilers continued


Now, we can run our Pascal program smoothly

Note here interpreter plays a dual role in both compiling and execution.
3/24/2004 COSC4301 assignment 3 14

Bootstrapping
a number of techniques which rely on partial/inefficient compiler version to create a full/better version often compiling a translator expressed in its own language

3/24/2004

COSC4301 assignment 3

15

Full Bootstrapping
A full bootstrap is necessary when we are building a new compiler from scratch. Example: We want to implement an Ada compiler for machine M. We dont currently have access to any Ada compiler (not on M, nor on any other machine). Idea: Ada is very large, we will implement the compiler in a subset of Ada and bootstrap it from a subset of Ada compiler in another language. (e.g. C)
3/24/2004 COSC4301 assignment 3 16

Full Bootstrapping continued


Step 1: build a compiler for Ada-S in another language v1 Ada-S ->M C Step 1a: build a compiler (v1) for Ada-S in another language. v1 Ada-S ->M C

3/24/2004

COSC4301 assignment 3

17

Full bootstrapping continued


Step 1b: Compile v1 compiler on M v1 v1 Ada-S ->M Ada-S->M C->M C M M This compiler can be used for M bootstrapping on machine M
but we do not want to rely on it permanently!

3/24/2004

COSC4301 assignment 3

18

Full Bootstrapping continued


Step 2a: Implement v2 of Ada-S compiler in Ada-S v2 Ada-S ->M Ada-S Step 2b: Compile v2 compiler with v1 compiler v2 v2 v1 Ada-S->M Ada-S ->M M Ada-S Ada-S ->M M We are now no longer dependent M on the availability of a C compiler!
3/24/2004 COSC4301 assignment 3 19

Full Bootstrapping continued


Step 3a: Build a full Ada compiler in Ada-S v3 Ada->M Ada-S Step 3b: Compile with v2 compiler v3 Ada->M v2 Ada-S Ada-S ->M M M
3/24/2004

v3 Ada->M

From this point on we can maintain the compiler in Ada. Subsequent versions v4,v5,... of the compiler in Ada and compile each with the the previous version.
20

COSC4301 assignment 3

Half Bootstrapping
We discussed full bootstrapping which is required when we have no access to a compiler for our language at all. Q: What if we have access to an compiler for our language on a different machine HM but want to develop one for TM ?

We have
Ada->HM HM Ada->HM Ada

We want
Ada->TM TM

Idea: we can use cross compilation from HM to TM to bootstrap the TM compiler


3/24/2004 COSC4301 assignment 3 21

Half Bootstrapping continued


Step 1: Implement Ada->TM compiler in Ada Ada->TM Ada

Step 2: Compile on HM
Ada->TM Ada->TM HM Ada Ada->HM Cross compiler: running on HM but emits TM code

HM HM
3/24/2004 COSC4301 assignment 3 22

Half Bootstrapping continued


Step 3: Cross compile our TM compiler. Ada->TM Ada->TM Ada Ada->TM TM HM HM

DONE!

From now on we can develop subsequent versions of the compiler completely on TM


3/24/2004 COSC4301 assignment 3 23

Bootstrap to improve efficiency


The efficiency of programs and compilers: Efficiency of programs: - memory usage - runtime Efficiency of compilers: - Efficiency of the compiler itself - Efficiency of the emitted code

Idea: We start from a simple compiler (generating inefficient code) and develop more sophisticated version of it. We can then use bootstrapping to improve performance of the compiler.
3/24/2004 COSC4301 assignment 3 24

Bootstrap to improve efficiency


We have Ada->Mslow Ada Step 1 Ada-> Mslow Mslow We want Ada->Mfast Ada

Ada->Mfast Ada->Mfast Ada Ada-> Mslow Mslow Mslow M

3/24/2004

COSC4301 assignment 3

25

Bootstrap to improve efficiency

Step 2

Ada->Mfast Ada->Mfast Ada Ada-> Mfast Mfast Mslow M

Fast compiler that emits fast code!

3/24/2004

COSC4301 assignment 3

26

Conclusion
To write a good compiler you may be writing several simpler ones first You have to think about the source language, the target language and the implementation language. The work of a compiler writer is never finished, there is always version 1.x and version 2.0 and
3/24/2004 COSC4301 assignment 3 27