Download presentation
Presentation is loading. Please wait.
Published byLaurence Leonard Modified over 9 years ago
1
Compilation (Chapter 3) 1 Course Overview PART I: overview material 1Introduction 2Language processors (tombstone diagrams, bootstrapping) 3Architecture of a compiler PART II: inside a compiler 4Syntax analysis 5Contextual analysis 6Runtime organization 7Code generation PART III: conclusion 8Interpretation 9Review
2
Compilation (Chapter 3) 2 Chapter 3 Compilation So far we have treated language processors (including compilers) as “black boxes” GOAL this lecture: – A first look "inside the box": how to build compilers. – Different “phases” and their relationships.
3
Compilation (Chapter 3) 3 The Major “Phases” of a Compiler Syntax Analysis Contextual Analysis Code Generation Source Program Abstract Syntax Tree Decorated Abstract Syntax Tree Object Code Error Reports
4
Compilation (Chapter 3) 4 Different Phases of a Compiler The different phases can be seen as different transformation steps to transform source code into object code. The different phases correspond roughly to the different parts of the language specification: Syntax analysis Syntax Contextual analysis Contextual constraints Code generation Semantics
5
Compilation (Chapter 3) 5 Example Program We now look at each of the three different phases in a little more detail. We look at each of the steps in transforming an example Triangle program into TAM code. ! This program is useless except for ! illustration let var n: integer; var c: char in begin c := ‘&’; n := n+1 end
6
Compilation (Chapter 3) 6 1) Syntax Analysis Syntax Analysis Source Program Abstract Syntax Tree Error Reports Note: Not all compilers construct an explicit representation of an AST. (e.g. on a “single pass compiler” generally no need to construct an AST) Note: Not all compilers construct an explicit representation of an AST. (e.g. on a “single pass compiler” generally no need to construct an AST)
7
Compilation (Chapter 3) 7 1) Syntax Analysis --> AST Program LetCommand SequentialDeclaration n Integer c Char c ‘&’ n n + 1 Ident OpChar.LitInt.Lit SimpleT VarDecl SimpleT VarDecl SimpleV Char.Expr SimpleV VNameExpInt.Expr AssignCommandBinaryExpr SequentialCommand AssignCommand
8
Compilation (Chapter 3) 8 2) Contextual Analysis --> Decorated AST Contextual Analysis Decorated Abstract Syntax Tree Error Reports Abstract Syntax Tree Contextual analysis: Scope checking: verify that all applied occurrences of identifiers are declared Type checking: verify that all operations in the program are used according to their type rules. Annotate AST: Applied identifier occurrences => declaration Expressions => Type
9
Compilation (Chapter 3) 9 2) Contextual Analysis --> Decorated AST Program LetCommand SequentialDeclaration n Ident SimpleT VarDecl SimpleT VarDecl Integer c Charc‘&’ nn +1 Ident OpChar.LitInt.Lit SimpleV Char.Expr SimpleV VNameExpInt.Expr AssignCommand BinaryExpr SequentialCommand AssignCommand :char :int SimpleV :int
10
Compilation (Chapter 3) 10 Contextual Analysis Finds scope and type errors. AssignCommand :int Example 1: :char ***TYPE ERROR (incompatible types in AssignCommand) Example 2: foo Ident SimpleV foo not found ***SCOPE ERROR (undeclared variable foo )
11
Compilation (Chapter 3) 11 3) Code Generation Assumes that program has been thoroughly checked and is well formed (scope & type rules) Takes into account semantics of the source language as well as the target language. Transforms source program into target code. Code Generation Decorated Abstract Syntax Tree Object Code
12
Compilation (Chapter 3) 12 3) Code Generation let var n: integer; var c: char in begin c := ‘&’; n := n+1 end PUSH 2 LOADL 38 STORE 1[SB] LOAD 0[SB] LOADL 1 CALL add STORE 0[SB] POP 2 HALT n Ident SimpleT VarDecl Integer address = 0[SB]
13
Compilation (Chapter 3) 13 Compiler Passes A “pass” is a complete traversal of the source program, or a complete traversal of some internal representation of the source program (such as an AST). A pass can correspond to a “phase” but it does not have to! Sometimes a single pass corresponds to several phases that are interleaved in time. What and how many passes a compiler does over the source program is an important design decision.
14
Compilation (Chapter 3) 14 Single Pass Compiler Compiler Driver Syntactic Analyzer calls Contextual AnalyzerCode Generator calls Dependency diagram of a typical Single Pass Compiler: A single pass compiler makes a single pass over the source text, parsing, analyzing, and generating code all at once.
15
Compilation (Chapter 3) 15 Multi Pass Compiler Compiler Driver Syntactic Analyzer calls Contextual AnalyzerCode Generator calls Dependency diagram of a typical Multi Pass Compiler: A multi pass compiler makes several passes over the program. The output of a preceding phase is stored in a data structure and used by subsequent phases. input Source Text output AST input output Decorated AST input output Object Code
16
Compilation (Chapter 3) 16 Example: Single Pass Compilation of... let var n: integer; var c: char in begin c := ‘&’; n := n+1 end PUSH 2 LOADL 38 STORE 1[SB] LOAD 0[SB] LOADL 1 CALL add STORE 0[SB] POP 2 HALT Ident n c Type int char Address 0[SB] 1[SB]
17
Compilation (Chapter 3) 17 Compiler Design Issues Single PassMulti Pass Speed Memory Modularity Flexibility “Global” optimization Source Language betterworse better for large programs (potentially) better for small programs worsebetter worse impossiblepossible single pass compilers are not possible for many programming languages
18
Compilation (Chapter 3) 18 Language Issues Example Pascal: Pascal was explicitly designed to be easy to implement with a single pass compiler: –Every identifier must be declared before its first use. var n:integer; procedure inc; begin n:=n+1 end Undeclared Variable! procedure inc; begin n:=n+1 end; var n:integer; ?
19
Compilation (Chapter 3) 19 Language Issues Example Pascal: –Every identifier must be declared before it is used. –How to handle mutual recursion then? procedure ping(x:integer) begin... pong(x-1);... end; procedure pong(x:integer) begin... ping(x–1);... end;
20
Compilation (Chapter 3) 20 Language Issues Example Pascal: –Every identifier must be declared before it is used. –How to handle mutual recursion then? forward procedure pong(x:integer) procedure ping(x:integer) begin... pong(x-1);... end; procedure pong(x:integer) begin... ping(x–1);... end; OK!
21
Compilation (Chapter 3) 21 Example: The Triangle Compiler Driver public class Compiler { public static void compileProgram(...) { Parser parser = new Parser(...); Checker checker = new Checker(...); Encoder generator = new Encoder(...); Program theAST = parser.parse( );// first pass checker.check(theAST);// second pass generator.encode(theAST);// third pass } public static void main(String[ ] args) {... compileProgram(...);... } }
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.