CSC 330 Lecture Notes Week 6
Operational Semantics of Imperative Programming Languages
Topics from Chapters 4 & 5 of the Book
/* * This is the simplest possible executable program. The result should be a * value of 10 in location 0 of static memory. */ int i; void main() { i = 10; }is that the variable i is assigned the value of 10, which is represented by the following post-execution memory dump
Static Pool: Location 0: 10 Stack: empty
/* * This is a very simple test program for a function call. The result should * be a value of 3 in static memory location 0. Test the program with * EJayInterpreterTest.java. */ int i; void main() { f(3); } int f(int x) { i = x; }
StaticPool: Level 0 symtab: 0 (i's address): i, int, mem loc: 0 Stack: empty (main?) f, int, Formals: i Level 1 symtab: x, int, mem loc: 0 Body: "i = x;"
evalFuncCall 13 lines of code, excluding comments evalFuncIdent 13 lines, including 11 lines of error handling lookup error bind 21 lines, including 8 of error handling bind1 11 lines, including 4 of error handling evalFormalLValue 4 lines, very similar to evalIdentLValue lookup LValue evalExpr evalFuncBody 8 excruciatingly elegant lines of code eval the same 'ol thing evalReturn 2 stunningly simple lines of code eval ReturnValue class ReturnValue ------> RuntimeException Value ReturnValue(Value)
waldorf% jdb EJayInterpreterTest func-return.ej > stop in EJayInterpreter.evalReturn > run EJayInterpreterTest sample-test-files/func-return.ej Breakpoint hit: EJayInterpreter.evalReturn(), line=452 > where [1] EJayInterpreter.evalReturn (EJayInterpreter.java:452) [2] EJayInterpreter.evalStmt (EJayInterpreter.java:129) [3] EJayInterpreter.eval (EJayInterpreter.java:72) [4] EJayInterpreter.evalStmtList (EJayInterpreter.java:96) [5] EJayInterpreter.eval (EJayInterpreter.java:68) [6] EJayInterpreter.evalStmt (EJayInterpreter.java:135) [7] EJayInterpreter.eval (EJayInterpreter.java:72) [8] EJayInterpreter.evalFuncBody (EJayInterpreter.java:374) [9] EJayInterpreter.evalFuncCall (EJayInterpreter.java:316) [10] EJayInterpreter.evalExpr (EJayInterpreter.java:511) [11] EJayInterpreter.evalAssmnt (EJayInterpreter.java:150) [12] EJayInterpreter.evalStmt (EJayInterpreter.java:117) [13] EJayInterpreter.eval (EJayInterpreter.java:72) [14] EJayInterpreter.evalStmtList (EJayInterpreter.java:96) [15] EJayInterpreter.eval (EJayInterpreter.java:68) [16] EJayInterpreter.evalStmt (EJayInterpreter.java:135) [17] EJayInterpreter.eval (EJayInterpreter.java:72) [18] EJayInterpreter.evalFuncBody (EJayInterpreter.java:374) [19] EJayInterpreter.evalFuncCall (EJayInterpreter.java:316) [20] EJayInterpreter.evalStmt (EJayInterpreter.java:126) [21] EJayInterpreter.eval (EJayInterpreter.java:72) [22] EJayInterpreterTest.main (EJayInterpreterTest.java:35)
int i; int[10] a; void main() { a[0] = 0; a[3] = 3; i = 3; print "a[i] = ", a[i]; }
i 0: 3 a 1: -----> 0: undef 1: undef 2: undef 3: 3 4: undef ...
int[10] a; int[10][10][10] a3; void main() { a[3] = 3; a3[3][3][3] = a[3]; }
a 0: ----------------------------------------------------> 0: undef a3 1: -----> 0: undef 1: undef 1: undef 2: undef 2: undef 3: 3 3: -----------> 0: undef ... 4: undef 1: undef ... 2: undef 3: -----------> 0: undef 1: undef 2: undef 3: 3 ...
struct {int f1; float f2; string f3;} s; void main() { s.f1 = 1; s.f2 = 1.5; s.f3 = "abc"; }
s 0: ----------> 0: 1 1: 1.5 2: "abc"
val ------------> 0: 1 1: 1.5 2: "abc" type -------------> TypeNode.child1 -----> field list TypeNode.symtab -----> symtab, field offsets
int i,j; void main() { i = 10; j = 20; swap(i,j); } void swap(int x, int y) { int temp; temp = x; x = y; y = temp; }
int i,j; void swap(int* x, int* y) { int temp; temp = *x; *x = *y; *y = temp; } int main() { i = 10; j = 20; swap(&i, &j); }
int i,j; void main() { i = 10; j = 20; swap(i,j); } void swap(ref int x, ref int y) { int temp; temp = x; x = y; y = temp; }