Download
cse 3302 programming languages n.
Skip this Video
Loading SlideShow in 5 Seconds..
CSE 3302 Programming Languages PowerPoint Presentation
Download Presentation
CSE 3302 Programming Languages

CSE 3302 Programming Languages

6 Vues Download Presentation
Télécharger la présentation

CSE 3302 Programming Languages

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. CSE 3302 Programming Languages Control II Procedures and Environments Based on slides byChengkai Li Kelly Scott French University of Texas at Arlington 1 CSE3302 Programming Languages, UT-Arlington

  2. Procedures vs. Functions 2 • Function: • no side effect • return a value • Function call: expression • Procedure: • side effect, executed for it • no return value • Procedure call: statement • No clear distinction made in most languages • C/C++: void • Ada/FORTRAN/Pascal: procedure/function CSE3302 Programming Languages, UT-Arlington

  3. Syntax int f(int y); //declaration int f(int y){ //definition int x; x=y+1; return x; } int f(int y) { int x; x=y+1; return x; } 3 • Terminology: • body • specification interface or Signature • name • type of return value • parameters (names and types) CSE3302 Programming Languages, UT-Arlington

  4. Procedure Call 4 Caller: Callee: … int f(int y){ f(a); int x; … if (y==0) return 0; x=y+1; return x; } Control transferred from caller to callee, at procedure call Transferred back to caller when execution reaches the end of body Can return early CSE3302 Programming Languages, UT-Arlington

  5. Environment static(global) area stack automatically-allocated spaces (local variables, procedures (chapter 8) under the control of runtime system (unallocated) both for dynamic binding manually-allocated spaces under the control of programmer heap 5 Environment: binding from names to their attributes CSE3302 Programming Languages, UT-Arlington

  6. Activation Recordfor Nested Blocks x x y 6 • Activation record: memory allocated for the local objects of a block • Entering a block: activation record allocated • Exit from inner block to surrounding block: activation record released • int x; //global { int x,y; x = y*10; { int i; i = x/2; } } CSE3302 Programming Languages, UT-Arlington

  7. Activation Recordfor Nested Blocks x x y X: Nonlocal variable, in the surrounding activation record i 7 int x; //global { int x,y; x = y*10; { int i; i = x/2; } } CSE3302 Programming Languages, UT-Arlington

  8. Activation Recordfor Procedures x x y 8 int x; //global void B(void) { int i; i = x/2;} void A(void) { int x,y; x = y*10; B();} main() { A(); return 0; } CSE3302 Programming Languages, UT-Arlington

  9. Activation Recordfor Procedures x x x: global variable in defining environment y i Need to retain information in calling environment 9 int x; //global void B(void) { int i; i = x/2;} void A(void) { int x,y; x = y*10; B();} main() { A(); return 0; } CSE3302 Programming Languages, UT-Arlington

  10. Activation Recordfor Procedures int x; //global void B(void) { int i; i = x/2;} void A(void) { int x,y; x = y*10; B();} main() { A(); return 0; } i: local variable in called environment x: global variable in defining environment x x y x,y: local variable in calling environment i CSE3302 Programming Languages, UT-Arlington

  11. Activation Recordfor Procedures int x; //global void B(void) { int i; i = x/2;} void A(void) { int x,y; x = y*10; B();} main() { A(); return 0; } Can only access global variables in defining environment No direct access to the local variables in the calling environment (Need to communicate through parameters) x x y i CSE3302 Programming Languages, UT-Arlington

  12. Procedure Call • Caller: Callee: … int f(int a){ f(i); ...; … ...a...; ...; } actual parameter / argument formal parameter / argument Parameter Passing Mechanisms: • When and how to evaluate parameters • How actual parameter values are passed to formal parameters • How formal parameter values are passed back to actual parameters CSE3302 Programming Languages, UT-Arlington

  13. Parameter Passing Mechanisms • Pass/Call by Value • Pass/Call by Reference • Pass/Call by Value-Result • Pass/Call by Name CSE3302 Programming Languages, UT-Arlington

  14. Example • What is the result? void swap(int a, int b) { int temp; temp = a; a = b; b = temp;} main(){ int i=1, j=2; swap(i,j); printf(“i=%d, j=%d\n”, i, j); } • It depends… CSE3302 Programming Languages, UT-Arlington

  15. Pass by Value • Caller: Callee: … int f(int a){ f(i); ...a...; … } i a • Most common one • Replace formal parameters by the values of actual parameters • Actual parameters: No change • Formal parameters: Local variables (C, C++, Java, Pascal) CSE3302 Programming Languages, UT-Arlington

  16. Example: Pass By Value void swap(int a, int b) {int temp;temp = a; a = b; b = temp; } main(){ int i=1, j=2; swap(i,j); printf(“i=%d, j=%d\n”, i, j); } 1 i a 2 j b 1 1 i a 2 2 j b 1 2 i a 2 1 j b CSE3302 Programming Languages, UT-Arlington

  17. Are these Pass-by-Value? • C: void f(int *p) { *p = 0; } void f(int a[]) { a[0]=0; } • Java: void f(Vector v) { v.removeAll(); } Yes! CSE3302 Programming Languages, UT-Arlington

  18. Pass-by-Value: Pointers ? • C: void f(int *p) { *p = 0; } main() { int *q; q = (int *) malloc(sizeof(int)); *q = 1; f(q); printf("%d\n", q[0]); } q q 1 ? q 1 p q 1 p q 0 p CSE3302 Programming Languages, UT-Arlington

  19. Pass-by-Value: Pointers • C: void f(int *p) { p = (int *) malloc(sizeof(int)); *p = 0; } main() { int *q; q = (int *) malloc(sizeof(int)); *q = 1; f(q); printf("%d\n", q[0]); } • What happens here? CSE3302 Programming Languages, UT-Arlington

  20. Pass-by-Value: Arrays • C: void f(int p[]) { p[0] = 0;} main() { int q[10]; q[0]=1; f(q); printf("%d\n", q[0]); } • What happens here? CSE3302 Programming Languages, UT-Arlington

  21. Pass-by-Value: Arrays • C: void f(int p[]) { p=(int *) malloc(sizeof(int)); p[0] = 0; } main() { int q[10]; q[0]=1; f(q); printf("%d\n", q[0]); } • What happens here? CSE3302 Programming Languages, UT-Arlington

  22. Pass-by-Value: Java Objects • Java: void f(Vector v) { v.removeAll(); } main() { Vector vec; vec.addElement(new Integer(1)); f(vec); System.out.println(vec.size()); } • What happens here? CSE3302 Programming Languages, UT-Arlington

  23. Pass-by-Value: Java Objects • Java: void f(Vector v) { v = new Vector(); v.removeAll(); } main() { Vector vec; vec.addElement(new Integer(1)); f(vec); System.out.println(vec.size()); } • What happens here? CSE3302 Programming Languages, UT-Arlington

  24. Pass by Reference • Caller: Callee: … int f(int a){ f(i); ...a...; … } i a • Formal parameters become alias of actual parameters • Actual parameters: changed by changes to formal parameters • Examples: • Fortran: the only parameter passing mechanism • C++ (reference type, &) /Pascal (var) CSE3302 Programming Languages, UT-Arlington

  25. Example: Pass By Reference C++ syntax. Not valid in C void swap(int &a, int &b) {int temp;temp = a; a = b; b = temp; } main(){ int i=1, j=2; swap(i,j); printf(“i=%d, j=%d\n”, i, j); } 1 i a 2 j b 1 i a 2 j b 2 i a 1 j b CSE3302 Programming Languages, UT-Arlington

  26. Pass-by-Reference: How to minic it in C? • C: void f(int *p) { *p = 0; } main() { int q; q = 1; f(&q); printf(“%d\n”, q); } • It is really pass-by-value. Why? CSE3302 Programming Languages, UT-Arlington

  27. It is really pass-by-value • C: void f(int *p) { p = (int *) malloc(sizeof(int)); *p = 0; } main() { int q; q = 1; f(&q); printf(“%d\n”, q); } CSE3302 Programming Languages, UT-Arlington

  28. Pass-by-Reference: C++ Constant Reference • C++: void f(const int & p) { int a = p; p = 0; } main(){ int q; q = 1; f(q); printf("%d\n", q); } • What happens here? CSE3302 Programming Languages, UT-Arlington

  29. Pass-by-Reference: C++ Reference-to-Pointer • C++: void f(int * &p) { *p = 0; } main(){ int *q; int a[10]; a[0]=1; q=a; f(q); printf("%d, %d\n", q[0], a[0]); } • What happens here? CSE3302 Programming Languages, UT-Arlington

  30. Pass-by-Reference: C++ Reference-to-Pointer • C++: void f(int * &p) { p = new int; *p = 0; } main(){ int *q; int a[10]; a[0]=1; q=a; f(q); printf("%d, %d\n", q[0], a[0]); } • What happens here? CSE3302 Programming Languages, UT-Arlington

  31. Pass-by-Reference: C++ Reference-to-Array • C++: void f(int (&p)[10]) { p[0]=0; } main(){ int *q; int a[10]; a[0]=1; q = a; f(a); printf("%d, %d\n", q[0], a[0]); • What happens here? CSE3302 Programming Languages, UT-Arlington

  32. Pass by Value-Result • Caller: Callee: … int f(int a){ f(i); ...a...; … } i a i a • Combination of Pass-by-Value and Pass-by-Reference (Pass-by-Reference without aliasing) • Replace formal parameters by the values of actual parameters • Value of formal parameters are copied back to actual parameters CSE3302 Programming Languages, UT-Arlington

  33. Example: Pass By Value-Result void swap(int a, int b) {int temp;temp = a; a = b; b = temp; } main(){ int i=1, j=2; swap(i,j); printf(“i=%d, j=%d\n”, i, j); } 1 i a 2 j b 1 1 i a 2 2 j b 2 2 i a 1 1 j b CSE3302 Programming Languages, UT-Arlington

  34. Unspecified Issues void f(int a, int b) {a = 1; b = 2; } main(){ int i=0; f(i,i); printf(“i=%d\n”, i); } 0 0 i i a a b b 1 ? 2 CSE3302 Programming Languages, UT-Arlington

  35. Pass by Name • Caller: Callee: … int f(int a){ f(i); ...a...; … } • Actual parameters only evaluated when they are needed • The same parameter can be evaluated multiple times • Evaluated in calling environment • Essentially equivalent to normal order evaluation • Example: • Algol 60 • Not adopted by any major languages due to implementation difficulty CSE3302 Programming Languages, UT-Arlington

  36. Example: Pass By Name void swap(int a, int b) {int temp;temp = a; a = b; b = temp; } main(){ int i=1, j=2; swap(i,j); printf(“i=%d, j=%d\n”, i, j); } 1 a (i) temp 2 j 1 1 a (i) temp 2 b (j) 2 1 a (i) temp 2 b (j) CSE3302 Programming Languages, UT-Arlington

  37. Pass-by-Name: Side Effects int p[3]={1,2,3}; int i; void swap(int a, int b) {int temp;temp = a; a = b; b = temp; } main(){ i = 1; swap(i, p[i]); printf(“%d, %d\n”, i, p[i]); } • What happens here? CSE3302 Programming Languages, UT-Arlington

  38. Some Variants • Pass by Name • Evaluated at every use, in the calling environment • Pass by Need • Evaluated once, memorized for future use • Pass by Text (Macro) • Evaluated using the called environment. • All belong to Non-strict evaluation (lazy evaluation) CSE3302 Programming Languages, UT-Arlington

  39. Comparisons • Call by Value • Efficient. No additional level of indirection. • Less flexible and less efficient without pointer. • (array, struct, union as parameters) • Call by Reference • Require one additional level of indirection (explicit dereferencing) • If a parameter is not variable (e.g., constant), a memory space must be allocated for it, in order to get a reference. • Easiest to implement. • Call by Value-Result • You may not want to change actual parameter values when facing exceptions. • Call by Name • Lazy evaluation • Difficult to implement CSE3302 Programming Languages, UT-Arlington

  40. Heap-Allocated Data • Dynamic memory management • The simplest heap allocator that does not reclaim storage: char heap[heap_size]; intend_of_heap = 0; void* malloc ( int size ) { void* loc = (void*) &heap[end_of_heap]; end_of_heap+= size; return loc; }; CSE3302 Programming Languages, UT-Arlington

  41. With a Free List • Need to recycle the dynamically allocated data that are not used • This is done using free in C or delete in C++ • Need to link all deallocated data in the heap into a list • Initially, the free list contains only one element that covers the entire heap (ie, it's heap_size bytes long) typedefstruct Header { struct Header *next; int size; } Header; Header* free_list; • free simply puts the recycled cell at the beginning of the free list: void free ( void* x ) { if ("size of *x" <= sizeof(Header)) return; ((Header*) x)->next = free_list; ((Header*) x)->size = "size of *x"; free_list= (Header*) x; }; CSE3302 Programming Languages, UT-Arlington

  42. Malloc • malloc first searches the free list to find a cell large enough to fit the given number of bytes. If it finds one, it gets a chunk out of the cell leaving the rest untouched: void* malloc ( int size ) { Header* prev = free_list; for (Header* r=free_list; r!=0; prev=r, r=r->next) if (r->size > size+sizeof(Header)) { Header* new_r = (Header*) (((char*) r)+size); new_r->next = r->next; new_r->size = r->size; if (prev==free_list) free_list= new_r; else prev->next = new_r; return (void*) r; }; void* loc = (void*) &heap[end_of_heap]; end_of_heap+= size; return loc; }; CSE3302 Programming Languages, UT-Arlington

  43. Reference Counting • Keeping track of pointer assignments • If more than one objects point to a dynamically allocated object, then the latter object should be deleted only if all objects that point to it do not need it any more • you need to keep track of how many pointers are pointing to each object • Used to be popular for OO languages like C++ • Note: this is not automatic garbage collection because the programmer again is responsible of putting counters to every object to count references • This method is easy to implement for languages like C++ where you can redefine the assignment operator dest=source, when both destand source are pointers to data CSE3302 Programming Languages, UT-Arlington

  44. Reference Counting (cont.) • Instead of using C++ for a pointer to an object C, we use Ref<C>, • where the template Ref provides reference counting to C: template< class T > class Ref { private: intcount; T* pointer; void MayDelete () { if (count==0) delete pointer; }; void Copy ( const Ref &sp ) { ++sp.count; count = sp.count; pointer = sp.pointer; }; public: Ref ( T* ptr = 0 ) : count(1), pointer(ptr) {}; Ref ( const Ref &sp ) { Copy(sp); }; ~Ref () { MayDelete(); }; T* operator-> () { return pointer; }; Ref& operator= ( const Ref &sp ) { if (this != &sp) { count--; MayDelete(); Copy(sp); }; return *this; }; }; CSE3302 Programming Languages, UT-Arlington