Presentation is loading. Please wait.

Presentation is loading. Please wait.

Theory of Compilation 236360 Erez Petrank Lecture 1: Introduction, Lexical Analysis 1.

Similar presentations


Presentation on theme: "Theory of Compilation 236360 Erez Petrank Lecture 1: Introduction, Lexical Analysis 1."— Presentation transcript:

1 Theory of Compilation 236360 Erez Petrank Lecture 1: Introduction, Lexical Analysis 1

2 Compilation Theory Lecturer: Assoc. Prof. Erez Petrank – erez@cs.technion.ac.il erez@cs.technion.ac.il – Reception hour: Thursday 14:30—15:30, Taub 528. Teaching assistants: – Adi Sosnovich (responsible TA) – Maya Arbel 2

3 Administration Site: http://webcourse.cs.technion.ac.il/236360 Grade: – 25% homework (important!) 5% dry (MAGEN) 20% wet: compulsory – 75% Test Failure in test means failure in course, independent of homework grade. Prerequisite: Automata and formal languages 236353 MOED GIMMEL for Miluim only העתקות... 3

4 Books Main book – A.V. Aho, M. S. Lam, R. Sethi, and J.D. Ullman – “Compilers – Principles, Techniques, and Tools”, Addison-Wesley, 2007. Additional book: – Dick Grune, Kees van Reeuwijk, Henri E. Bal, Ceriel J.H. Jacobs, and Koen G. Langendoen. “Modern Compiler Design”, Second Edition, Wiley 2010. 4

5 Turing Award 5 2008: Barbara Liskov, programming languages and system design. 2009: Charles P Thacker, architecture. 2010: Leslie Valiant, theory of computation.

6 Goals Understand what a compiler is, How a compiler works, Tools and techniques that can be used in other settings. 6

7 Complexity 7

8 What is a Compiler? “A compiler is a computer program that transforms source code written in a programming language (source language) into another language (target language). The most common reason for wanting to transform source code is to create an executable program.” --Wikipedia 8

9 What is a Compiler? 9 Executable code exe Source text txt source languagetarget language Compiler C C++ Pascal Java Postscript TeX Perl JavaScript Python Ruby Prolog Lisp Scheme ML OCaml IA32 IA64 SPARC C C++ Pascal Java Java Bytecode …

10 What is a Compiler? 10 Executable code Executable code exe Source text Source text txt Compiler int a, b; a = 2; b = a*2 + 1; MOV R1,2 SAL R1 INC R1 MOV R2,R1 The source and target program are semantically equivalent. Since the translation is difficult, it is partitioned into standard modular steps.

11 Anatomy of a Compiler (Coarse Grained) 11 Executable code Executable code exe Source text Source text txt Intermediate Representation Intermediate Representation Backend (synthesis) Compiler Frontend (analysis) int a, b; a = 2; b = a*2 + 1; MOV R1,2 SAL R1 INC R1 MOV R2,R1 Optimization

12 Modularity 12 Source Language 1 txt Intermediate Representation Backend TL2 Frontend SL2 int a, b; a = 2; b = a*2 + 1; MOV R1,2 SAL R1 INC R1 MOV R2,R1 Frontend SL3 Frontend SL1 Backend TL1 Backend TL3 Source Language 2 txt Source Language n txt Executable target 1 exe Executable target 2 exe Executable target m exe SET R1,2 STORE #0,R1 SHIFT R1,1 STORE #1,R1 ADD R1,1 STORE #2,R1 Build m+n modules instead of m  n compilers…

13 Anatomy of a Compiler 13 Executable code Executable code exe Source text Source text txt Intermediate Representation Intermediate Representation Backend (synthesis) Compiler Frontend (analysis) int a, b; a = 2; b = a*2 + 1; MOV R1,2 SAL R1 INC R1 MOV R2,R1 Lexical Analysis Syntax Analysis Parsing Semantic Analysis Intermediate Representation (IR) Code Generation

