Organização do Armazenamento • Estática – – • Variáveis globais; Fortran; Dinâmica (pilha e heap) – – Variáveis locais; Sem aninhamento: • • – Procedimento acessa somente variáveis locais e globais C; Com aninhamento: • • Procedimento pode acessar variáveis não-locais; Pascal; Alocação estática • • • Endereços conhecidos em tempo de compilação, possibilitando acesso mais eficiente; Valores “persistem” entre chamadas de procedimentos (se usada para procedimentos); Compilador deve conhecer o tipo de cada variável antes da execução: – • Tipagem estática (PASCAL, JAVA, Haskell, etc.); Tamanho dos objetos tem que ser conhecido em tempo de compilação. – Retrição de “tipos de tamanho fixo”; Alocação estática type Date = record y: Integer, m: Integer, d: Integer end; var a: Array 3 of Integer; var b: Boolean; var c: Char; var t: Date; a[0] a a[1] a[2] b c t.y t t.m t.d Espaço não usado Alocação estática - limitações • • Não suporta procedimentos recursivos; Estruturas de dados não podem ser criadas dinamicamente. Organização do Armazenamento Pilha (Variáveis Locais) • • Uso da pilha permite variáveis locais; A pilha também armazena o estado do programa durante chamadas de procedimentos: valores de registradores, contador do programa, computações intermediárias etc. Organização do Armazenamento Pilha (Variáveis Locais) let var a: array 3 of integer; var b: Boolean; var c: Char; proc Y () ~ let var d: Integer; var e: record c:Char, n:Integer end in …; proc Z () ~ let var f:Integer in begin …; Y(); … end in begin …; Y(); …; Z(); … end Organização do Armazenamento Pilha (Variáveis Locais) tempo de vida de variáveis globais tempo de vida de variáveis locais a Z tempo de vida de variáveis locais a Y tempo de vida de variáveis locais a Y Programa chama Y Programa inicia Retorno de Y Z chama Y Programa chama Z Retorno de Y Programa pára Retorno de Z Acessando Varáveis Locais e Globais (Stack Frames) SB ST = Stack Top globals ST (1) Depois que o programa inicia Acessando Varáveis Locais e Globais (Stack Frames) SB LB = Local Base globals LB frame for Y ST (2) Depois que o programa chama Y Estrutura de um frame ligação dados locais ligação dinâmica endereço de retorno SB = Stack Base LB = Local Base ST = Stack Top Acessando Varáveis Locais e Globais (Stack Frames) SB globals LB frame for Y ST (2) Depois que o programa chama Y Acessando Varáveis Locais e Globais (Stack Frames) SB globals ST (3) Após retorno de Y Acessando Varáveis Locais e Globais (Stack Frames) SB globals LB frame for Z ST (4) Após programa chamar Z Acessando Varáveis Locais e Globais (Stack Frames) SB globals frame for Z LB frame for Y ST (5) Após Z chamar Y Acessando Varáveis Locais e Globais (Stack Frames) SB globals LB frame for Z ST (6) Após retorno de Y Acessando Varáveis Locais e Globais (Stack Frames) SB globals ST (7) Após retorno de Z Instruções para acessar variáveis • Variáveis globais: – – • LOAD d [SB] STORE d [SB] Variáveis locais: – – LOAD d [LB] LOAD d [LB] Instruções para acessar variáveis • Exemplos: – LOAD 0 [SB] • Ler variável global a[0]; – LOAD 4 [SB] • Ler variável global c; – LOAD 2 [LB]; • Para procedimento Y ler variávei local d; – LOAD 4 [LB]; • Para procedimento Y ler variávei local e.n; – LOAD 2 [LB]; • Para procedimento Z ler variávei local f; Variáveis não-locais • Em linguagens como PASCAL, procedimentos podem acessar variáveis nãolocais: – – • Procedimentos aninhados; Procedimento pode acessar uma variável que não é local a P mas é local a um procedimento que o envolve; Registradores L1, L2, …, Ln: – Acesso aos frames de variáveis não-locais; Organização do Armazenamento Pilha (Variáveis Locais) let var g1: Integer; var g2: Array 3 of Boolean proc Q () ~ let var q: Array 3 of Char proc R () ~ let var r: Boolean; in begin … end in begin … end; proc S () ~ let var s: Array 4 of Char; in begin … end in begin … end Acessando Varáveis Não- Locais SB globals LB ST frame for P (1) Depois que o programa chama P Acessando Varáveis Não- Locais SB globals L1 LB frame for P frame for Q ST (2) Após P chamar Q Acessando Varáveis Não- Locais SB globals LB ST frame for P (3) Depois de retornar de Q Acessando Varáveis Não- Locais SB globals L1 LB frame for P frame for S ST (4) Após P chamar S Acessando Varáveis Não- Locais SB globals L1 frame for P frame for S LB frame for Q ST (5) Após S chamar Q Acessando Varáveis Não- Locais SB globals L2 frame for P frame for S L1 frame for Q LB ST frame for R (6) Após Q chamar R Acessando Varáveis Não- Locais SB globals L1 frame for P frame for S LB frame for Q ST (7) Após retorno de R Acessando Varáveis Não- Locais SB globals L1 LB frame for P frame for S ST (8) Após retorno de Q Instruções para acessar variáveis • Exemplos: – LOAD d [SB] • Para procedimento R acessar uma variável global – LOAD d [LB] • Para procedimento R acessar uma variável local a ele próprio; – LOAD d [L1]; • Para procedimento R acessar uma variável local a Q; – LOAD d [L2]; • Para procedimento R acessar uma variável local a P; Estrutura Estendida de um frame ligação estática ligação ligação dinâmica endereço de retorno dados locais L1 = content(LB) L2 = content(content(LB)) L3 = content(content(content(LB)))