Fall 2005 Lecture 1: Introduction Intro. to Computer Language Engineering Course Administration info. Outline • Course Administration Information • Introduction to computer language engineering – What are compilers? – Why should we learn about them? – Anatomy of a compiler Saman Amarasinghe 2 6.035 ©MIT Fall 1998 Course Administration • • • • • • Staff Text Course Outline The Project Project Groups Grading Saman Amarasinghe 3 6.035 ©MIT Fall 1998 Staff • Lecturers – Prof. Saman Amarasinghe – Prof. Martin Rinard Saman Amarasinghe 4 6.035 ©MIT Fall 1998 Optional Textbooks Tiger • Modern Compiler Implementation in Java by A.W. Appel Book Cambridge University Press, 1998 Whale • Advanced Compiler Design and Implementation by Steven Muchnick Book Morgan Kaufman Publishers, 1997 Dragon Book • Compilers -- Principles, Techniques and Tools by Aho, Sethi and Ullman Addison-Wesley, 1988 Saman Amarasinghe 5 6.035 ©MIT Fall 1998 The Five Segments n Lexical and Syntax Analysis o Semantic Analysis p Code Generation q Data-flow Optimizations r Instruction Optimizations Saman Amarasinghe 6 6.035 ©MIT Fall 1998 Each Segment... • Segment Start – Project Description • Lectures – 2 to 4 lectures • • • • Project Time (Project checkpoint) Project Time Project Due Saman Amarasinghe 7 6.035 ©MIT Fall 1998 Project Groups • Each project group consists of 3 to 4 students • Grading – All group members (mostly) get the same grade Saman Amarasinghe 8 6.035 ©MIT Fall 1998 Weekly Group Meeting with the TA • TA will schedule a weekly 30 minute slot • The group will get to: – – – – Ask questions about the project Discuss design decisions Describe what each person is doing Answer questions the TA has about the project • TA will use this to measure individual contribution to the project Æ be there! Saman Amarasinghe 9 6.035 ©MIT Fall 1998 Grades • Compiler project 58% • Paper Discussion 12% (3% each) • In-class Quizzes 30% (10% each) Saman Amarasinghe 10 6.035 ©MIT Fall 1998 Grades for the Project – – – – – Scanner/Parser Semantic Checking Code Generation Data-flow Opt. Instruction Opt. Saman Amarasinghe 10% 10% 14% 12% 12% 58% 11 6.035 ©MIT Fall 1998 The Quiz • Three Quizzes • In-Class Quiz – 50 Minutes (be on time!) – Open book, open notes Saman Amarasinghe 12 6.035 ©MIT Fall 1998 Paper Discussions • Will be giving out 3 papers • Read the paper, think about… – – – – – – – Do you like the research? What is the context of the research? Did anything surprise you about the paper? Do the results allow you to evaluate the proposed technique? Do the authors understand the wider ramifications of their research? How have things changed since the paper was written? How important will the research be in the future? • Write a 150 to 200 word summary of the paper. • Will schedule a one-on-one (15 or 20 minute) meeting with a professor or a TA to talk about the paper. Saman Amarasinghe 13 6.035 ©MIT Fall 1998 Outline • Course Administration Information • Introduction to computer language engineering – What are compilers? – Why should we learn about them? – Anatomy of a compiler Saman Amarasinghe 14 6.035 ©MIT Fall 1998 What is Computer Language Engineering 1. How to give instructions to a computer 2. How to make the computer carryout the instructions efficiently Saman Amarasinghe 15 6.035 ©MIT Fall 1998 Power of a Language • Can use to describe any action – Not tied to a “context” • Many ways to describe the same action – Flexible Saman Amarasinghe 16 6.035 ©MIT Fall 1998 How to instruct a computer • How about natural languages? – – – – English?? “Open the pod bay doors, Hal.” “I am sorry Dave, I am afraid I cannot do that” We are not there yet!! • Natural Languages: – Same expression describes many possible actions – Ambiguous Saman Amarasinghe 17 6.035 ©MIT Fall 1998 How to instruct a computer • How about natural languages? – – – – English?? “Open the pod bay doors, Hal.” “I am sorry Dave, I am afraid I cannot do that” We are not there yet!! • Use a programming language – Examples: Java, C, C++, Pascal, BASIC, Scheme Saman Amarasinghe 18 6.035 ©MIT Fall 1998 Programming Languages • Properties – – – – need to be precise need to be concise need to be expressive need to be at a high-level (lot of abstractions) Saman Amarasinghe 19 6.035 ©MIT Fall 1998 High-level Abstract Description to Low-level Implementation Details My poll ratings are low, lets invade a small nation President Cross the river and take defensive positions General Forward march, turn left Stop!, Shoot Sergeant Foot Soldier Saman Amarasinghe 20 Figures by MIT OCW. 6.035 ©MIT Fall 1998 1. How to instruct the computer • Write a program using a programming language – High-level Abstract Description • Microprocessors talk in assembly language – Low-level Implementation Details Program written in a Programming Languages Saman Amarasinghe Compiler 21 Assembly Language Translation 6.035 ©MIT Fall 1998 1. How to instruct the computer • Input: High-level programming language • Output: Low-level assembly instructions • Compiler has to: – – – – Read and understand the program Precisely determine what actions it require Figure-out how to carry-out those actions Instruct the computer to carry out those actions Saman Amarasinghe 22 6.035 ©MIT Fall 1998 Example (input program) int expr(int n) { int d; d = 4 * n * n * (n + 1) * (n + 1); return d; } Saman Amarasinghe 23 6.035 ©MIT Fall 1998 Example (Output assembly code) lda $30,-32($30) stq $26,0($30) stq $15,8($30) bis $30,$30,$15 bis $16,$16,$1 stl $1,16($15) lds $f1,16($15) sts $f1,24($15) ldl $5,24($15) bis $5,$5,$2 s4addq $2,0,$3 ldl $4,16($15) mull $4,$3,$2 ldl $3,16($15) addq $3,1,$4 mull $2,$4,$2 ldl $3,16($15) addq $3,1,$4 mull $2,$4,$2 stl $2,20($15) ldl $0,20($15) br $31,$33 $33: bis $15,$15,$30 ldq $26,0($30) ldq $15,8($30) addq $30,32,$30 ret $31,($26),1 Saman Amarasinghe 24 6.035 ©MIT Fall 1998 Efficient Execution of the Actions Cross the river and take defensive positions General Sergeant Foot Soldier Saman Amarasinghe 25 Figures by MIT OCW. 6.035 ©MIT Fall 1998 Efficient Execution of the Actions Cross the river and take defensive positions General Where to cross the river? Use the bridge upstream or surprise the enemy by crossing downstream? How do I minimize the casualties?? Sergeant Foot Soldier Figures by MIT OCW. Saman Amarasinghe 26 6.035 ©MIT Fall 1998 Efficient Execution of the Actions My poll ratings are low, lets invade a small nation President Russia or Bermuda? Or just stall for his poll numbers to go up? General Figures by MIT OCW. Saman Amarasinghe 27 6.035 ©MIT Fall 1998 Efficient Execution of the Actions • Mapping from High to Low – Simple mapping of a program to assembly language produces inefficient execution – Higher the level of abstraction ⇒ more inefficiency • If not efficient – High-level abstractions are useless • Need to: – provide a high level abstraction – with performance of giving low-level instructions Saman Amarasinghe 28 6.035 ©MIT Fall 1998 Example int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + b*y; } return x; } Saman Amarasinghe 29 6.035 ©MIT Fall 1998 test: subu $fp, 16 sw zero, 0($fp) sw zero, 4($fp) sw zero, 8($fp) lab1: mul $t0, $a0, 4 div $t1, $t0, $a1 lw $t2, 8($fp) mul $t3, $t1, $t2 lw $t4, 8($fp) addui$t4, $t4, 1 lw $t5, 8($fp) addui$t5, $t5, 1 mul $t6, $t4, $t5 addu $t7, $t3, $t6 lw $t8, 0($fp) add $t8, $t7, $t8 sw $t8, 0($fp) lw $t0, 4($fp) mul $t1, $t0, a1 lw $t2, 0($fp) add $t2, $t2, $t1 sw $t2, 0($fp) lw $t0, 8($fp) addui $t0, $t0, 1 sw $t0, 8($fp) ble $t0, $a3, lab1 lw $v0, 0($fp) addu $fp, 16 b $ra Saman Amarasinghe 45 # # # # # # # # # # # # # # # # x = 0 y = 0 i = 0 for(i=0;i<N; i++) a*4 a*4/b i a*4/b*i i i+1 i i+1 (i+1)*(i+1) a*4/b*i + (i+1)*(i+1) x x = x + a*4/b*i + (i+1)*(i+1) # # # # y b*y x x = x + b*y # i # i+1 30 6.035 ©MIT Fall 1998 Lets Optimize... int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + b*y; } return x; } Saman Amarasinghe 31 6.035 ©MIT Fall 1998 Constant Propagation int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + b*y; } return x; } Saman Amarasinghe 32 6.035 ©MIT Fall 1998 Constant Propagation int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + b*y; } return x; } Saman Amarasinghe 33 6.035 ©MIT Fall 1998 Constant Propagation int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + b*y; } return x; } Saman Amarasinghe 34 6.035 ©MIT Fall 1998 Constant Propagation int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + b*y; } return x; } Saman Amarasinghe 35 6.035 ©MIT Fall 1998 Constant Propagation int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + b*0; } return x; } Saman Amarasinghe 36 6.035 ©MIT Fall 1998 Algebraic Simplification int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + b*0; } return x; } Saman Amarasinghe 37 6.035 ©MIT Fall 1998 Algebraic Simplification int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + b*0; } return x; } Saman Amarasinghe 38 6.035 ©MIT Fall 1998 Algebraic Simplification int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + 0; } return x; } Saman Amarasinghe 39 6.035 ©MIT Fall 1998 Algebraic Simplification int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + 0; } return x; } Saman Amarasinghe 40 6.035 ©MIT Fall 1998 Algebraic Simplification int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x + 0; } return x; } Saman Amarasinghe 41 6.035 ©MIT Fall 1998 Algebraic Simplification int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x; } return x; } Saman Amarasinghe 42 6.035 ©MIT Fall 1998 Copy Propagation int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); x = x; } return x; } Saman Amarasinghe 43 6.035 ©MIT Fall 1998 Copy Propagation int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); } return x; } Saman Amarasinghe 44 6.035 ©MIT Fall 1998 Common Subexpression Elimination int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); } return x; } Saman Amarasinghe 45 6.035 ©MIT Fall 1998 Common Subexpression Elimination int sumcalc(int a, int b, int N) { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1); } return x; } Saman Amarasinghe 46 6.035 ©MIT Fall 1998 Common Subexpression Elimination int sumcalc(int a, int b, int N) { int i; int x, y, t; x = 0; y = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + (4*a/b)*i + (i+1)*(i+1); } return x; } Saman Amarasinghe 47 6.035 ©MIT Fall 1998 Common Subexpression Elimination int sumcalc(int a, int b, int N) { int i; int x, y, t; x = 0; y = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + (4*a/b)*i + t*t; } return x; } Saman Amarasinghe 48 6.035 ©MIT Fall 1998 Dead Code Elimination int sumcalc(int a, int b, int N) { int i; int x, y, t; x = 0; y = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + (4*a/b)*i + t*t; } return x; } Saman Amarasinghe 49 6.035 ©MIT Fall 1998 Dead Code Elimination int sumcalc(int a, int b, int N) { int i; int x, y, t; x = 0; y = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + (4*a/b)*i + t*t; } return x; } Saman Amarasinghe 50 6.035 ©MIT Fall 1998 Dead Code Elimination int sumcalc(int a, int b, int N) { int i; int x, y, t; x = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + (4*a/b)*i + t*t; } return x; } Saman Amarasinghe 51 6.035 ©MIT Fall 1998 Dead Code Elimination int sumcalc(int a, int b, int N) { int i; int x, t; x = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + (4*a/b)*i + t*t; } return x; } Saman Amarasinghe 52 6.035 ©MIT Fall 1998 Loop Invariant Removal int sumcalc(int a, int b, int N) { int i; int x, t; x = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + (4*a/b)*i + t*t; } return x; } Saman Amarasinghe 53 6.035 ©MIT Fall 1998 Loop Invariant Removal int sumcalc(int a, int b, int N) { int i; int x, t; x = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + (4*a/b)*i + t*t; } return x; } Saman Amarasinghe 54 6.035 ©MIT Fall 1998 Loop Invariant Removal int sumcalc(int a, int b, int N) { int i; int x, t, u; x = 0; u = (4*a/b); for(i = 0; i <= N; i++) { t = i+1; x = x + u*i + t*t; } return x; } Saman Amarasinghe 55 6.035 ©MIT Fall 1998 Strength Reduction int sumcalc(int a, int b, int N) { int i; int x, t, u; x = 0; u = (4*a/b); for(i = 0; i <= N; i++) { t = i+1; x = x + u*i + t*t; } return x; } Saman Amarasinghe 56 6.035 ©MIT Fall 1998 Strength Reduction int sumcalc(int a, int b, int N) { int i; int x, t, u; u*0, x = 0; u*1, u = (4*a/b); u*2, for(i = 0; i <= N; i++) { u*3, t = i+1; u*4, x = x + u*i + t*t; ... } return x; } Saman Amarasinghe 57 6.035 v=0, v=v+u, v=v+u, v=v+u, v=v+u, ... ©MIT Fall 1998 Strength Reduction int sumcalc(int a, int b, int N) { int i; int x, t, u, v; x = 0; u = (4*a/b); v = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + u*i + t*t; v = v + u; } return x; } Saman Amarasinghe 58 6.035 ©MIT Fall 1998 Strength Reduction int sumcalc(int a, int b, int N) { int i; int x, t, u, v; x = 0; u = (4*a/b); v = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + v + t*t; v = v + u; } return x; } Saman Amarasinghe 59 6.035 ©MIT Fall 1998 Strength Reduction int sumcalc(int a, int b, int N) { int i; int x, t, u, v; x = 0; u = (4*a/b); v = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + v + t*t; v = v + u; } return x; } Saman Amarasinghe 60 6.035 ©MIT Fall 1998 Strength Reduction int sumcalc(int a, int b, int N) { int i; int x, t, u, v; x = 0; u = (4*a/b); v = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + v + t*t; v = v + u; } return x; } Saman Amarasinghe 61 6.035 ©MIT Fall 1998 Strength Reduction int sumcalc(int a, int b, int N) { int i; int x, t, u, v; x = 0; u = ((a<<2)/b); v = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + v + t*t; v = v + u; } return x; } Saman Amarasinghe 62 6.035 ©MIT Fall 1998 Register Allocation fp Local variable X Local variable Y Local variable I Saman Amarasinghe 63 6.035 ©MIT Fall 1998 Register Allocation fp Local variable X Local variable Y Local variable I $t9 $t8 $t7 $t6 $t5 = = = = = X t u v i Saman Amarasinghe 64 6.035 ©MIT Fall 1998 Optimized Example int sumcalc(int a, int b, int N) { int i; int x, t, u, v; x = 0; u = ((a<<2)/b); v = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + v + t*t; v = v + u; } return x; } Saman Amarasinghe 65 6.035 ©MIT Fall 1998 test: subu add sll div add add $fp, $t9, $t0, $t7, $t6, $t5, lab1: addui$t8, mul $t0, addu $t1, addu $t9, 16 zero, zero $a0, 2 $t0, $a1 zero, zero zero, zero # # # # # x = 0 a<<2 u = (a<<2)/b v = 0 i = 0 $t5, 1 $t8, $t8 $t0, $t6 t9, $t1 # # # # # for(i=0;i<N; i++) t = i+1 t*t v + t*t x = x + v + t*t addu $6, $6, $7 # v = v + u addui$t5, $t5, 1 ble $t5, $a3, lab1 # i = i+1 addu $v0, $t9, zero addu $fp, 16 b $ra Saman Amarasinghe 66 6.035 ©MIT Fall 1998 Unoptimized Code Optimized Code test: test: subu sw sw sw $fp, 16 zero, 0($fp) zero, 4($fp) zero, 8($fp) mul div lw mul lw addui lw addui mul addu lw add sw lw mul lw add sw lw addui sw ble $t0, $t1, $t2, $t3, $t4, $t4, $t5, $t5, $t6, $t7, $t8, $t8, $t8, $t0, $t1, $t2, $t2, $t2, $t0, $t0, $t0, $t0, lw addu b $v0, 0($fp) $fp, 16 $ra lab1: $a0, 4 $t0, $a1 8($fp) $t1, $t2 8($fp) $t4, 1 8($fp) $t5, 1 $t4, $t5 $t3, $t6 0($fp) $t7, $t8 0($fp) 4($fp) $t0, a1 0($fp) $t2, $t1 0($fp) 8($fp) $t0, 1 8($fp) $a3, lab1 $fp, $t9, $t0, $t7, $t6, $t5, 16 zero, zero $a0, 2 $t0, $a1 zero, zero zero, zero addui mul addu addu addu addui ble $t8, $t5, 1 $t0, $t8, $t8 $t1, $t0, $t6 $t9, t9, $t1 $6, $6, $7 $t5, $t5, 1 $t5, $a3, lab1 addu addu b $v0, $t9, zero $fp, 16 $ra lab1: 4*ld/st + 2*add/sub + br + N*(9*ld/st + 6*add/sub + 4* mul + div + br) = 7 + N*21 Execution time = 43 sec Saman Amarasinghe subu add sll div add add 6*add/sub + shift + div + br + N*(5*add/sub + mul + br) = 9 + N*7 Execution time = 17 sec 67 6.035 ©MIT Fall 1998 Compilers Optimize Programs for… • • • • • • Performance/Speed Code Size Power Consumption Fast/Efficient Compilation Security/Reliability Debugging Saman Amarasinghe 68 6.035 ©MIT Fall 1998 Compilers help increase the level of abstraction • Programming languages – From C to OO-languages with garbage collection – Even more abstract definitions • Microprocessor – From simple CISC to RISC to VLIW to …. Saman Amarasinghe 69 6.035 ©MIT Fall 1998 Anatomy of a Computer Program written in a Programming Languages Saman Amarasinghe Compiler 70 Assembly Language Translation 6.035 ©MIT Fall 1998 Anatomy of a Computer Program (character stream) Lexical Analyzer (Scanner) Token Stream Saman Amarasinghe 71 6.035 ©MIT Fall 1998 Lexical Analyzer (Scanner) 2 3 4 * ( 1 1 + - 2 2 ) Num(234) mul_op lpar_op Num(11) add_op Num(-22) rpar_op 18..23 + val#ue Saman Amarasinghe 72 6.035 ©MIT Fall 1998 Lexical Analyzer (Scanner) 2 3 4 * ( 1 1 + - 2 2 ) Num(234) mul_op lpar_op Num(11) add_op Num(-22) rpar_op 18..23 + val#ue Variable names cannot have ‘#’ character Not a number Saman Amarasinghe 73 6.035 ©MIT Fall 1998 Anatomy of a Computer Program (character stream) Lexical Analyzer (Scanner) Token Stream Syntax Analyzer (Parser) Parse Tree Saman Amarasinghe 74 6.035 ©MIT Fall 1998 Syntax Analyzer (Parser) num ‘*’ ‘(‘ num ‘+’ num ‘)’ <expr> <expr> num <op> * <expr> <expr> ( <expr> <op> num Saman Amarasinghe 75 + ) <expr> num 6.035 ©MIT Fall 1998 Syntax Analyzer (Parser) int * foo(i, j, k)) int i; int j; Extra parentheses { for(i=0; i j) { fi(i>j) Missing increment return j; Not an expression } Not a keyword Saman Amarasinghe 76 6.035 ©MIT Fall 1998 Anatomy of a Computer Program (character stream) Lexical Analyzer (Scanner) Token Stream Syntax Analyzer (Parser) Parse Tree Semantic Analyzer Intermediate Representation Saman Amarasinghe 77 6.035 ©MIT Fall 1998 Semantic Analyzer int * foo(i, j, k) int i; int j; { int x; x = x + j + N; return j; } Saman Amarasinghe 78 Type not declared Mismatched return type Uninitialized variable used Undeclared variable 6.035 ©MIT Fall 1998 Anatomy of a Computer Program (character stream) Lexical Analyzer (Scanner) Token Stream Syntax Analyzer (Parser) Parse Tree Semantic Analyzer Intermediate Representation Code Optimizer Optimized Intermediate Representation Saman Amarasinghe 79 6.035 ©MIT Fall 1998 Optimizer int sumcalc(int a, int b, int N) int sumcalc(int a, int b, int N) { int i; int x, t, u, v; x = 0; u = ((a<<2)/b); v = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + v + t*t; v = v + u; } return x; } { int i; int x, y; x = 0; y = 0; for(i = 0; i <= N; i++) { x = x+4*a/b*i+(i+1)*(i+1); x = x + b*y; } return x; } Saman Amarasinghe 80 6.035 ©MIT Fall 1998 Anatomy of a Computer Program (character stream) Lexical Analyzer (Scanner) Token Stream Syntax Analyzer (Parser) Parse Tree Semantic Analyzer Intermediate Representation Code Optimizer Optimized Intermediate Representation Code Generator Assembly code Saman Amarasinghe 81 6.035 ©MIT Fall 1998 Code Generator int sumcalc(int a, int b, int N) { int i; int x, t, u, v; x = 0; u = ((a<<2)/b); v = 0; for(i = 0; i <= N; i++) { t = i+1; x = x + v + t*t; v = v + u; } return x; } Saman Amarasinghe 82 test: subu add sll div add add lab1: addui $fp, $t9, $t0, $t7, $t6, $t5, 16 zero, zero $a0, 2 $t0, $a1 zero, zero zero, zero $t8, $t5, 1 mul addu addu $t0, $t8, $t8 $t1, $t0, $t6 $t9, t9, $t1 addu $6, $6, $7 addui $t5, $t5, 1 ble $t5, $a3, lab1 addu addu b $v0, $t9, zero $fp, 16 $ra 6.035 ©MIT Fall 1998