14 Interpreter 14 Interpreter int a, b; a = 2; b = a*2 + 1; Source text Source text txt Input Output Intermediate Representation Intermediate Representation Frontend (analysis) Execution Engine

15 Compiler vs. Interpreter 15 Executable code Executable code exe Source text Source text txt Intermediate Representation Intermediate Representation Backend (synthesis) Frontend (analysis) Source text Source text txt Input Output Intermediate Representation Intermediate Representation Frontend (analysis) Execution Engine

16 Compiler vs. Interpreter 16 Intermediate Representation Intermediate Representation Backend (synthesis) Frontend (analysis) 3 3 7 7 Intermediate Representation Intermediate Representation Frontend (analysis) Execution Engine b = a*2 + 1; MOV R1,8(ebp) SAL R1 INC R1 MOV R2,R1 3 3 7 7

17 Just-in-time Compiler (e.g., Java) 17 Java Source Java Source txt Input Output Java source to Java bytecode compiler Java Bytecode Java Bytecode txt Java Virtual Machine Just-in-time compilation: bytecode interpreter (in the JVM) compiles program fragments during interpretation to avoid expensive re-interpretation. Machine dependent and optimized.

18 Importance Many in this class will build a parser some day – Or wish they knew how to build one… Useful techniques and algorithms – Lexical analysis / parsing – Intermediate representation – … – Register allocation Understand programming languages better Understand internals of compilers Understanding of compilation versus runtime, Understanding of how the compiler treats the program (how to improve the efficiency, how to use error messages), Understand (some) details of target architectures 18

19 Complexity: Various areas, theory and practice. 19 TargetSource Compiler  Useful formalisms  Regular expressions  Context-free grammars  Attribute grammars  Data structures  Algorithms Programming Languages Software Engineering Operating systems Runtime environment Garbage collection Architecture

20 Course Overview 20 Executable code Executable code exe Source text Source text txt Compiler Lexical Analysis Syntax Analysis Parsing Semantic Analysis Inter. Rep. (IR) Inter. Rep. (IR) Code Gen.

21 Front End Ingredients Character Stream Lexical Analyzer Token Stream Syntax Analyzer Syntax Tree Semantic Analyzer Decorated Syntax Tree Intermediate Code Generator Easy, Regular Expressions More complex, recursive, context-free grammar More complex, recursive, requires Walking up and down in the Derivation tree. Get code from the tree. Some optimizations are easier on a tree, and some easier on the code.

22 Lexical Analysis 22 Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. x = b*b – 4*a*c txt Token Stream

23 Syntax Analysis (Parsing) 23 Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. ‘b’ ‘4’ ‘b’ ‘a’ ‘c’ ID factor term factor MULT term expression factor term factor MULT term expression term MULTfactor MINUS Syntax Tree

24 Simplified Tree 24 Sem. Analysis Inter. Rep. Code Gen. ‘b’ ‘4’ ‘b’ ‘a’ ‘c’ MULT MINUS Lexical Analysis Syntax Analysis Abstract Syntax Tree

25 Semantic Analysis 25 Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. ‘b’ ‘4’ ‘b’ ‘a’ ‘c’ MULT MINUS type: int loc: sp+8 type: int loc: const type: int loc: sp+16 type: int loc: sp+24 type: int loc: R2 type: int loc: R1 Annotated Abstract Syntax Tree

26 Intermediate Representation 26 Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. ‘b’ ‘4’ ‘b’ ‘a’ ‘c’ MULT MINUS type: int loc: sp+8 type: int loc: const type: int loc: sp+16 type: int loc: sp+24 type: int loc: R2 type: int loc: R1 R2 = 4*a R1=b*b R2= R2*c R1=R1-R2 Intermediate Representation

27 Generating Code 27 Inter. Rep. Code Gen. ‘b’ ‘4’ ‘b’ ‘a’ ‘c’ MULT MINUS type: int loc: sp+8 type: int loc: const type: int loc: sp+16 type: int loc: sp+24 type: int loc: R2 type: int loc: R1 R2 = 4*a R1=b*b R2= R2*c R1=R1-R2 MOV R2,(sp+8) SAL R2,2 MOV R1,(sp+16) MUL R1,(sp+16) MUL R2,(sp+24) SUB R1,R2 Lexical Analysis Syntax Analysis Sem. Analysis Intermediate Representation Assembly Code

