Presentation is loading. Please wait.

Presentation is loading. Please wait.

Virtual Machines and Compilers Discrete Mathematics and Its Applications Baojian Hua

Similar presentations


Presentation on theme: "Virtual Machines and Compilers Discrete Mathematics and Its Applications Baojian Hua"— Presentation transcript:

1 Virtual Machines and Compilers Discrete Mathematics and Its Applications Baojian Hua bjhua@ustc.edu.cn

2 Our Goal We ’ ve defined miniC and miniPentium and written some sample programs Store them in memory But how to run these miniC and miniPentium programs? At least two approaches: Compile (translate) them to real Pentium Design and implement virtual machines we discuss this first

3 What ’ s a Virtual Machine? A virtual machine (VM) is machine which built with software to execute programs like a real machine Long history: Date back at least to 70 ’ s last century the Pascal P-Code, etc. Renew industry ’ s interest in the recent decade Sun ’ s JVM and Microsoft ’ s CLR, etc.

4 In Picture Programs VM Programs

5 Why VM Important? Portability: VM is relatively high-level Easy to port to different machines Managed code: Easy to control the behavior of program many may be hard to implement on real machine

6 CVM A virtual machine to run miniC programs (CVM) CVM = (store, prog) prog is a miniC program (in assignment #2) store is a machine memory, essentially a mapping from identifiers to numbers store: id -> n

7 An Example Right hand are a sample program and a store Store could be read and written store (id) store [id |-> n] x z y x = 8; y = 9; z = x+y; print (z);

8 Execution x = 8; y = 9; z = x+y; print (z);

9 Execution 8 x x = 8; y = 9; z = x+y; print (z);

10 Execution 8 9 x y x = 8; y = 9; z = x+y; print (z);

11 Execution 8 9 17 x z y x = 8; y = 9; z = x+y; print (z);

12 Execution 8 9 17 x z y x = 8; y = 9; z = x+y; print (z); // print “ 17 ” on screen terminated with a new line

13 Formalization We need three relations: (store, exp) -> v (store, stm) -> store’ (store, prog) -> store’ More specifically, we write them as functions: E(st, e) = v S(st, s) = st’ P(st, p) = st’ The definitions follows in next slides:

14 Formalization E(st, num) = num E(st, id) = st (id) E(st, e1+e2) = E(st, e1) + E(st, e2) E(st, e1-e2) = E(st, e1) - E(st, e2) E(st, e1*e2) = E(st, e1) * E(st, e2) S(st, id=e) = st [id |-> E(st, e)] S(st, print(e)) = st // print E(st, e) P(st, stm prog) = P(S(st, stm), prog) P(st, stm) = S(st, stm)

15 Execution // we denote store as {x1|->n1, x2|->n2, …} P({}, x=8; y=9; z=x+y; print(z))

16 Execution P({}, x=8; y=9; z=x+y; print(z)) => P(S({}, x=8), y=9; z=x+y; print(z))

17 Execution P({}, x=8; y=9; z=x+y; print(z)) => P(S({}, x=8), y=9; z=x+y; print(z)) => P({}[x |-> E({}, 8)], y=9; z=x+y; print(z))

18 Execution P({}, x=8; y=9; z=x+y; print(z)) => P(S({}, x=8), y=9; z=x+y; print(z)) => P({}[x |-> E({}, 8)], y=9; z=x+y; print(z)) => P({}[x |-> 8], y = 9; z=x+y; print(z))

19 Execution P({}, x=8; y=9; z=x+y; print(z)) => P(S({}, x=8), y=9; z=x+y; print(z)) => P({}[x |-> E({}, 8)], y=9; z=x+y; print(z)) => P({}[x |-> 8], y = 9; z=x+y; print(z)) => P({x|->8}, y=9; z=x+y; print(z))

20 Execution P({}, x=8; y=9; z=x+y; print(z)) => P(S({}, x=8), y=9; z=x+y; print(z)) => P({}[x |-> E({}, 8)], y=9; z=x+y; print(z)) => P({}[x |-> 8], y = 9; z=x+y; print(z)) => P({x|->8}, y=9; z=x+y; print(z)) => // the rest leave to you

21 CVM in C

22 What ’ s a Store? // Just an ADT, :-) // file “store.h” #ifndef STORE_H #define STORE_H typdef struct store *store; store newStore (); // st[id |-> n] void storeUpdate (store st, str id, nat n); // st(id) nat storeLookup (store st, str id); #endif

23 What ’ s a Store? // file “store.c” #include “linkedList.h” #include “store.h” struct store { linkedList list; // any representation works :-) }; // functions are straightforward (x, 8)(y, 9)(z, 17)

24 CVM Interface in C // file “cvm.h” #ifndef CVM_H #define CVM_H #include “miniC.h” void cvmRun (prog p); #endif

25 CVM Implementation in C // file “cvm.c” #include “miniC.h” #include “store.h” // the memory #include “cvm.h” void cvmRun (prog p) { store st = newStore (); while (p not empty) { stm = …; // take one statement from p; runStm (st, stm); } return; }

26 CVM Implementation in C // file “cvm.c” continued void runStm (store st, stm s) { switch (s->kind){ case ASSIGN: { // x = e; nat n = runExp (st, e); storeUpdate (st, x, n); break; } case PRINT: { // print (e) … } }}

27 CVM Implementation in C // file “cvm.c” continued nat runExp (store st, exp e) { switch (e->kind){ case ADD: { // e1 + e2; nat n1 = runExp (st, e1); nat n2 = runExp (st, e2); nat n = n1+n2; return n; } case … : // other cases are similar }

28 Client Code #include “miniC.h” #include “cvm.h” int main() { // build the syntax tree for: // p = “x = 8; y = 9; z = x+y; print(z);” cvmRun (p); return 0; }

29 PVM---miniPentium VM The design and implementation of a virtual machine PVM for miniPentium is similar Some modules may be even reused say the “ store ” module And also, the Java implementation for CVM and PVM is similar All leave to you

30 Stack Machine

31 What ’ s a Stack Machine? A stack machine has few (if no) registers, and all computation is done on a stack hence the name popular in 60-70 ’ last century, but rare now What ’ s the pros and cons of it? Answer this after we implement it

32 Stack Machine for CVM SCVM (Stack-based C Virtual Machine) SCVM is a triple: (store, stack, prog) the new part is a stack Operations on stack: push, pop +, -, *, print (all implicit call pop) +: push(stk, pop(stk)+pop(stk))

33 Formalization We need three relations: (store, stack, exp) -> stack’ (store, stack, stm) -> store’ (store, stack, prog) -> store’ More specifically, we write them as functions: E(st, stk, e) = stk’ S(st, stk, s) = st’ P(st, stk, p) = st’ The definitions follows in next slides:

34 Formalization E(st, stk, num) = push(stk, num) E(st, stk, id) = push(stk, st (id)) E(st, stk, e1+e2) = E(st, stk, e1); E(st, stk, e2); + E(st, stk, e1-e2) = E(st, stk, e1); E(st, stk, e2); - E(st, stk, e1*e2) = E(st, stk, e1); E(st, stk, e2); * S(st, stk, id=e) = st [id |->(E(st, e); pop(stk)] S(st, stk, print(e)) = st // print E(st, stk, e) P(st, stk, stm prog) = P(S(st, stm), stk, prog) P(st, stk, stm) = S(st, stk, stm)

35 An Example Right hand are a sample program, a store and a stack x z y x = 8; y = 9; z = x+y; print (z); top

36 Execution x = 8; y = 9; z = x+y; print (z); #### top

37 Execution x = 8; y = 9; z = x+y; print (z); #### top 8

38 Execution 8 x x = 8; y = 9; z = x+y; print (z); #### top

39 Execution 8 x x = 8; y = 9; z = x+y; print (z); #### top 9

40 Execution 8 9 x y x = 8; y = 9; z = x+y; print (z); #### top

41 Execution 8 9 x y x = 8; y = 9; z = x+y; print (z); #### top 8

42 Execution 8 9 x y x = 8; y = 9; z = x+y; print (z); #### top 8 9

43 Execution 8 9 x y x = 8; y = 9; z = x+y; print (z); #### top 17

44 Execution 8 9 17 x z y x = 8; y = 9; z = x+y; print (z); #### top

45 Execution 8 9 17 x z y x = 8; y = 9; z = x+y; print (z); #### top 17

46 Execution 8 9 17 x z y x = 8; y = 9; z = x+y; print (z); // print “ 17 ” on screen terminated with a new line #### top

47 Implementation It ’ s relatively straightforward to implement all these above stuffs Leave to you A stack-based virtual machine for miniPentium (SPVM) is similar However, some instructions should be revised to make the stack operations explicit

48 Stack Machine Summary Tow machine models: register machines (CVM, PVM) stack machines (SCVM, SPVM) What are the pros and cons of stack machines and register machines? Why real machines are register-based? Say: Pentium, MIPS, ARM, … Why virtual machines are stack-based? Say: P-Code, JVM, CLR, …

49 A Compiler miniVC from miniC to miniPentium

50 What ’ s a Compiler? A compiler is a program that takes as input programs written in one (typically high-level) language, and output equivalent programs written in another (typically low-level) language High-level Programs Low-level Programs Compiler

51 In Picture Programs VM Programs Compiler Compiler1 Compiler2

52 Relation The relation is: miniVC: miniC -> miniPentium Defined via three code translation functions: P, S and E miniCminiPentium miniVC

53 Formalization P(stm prog) = S(stm) P(prog) P(stm) = S(stm) S(x=e) = E(e) movl result, x S(print(e)) = E(e) print result

54 Formalization E(id) = movl id, result E(num) = movl num, result E(e1+e2) = E(e1) movl result, t_1 // t1 is fresh E(e2) movl result, t_2 // t2 is fresh addl t2, t1 movl t1, result

55 Example x = 8; y = 9; z = x+y; print (z);

56 Example P( x=8; y=9; z = x+y; print (z); ) = S(x=8) P( y=9; z=x+y; print (z); )

57 Example P( x=8; y=9; z = x+y; print (z); ) = S(x=8) P( y=9; z=x+y; print (z); )

58 Example P( x=8; y=9; z = x+y; print (z); ) = S(x=8) P( y=9; z=x+y; print (z); ) S(x=8) = E(8) movl result, x

59 Example P( x=8; y=9; z = x+y; print (z); ) = S(x=8) P( y=9; z=x+y; print (z); ) S(x=8) = E(8) movl result, x

60 Example P( x=8; y=9; z = x+y; print (z); ) = S(x=8) P( y=9; z=x+y; print (z); ) S(x=8) = E(8) movl result, x S(x=8) = movl 8, result movl result, x

61 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x P( y=9; z=x+y; print (z); )

62 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x P( y=9; z=x+y; print (z); )

63 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x S( y=9;) P (z=x+y; print (z); )

64 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x movl 9, result movl result, y P(z=x+y; print (z); )

65 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x movl 9, result movl result, y S(z=x+y; ) P(print (z); )

66 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x movl 9, result movl result, y E(x) movl result, t_1 E(y) movl result, t_2 addl t2, t1 movl t1, result P(print (z); )

67 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x movl 9, result movl result, y movl x, result movl result, t_1 movl y, result movl result, t_2 addl t2, t1 movl t1, result P(print (z); )

68 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x movl 9, result movl result, y movl x, result movl result, t_1 movl y, result movl result, t_2 addl t2, t1 movl t1, result P(print (z); )

69 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x movl 9, result movl result, y movl x, result movl result, t_1 movl y, result movl result, t_2 addl t2, t1 movl t1, result S(print (z); )

70 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x movl 9, result movl result, y movl x, result movl result, t_1 movl y, result movl result, t_2 addl t2, t1 movl t1, result E(z) print result

71 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x movl 9, result movl result, y movl x, result movl result, t_1 movl y, result movl result, t_2 addl t2, t1 movl t1, result movl z, result print result

72 Example P( x=8; y=9; z = x+y; print (z); ) = movl 8, result movl result, x movl 9, result movl result, y movl x, result movl result, t_1 movl y, result movl result, t_2 addl t2, t1 movl t1, result movl z, result print result

73 miniVC in C

74 Interface // file “miniVC.h” #ifndef MINIVC_H #define MINIVC_H #include “miniC.h” #include “miniPentium.h” miniPentium miniVC (miniC p); #endif

75 Implementation // file “miniVC.c” #include “linkedList.h” #include “miniVC.h” static linkedList pool; // any rep’ will do miniPentuim miniVC (miniC p) { while (p not empty){ stm s = …; // take one statement from p; compileStm (s); } return …; // return the Pentium program }

76 Implementation // file “miniVC.c” contiuned void compileStm (stm s) { switch (s->kind){ case ASSIGN: { // x = e; compileExp (e); enterPool (movl result, x); break; } case …; }

77 Implementation // file “miniVC.c” contiuned void compileExp (exp e){ switch (e->kind){ case ADD: { // e1 + e2; compileExp (e1); enterPool (movl result, t_1); compileExp (e2); enterPool (movl result, t_2); enterPool (addl t2, t1); enterPool (movl t1, result); break; } case …; }}

78 Client Code #include “miniC.h” #include “miniPentium.h” #include “miniVC.h” int main() { // build the syntax tree for: // p = “x = 8; y = 9; z = x+y; print(z);” cvm (p); // print out 17 miniPentium q = compile (p); pvm (q); // print out 17 return 0; }

79 Rest of the Story Type checker: Not all programs are meaningful Ex: y=x; print (y); Statically check whether a program is valid Optimizer: The output of a compiler may be stupid Ex: too many movs, :-( Decrease space use and increase performance Generate real Pentium code Which called JIT: Just-In-Time compiler (a hot research field) All leave to you


Download ppt "Virtual Machines and Compilers Discrete Mathematics and Its Applications Baojian Hua"

Similar presentations


Ads by Google