Det här är ungefär vad jag tänker säga på föreläsningen. Använd det för förberedelser, repetition och ledning. Det är inte en definition av kursinnehållet, och det ersätter inte kursboken.
Idag: Run-time-omgivningar
The word stack means an ordered pile. In Swedish: "trave", "stapel". The word heap means an un-ordered pile. In Swedish: "hög". Here is the stack when the code above is run:int fak(int n) { if (n == 0) return 1; else return n * fak(n - 1); } fak(2);
The stack is cheaper than the heap.
Nyare: Stacken växer nerifrån, dvs från höga adresser mot lägre.
Växer stacken uppåt eller neråt på din dator? Testa med programmet
adresser.c
(eller det lite större adresser-2.c):
Resultat på en dator (Linux på en PC med Intel x86-processor), med raderna omflyttade så adresserna kommer i ordning:#include <stdlib.h> #include <stdio.h> #include <limits.h> int g; void f(int n) { int x; printf("x i f(%d) finns på adressen %p = %lu\n", n, (void*)&x, (long unsigned)&x); if (n &l; 3) f(n + 1); } int main(void) { int x; void* p; printf("En void-pekare är %d bitar.\n", (int)(sizeof(void*) * CHAR_BIT)); printf("x i main finns på adressen %p = %lu\n", (void*)&x, (long unsigned)&x); f(1); printf("Den globala variabeln g finns på adressen %p = %lu\n", (void*)&g, (long unsigned)&g); p = malloc(100); printf("Den malloc-allokerade arean p finns på adressen %p = %lu\n", (void*)p, (long unsigned)p); printf("Funktionen f finns på adressen %p = %lu\n", (void*)f, (long unsigned)f); return 0; }
Vi ser att en aktiveringspost (se nedan) för f tar upp 32 byte.En void-pekare är 32 bitar. Funktionen f finns på adressen 0x80483c4 = 134513604 Den globala variabeln g finns på adressen 0x8049838 = 134518840 Den malloc-allokerade arean p finns på adressen 0x804a008 = 134520840 x i f(3) finns på adressen 0xbf9d1bb4 = 3214744500 x i f(2) finns på adressen 0xbf9d1bd4 = 3214744532 x i f(1) finns på adressen 0xbf9d1bf4 = 3214744564 x i main finns på adressen 0xbf9d1c14 = 3214744596
Här tar aktiveringsposten för f upp 120 byte.En void-pekare är 32 bitar. Funktionen f finns på adressen 106cc = 67276 Den globala variabeln g finns på adressen 20b4c = 133964 Den malloc-allokerade arean p finns på adressen 20b60 = 133984 x i f(3) finns på adressen ffbff7fc = 4290770940 x i f(2) finns på adressen ffbff874 = 4290771060 x i f(1) finns på adressen ffbff8ec = 4290771180 x i main finns på adressen ffbff964 = 4290771300
Här tar aktiveringsposten för f upp 48 byte.En void-pekare är 64 bitar. Funktionen f finns på adressen 0x40058c = 4195724 Den globala variabeln g finns på adressen 0x601038 = 6295608 Den malloc-allokerade arean p finns på adressen 0x1b56010 = 28663824 x i f(3) finns på adressen 0x7fffac3f9c8c = 140736083238028 x i f(2) finns på adressen 0x7fffac3f9cbc = 140736083238076 x i f(1) finns på adressen 0x7fffac3f9cec = 140736083238124 x i main finns på adressen 0x7fffac3f9d0c = 140736083238156
Här tar aktiveringsposten för f upp 228 byte.En void-pekare är 32 bitar. x i f(3) finns på adressen 0012FCA8 = 1244328 x i f(2) finns på adressen 0012FD8C = 1244556 x i f(1) finns på adressen 0012FE70 = 1244784 x i main finns på adressen 0012FF60 = 1245024 Den malloc-allokerade arean p finns på adressen 00342A18 = 3418648 Funktionen f finns på adressen 0041107D = 4264061 Den globala variabeln g finns på adressen 00418168 = 4292968
Vi ser också att på alla dessa fyra maskiner växer stacken mot lägre adresser.
Or, use registers for actual parameters and for the returned value.
(But don't learn the FORTRAN details in this chapter for the exam!)
ALSU-07 fig. 7.7 (ASU-86 fig. 7.14): Division of tasks between caller and callee.
Example:
char* getstr() { char s[100]; fgets(s, sizeof s, stdin); return s; }
But also: activation records, if they have to be retained!
int a; // This is one variable called "a" void g() { a = 1; // No local "a"! Which "a" is this? } void f() { int a; // This is another variable called "a" a = 2; g(); } int main() { a = 3; g(); f(); }
Additionally:struct entry { char *lexptr; int token; }; #define SYMMAX 100 struct entry symtable[SYMMAX]; int lastentry = 0;
"Built during analysis, used during synthesis,"
We make a difference between:
Några viktiga begrepp:
A picture I drew to illustrate conservative garbage collection. This is a computer with 4-bit addresses, and an address space with 16 places. There are currently 4 garbage-collected objects on the heap, and with conservative garbage collection, where we assume that antyhing that can be a pointer is a pointer, the first object is guaranteed to be unreachable, and can be freed. The other three objects must be kept.
Old program (grows and crashes):
New program (works Ok):#include <stdlib.h> int main() { while (1) malloc(100); return 0; }
C++: Several ways. One is to inherit from class gc:#include <stdlib.h> #include "gc.h" int main() { while (1) GC_malloc(100); return 0; }
class A: public gc {...}; A* a = new A; // a is collectable.
Kursen Kompilatorer och interpretatorer | Föreläsningar: 1 2 3 4 5 6 7 8 9 10 11 12