28 The Symbol Table A data structure that holds attributes for each identifier, and provides fast access to them. Example: location in memory, type, scope. The table is built during the compilation process. – E.g., the lexical analysis cannot tell what the type is, the location in memory is discovered only during code generation, etc. 28

29 Error Checking An important part of the process. Done at each stage. Lexical analysis: illegal tokens Syntax analysis: illegal syntax Semantic analysis: incompatible types, undefined variables, … Each phase tries to recover and proceed with compilation (why?) – Divergence is a challenge 29

30 Errors in lexical analysis 30 pi = 3.141.562 txt Illegal token pi = 3oranges txt Illegal token pi = oranges3 txt,,

31 Error detection: type checking 31 x = 4*a*”oranges” txt ‘4’‘a’ “oranges”MULT type: int loc: sp+8 type: int loc: const type: string loc: const type: int loc: R2

32 The Real Anatomy of a Compiler 32 Executable code exe Source text txt Lexical Analysis Sem. Analysis Process text input characters Syntax Analysis tokens AST Intermediate code generation Annotated AST Intermediate code optimization IR Code generation IR Target code optimization Symbolic Instructions Machine code generation Write executable output MI

33 Optimizations “Optimal code” is out of reach – many problems are undecidable or too expensive (NP- complete) – Use approximation and/or heuristics – Must preserve correctness, should (mostly) improve code, should run fast. Improvements in time, space, energy, etc. This part takes most of the compilation time. A major question: how much time should be invested in optimization to make the code run faster. – Answer changes for the JIT setting. 33

34 Optimization Examples Loop optimizations: invariants, unrolling, … Peephole optimizations Constant propagation – Leverage compile-time information to save work at runtime (pre-computation) Dead code elimination – space … 34

35 Modern Optimization Challenges Main challenge is to exploit modern platforms – Multicores – Vector instructions – Memory hierarchy – Is the code sent on the net (Java byte-code)? 35

36 Machine code generation A major goal: determine location of variables. Register allocation – Optimal register assignment is NP-Complete – In practice, known heuristics perform well assign variables to memory locations Instruction selection – Convert IR to actual machine instructions Modern architectures – Multicores – Challenging memory hierarchies 36

37 Compiler Construction Toolset Lexical analysis generators – lex Parser generators – yacc Syntax-directed translators Dataflow analysis engines 37

38 Summary A compiler is a program that translates code from source language to target language Compilers play a critical role – Bridge from programming languages to the machine – Many useful techniques and algorithms – Many useful tools (e.g., lexer/parser generators) Compiler are constructed from modular phases – Reusable – Debug-able, understandable. – Different front/back ends 38

39 Theory of Compilation Lexical Analysis 39

40 40 You are here Executable code Executable code exe Source text Source text txt Compiler Lexical Analysis Syntax Analysis Parsing Semantic Analysis Inter. Rep. (IR) Inter. Rep. (IR) Code Gen.

41 From characters to tokens What is a token? – Roughly – a “word” in the source language – Identifiers – Values – Language keywords – (Really - anything that should appear in the input to syntax analysis) Technically – A token is a pair of (kind,value) 41

42 Example: kinds of tokens 42 TypeExamples Identifierx, y, z, foo, bar NUM42 FLOATNUM3.141592654 STRING“so long, and thanks for all the fish” LPAREN( RPAREN) IFif …

43 Strings with special handling 43 TypeExamples Comments/* Ceci n'est pas un commentaire */ Preprocessor directives#include Macros#define THE_ANSWER 42 White spaces\t \n

44 The Terminology Lexeme (aka symbol): a series of letters separated from the rest of the program according to a convention (space, semi-column, comma, etc.) Pattern: a rule specifying a set of strings. Example: “an identifier is a string that starts with a letter and continues with letters and digits”. Token: a pair of (pattern, attributes) 44

45 From characters to tokens 45 x = b*b – 4*a*c txt Token Stream

46 Errors in lexical analysis 46 pi = 3.141.562 txt Illegal token pi = 3oranges txt Illegal token pi = oranges3 txt,,

47 Error Handling Many errors cannot be identified at this stage. For example: “fi (a==f(x))”. Should “fi” be “if”? Or is it a routine name? – We will discover this later in the analysis. – At this point, we just create an identifier token. But sometimes the lexeme does not satisfy any pattern. What can we do? Easiest: eliminate letters until the beginning of a legitimate lexeme. Other alternatives: eliminate one letter, add one letter, replace one letter, replace order of two adjacent letteres, etc. The goal: allow the compilation to continue. The problem: errors that spread all over. 47

48 How can we define tokens? Keywords – easy! – if, then, else, for, while, … We need a precise, formal description (that a machine can understand) of things like: – Identifiers – Numerical Values – Strings Solution: regular expressions. 48

49 Regular Expressions over Σ 49 Basic PatternsMatching ΦNo string εThe empty string aA single letter ‘a’ in Σ Repetition Operators R*Zero or more occurrences of R R+R+ One or more occurrences of R Composition Operators R 1 |R 2 Either an R 1 or R 2 R1R2R1R2 An R 1 followed by R 2 Grouping (R)R itself

50 Examples ab*|cd? = (a|b)* = (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)* = 50

51 Simplifications Precedence: * is of highest priority, then concatenation, and then unification. a | (b (c)*) = a | bc* ‘R?’ stands for R or ε. ‘.’ stands for any character in Σ [xyz] for letters x,y,z in Σ means (x|y|z) Use hyphen to denote a range – letter = a-z | A-Z – digit = 0-9 51

52 More Simplifications Assign names for expressions: – letter = a | b | … | z | A | B | … | Z – letter_ = letter | _ – digit = 0 | 1 | 2 | … | 9 – id = letter_ (letter_ | digit)* 52

53 An Example A number is ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ) + (  |. ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ) + (  | E ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ) + ) ) Using simplifications it is: – digit = 0-9 – digits = digit+ – number = digits (Є |.digits (Є | e (Є|+|-) digits ) ) 53

54 Additional (Practical) Examples if = if then = then relop = | = | = | <> 54

55 Escape characters What is the expression for one or more ‘+’ symbols coming after the letter ‘C’ ? – C++ won’t work – C(\+)+ will backslash \ before an operator turns it to standard character \*, \?, \+, … 55

56 Ambiguity Consider the two definitions: – if = if – id = letter_ (letter_ | digit)* The string “if” is valid for the pattern if and also for the pattern id… so what should it be? How about the string “iffy”? – Is it an identifier? Or an “if” followed by the identifier “fy”? Convention: – Always find longest matching token – Break ties using order of definitions… first definition wins (=> list rules for keywords before identifiers) 56

57 Creating a lexical analyzer Input – List of token definitions (pattern name, regular-expression) – String to be analyzed Output – List of tokens How do we build an analyzer? 57

58 Character classification #define is_end_of_input(ch) ((ch) == ‘\0’); #define is_uc_letter(ch) (‘A’<= (ch) && (ch) <= ‘Z’) #define is_lc_letter(ch) (‘a’<= (ch) && (ch) <= ‘z’) #define is_letter(ch) (is_uc_letter(ch) || is_lc_letter(ch)) #define is_digit(ch) (‘0’<= (ch) && (ch) <= ‘9’) … 58

59 Main reading routine void get_next_token() { do { char c = getchar(); switch(c) { case is_letter(c) : return recognize_identifier(c); case is_digit(c) : return recognize_number(c); … } while (c != EOF); 59

60 But we have a much better way! Generate a lexical analyzer automatically from token definitions Main idea – Use finite-state automata to match regular expressions 60

61 Overview Produce an finite-state automaton from a regular expression (automatically). Simulate a final-state automaton on a computer (automatically). Immediately obtain a lexical analyzer. Let’s recall material from the Automata course… 61

62 Reminder: Finite-State Automaton Deterministic automaton M = ( ,Q, ,q 0,F) –  - alphabet – Q – finite set of state – q 0  Q – initial state – F  Q – final states – δ : Q    Q - transition function 62

63 Reminder: Finite-State Automaton Non-Deterministic automaton M = ( ,Q, ,q 0,F) –  - alphabet – Q – finite set of state – q 0  Q – initial state – F  Q – final states – δ : Q  (   {  }) → 2 Q - transition function Possible  -transitions For a word w, M can reach a number of states or get stuck. If some reached state is final, M accepts w. 63

64 Identifying Patterns = Lexical Analysis Step 1: remove shortcuts and obtain pure regular expressions R 1 …R m for the m patterns. Step 2: construct an NFA M i for each regular expression R i Step 3: combine all Mi into a single NFA Step 4: convert the NFA into a DFA DFA is ready to identify the patterns. Ambiguity resolution: prefer longest accepting word 64

65 A Comment In the Automata course you study of automata as identifiers only: is input in the language or not? But when you run an automaton on an input there is no reason to not gather information along the way. – E.g., letters read from input so far, line number in the code, etc. 65

66 Building NFA: Basic constructs 66 R =  R =  R = a a

67 Building NFA: Composition 67 R = R 1 | R 2  M1 M2    R = R 1 R 2  M1M2  The starting and final states in the original automata become regular states after the composition

68 Building NFA: Repetition 68 R = R1*  M1   

69 Use of Automata Naïve approach: try each automaton separately Given a word w: – Try M1(w) – Try M2(w) – … – Try Mn(w) Requires resetting after every attempt. A more efficient method: combine all automata into one. 69

70 Combine automata: an example. Combine a, abb, a*b+, abab. 70 1 2 a a 3 a 4 b 5 b 6 abb 7 8 b a*b+ ba 9 a 10 b 11 a 12 b 1313 abab 0    

71 Ambiguity resolution Longest word Tie-breaker based on order of rules when words have same length. – Namely, if an accepting state has two labels then we can select one of them according to the rule priorities. Recipe – Turn NFA to DFA – Run until stuck, remember last accepting state, this is the token to be returned. 71

72

73

74 Now let’s return to the previous example…

75 Corresponding DFA 75 0 1 3 7 9 8 7 b a a 2 4 7 10 a b b 6 8 5 8 11 b 12 13 a b b abb a*b+ abab a

76 Examples 76 0 1 3 7 9 8 7 b a a 2 4 7 10 a b b 6868 5 8 11 b 12 13 a b b abb a*b+ abab a abaa: gets stuck after aba in state 12, backs up to state (5 8 11) pattern is a*b+, token is ab abba: stops after second b in (6 8), token is abb because it comes first in spec b b

77 Summary of Construction Developer describes the tokens as regular expressions (and decides which attributes are saved for each token). The regular expressions are turned into a deterministic automata (a transition table) that describes the expressions and specifies which attributes to keep. The lexical analyzer simulates the run of an automata with the given transition table on any input string. 77

78 Good News All of this construction is done automatically for you by common tools. Lex automatically generates a lexical analyzer from declaration file. Advantages: a short declaration, easily verified, easily modified and maintained. 78 lex Declaration file Lexical Analysis characters tokens Intuitively: Lex builds a DFA table, The analyzer simulates the DFA on a given input.

79 Summary Lexical analyzer – Turns character stream into token stream – Tokens defined using regular expressions – Regular expressions -> NFA -> DFA construction for identifying tokens – Automated constructions of lexical analyzer using lex 79 Lex will be presented in the exercise.

80 Coming up next time Syntax analysis 80


Download ppt "Theory of Compilation 236360 Erez Petrank Lecture 1: Introduction, Lexical Analysis 1."

Similar presentations


Ads by Google