Organização do Armazenamento EstáticaEstática –Variáveis globais; –Fortran; Dinâmica...

Post on 07-Apr-2016

214 views 0 download

Transcript of Organização do Armazenamento EstáticaEstática –Variáveis globais; –Fortran; Dinâmica...

Organização do Armazenamento

• EstáticaEstática– Variáveis Variáveis globaisglobais;;– FortranFortran;;

• Dinâmica (pilha e heap)Dinâmica (pilha e heap)– Variáveis Variáveis locaislocais;;– SemSem aninhamento: aninhamento:

• Procedimento acessa somente variáveis Procedimento acessa somente variáveis locaislocais e e globaisglobais• CC;;

– ComCom aninhamento: aninhamento: • Procedimento pode acessar variáveis Procedimento pode acessar variáveis não-locaisnão-locais;;• PascalPascal;;

Alocação estática

• Endereços conhecidos em tempo de compilação, Endereços conhecidos em tempo de compilação, possibilitando possibilitando acesso mais eficiente;acesso mais eficiente;

• Valores “persistem” entre chamadas de Valores “persistem” entre chamadas de procedimentos (se usada para procedimentos);procedimentos (se usada para procedimentos);

• Compilador deve conhecer o tipo de cada Compilador deve conhecer o tipo de cada variável antes da execução:variável antes da execução:

– Tipagem estática (PASCAL, JAVA, Haskell, etc.);Tipagem estática (PASCAL, JAVA, Haskell, etc.);• Tamanho dos objetosTamanho dos objetos tem que ser conhecido em tem que ser conhecido em

tempo de compilação.tempo de compilação.– Retrição de Retrição de “tipos de tamanho fixo”“tipos de tamanho fixo”;;

Alocação estática

type Date = recordtype Date = record yy: : IntegerInteger,, mm: : IntegerInteger,, dd: : IntegerInteger end;end; var var aa: : Array 3 of IntegerArray 3 of Integer;; var var bb: : BooleanBoolean;; var var cc: : CharChar;; var var tt: : DateDate; ;

a[0]a[0]

a[1]a[1]

a[2]a[2]

bb

cc

t.yt.y

t.mt.m

t.dt.d

Espaço não usado

a

t

Alocação estática - limitações

• Não suporta procedimentos recursivos; Não suporta procedimentos recursivos; • Estruturas de dados não podem ser Estruturas de dados não podem ser

criadas dinamicamente.criadas dinamicamente.

Organização do Armazenamento Pilha (Variáveis LocaisVariáveis Locais)

• Uso da pilha permite variáveis locais;Uso da pilha permite variáveis locais;• A pilha também armazena o A pilha também armazena o estado do estado do

programaprograma durante chamadas de durante chamadas de procedimentos: valores de registradores, procedimentos: valores de registradores, contador do programa, computações contador do programa, computações intermediárias etc.intermediárias etc.

Organização do Armazenamento Pilha (Variáveis LocaisVariáveis Locais)

let let var var aa: : array 3 of integerarray 3 of integer;; var var bb: : BooleanBoolean;; var var cc: : CharChar;; proc Y () ~proc Y () ~ letlet var var dd: : IntegerInteger;; var var ee: record : record cc::CharChar, , nn::IntegerInteger end end in …;in …; proc Z () ~proc Z () ~ letlet var var ff::IntegerInteger inin begin …; Y(); … endbegin …; Y(); … end inin begin …; Y(); …; Z(); … endbegin …; Y(); …; Z(); … end

Organização do Armazenamento Pilha (Variáveis LocaisVariáveis Locais)

tempo de vida de variáveis globais

tempo de vida de variáveis

locais a Ytempo de vida de variáveis

locais a Y

tempo de vida de variáveis locais a Z

Programainicia

Programa chama Y

Retorno de Y

Programachama Z

Z chama Y Retorno de Y

Retorno de Z

Programa pára

Acessando Varáveis Locais e Globais (Stack Frames)

globalsglobals

SB

ST (1) Depois que o programa inicia

ST = Stack Top

Acessando Varáveis Locais e Globais (Stack Frames)

globalsglobals

frameframefor Yfor Y

SB

LB

ST

(2) Depois que o programa chama Y

LB = Local Base

Estrutura de um frame

ligação dinâmicaendereço de retorno

ligação

dados locaisSB = Stack BaseLB = Local BaseST = Stack Top

Acessando Varáveis Locais e Globais (Stack Frames)

globalsglobals

frameframefor Yfor Y

SB

LB

ST

(2) Depois que o programa chama Y

Acessando Varáveis Locais e Globais (Stack Frames)

globalsglobals

SB

ST (3) Após retorno de Y

Acessando Varáveis Locais e Globais (Stack Frames)

globalsglobals

frameframefor Zfor Z

SB

LB

ST

(4) Após programa chamar Z

Acessando Varáveis Locais e Globais (Stack Frames)

globalsglobals

frame frame for Zfor Z

frame frame for Yfor Y

SB

LB

ST

(5) Após Z chamar Y

Acessando Varáveis Locais e Globais (Stack Frames)

globalsglobals

frameframefor Zfor Z

SB

LB

ST

(6) Após retorno de Y

Acessando Varáveis Locais e Globais (Stack Frames)

globalsglobals

SB

ST (7) Após retorno de Z

Instruções para acessar variáveis

• Variáveis Variáveis globaisglobais::– LOAD d [SB]LOAD d [SB]– STORE d [SB]STORE d [SB]

• Variáveis Variáveis locaislocais::– LOAD d [LB]LOAD d [LB]– LOAD d [LB]LOAD d [LB]

Instruções para acessar variáveis

• Exemplos:Exemplos:– LOAD 0 [LOAD 0 [SBSB]]

• Ler variável global Ler variável global a[0]a[0];;– LOAD 4 [LOAD 4 [SBSB]]

• Ler variável global Ler variável global cc;;– LOAD 2 [LOAD 2 [LBLB];];

• Para procedimento Para procedimento YY ler variávei local ler variávei local dd;;– LOAD 4 [LOAD 4 [LBLB];];

• Para procedimento Para procedimento YY ler variávei local ler variávei local e.ne.n;;– LOAD 2 [LOAD 2 [LBLB];];

• Para procedimento Para procedimento ZZ ler variávei local ler variávei local ff;;

Variáveis não-locais

• Em linguagens como PASCAL, Em linguagens como PASCAL, procedimentos podem acessar variáveis não-procedimentos podem acessar variáveis não-locais:locais:

– Procedimentos aninhados;Procedimentos aninhados;– Procedimento pode acessar uma variável que Procedimento pode acessar uma variável que não não

é localé local a P mas é local a um procedimento que o a P mas é local a um procedimento que o envolve;envolve;

• Registradores LRegistradores L11, L, L22, …, L, …, Lnn::– Acesso aos Acesso aos framesframes de variáveis não-locais; de variáveis não-locais;

letlet var g1: Integer; var g1: Integer; var g2: Array 3 of Boolean var g2: Array 3 of Boolean proc Q () ~ proc Q () ~

letlet var q: Array 3 of Charvar q: Array 3 of Char

proc R () ~ proc R () ~ let let var r: Boolean; var r: Boolean; in in begin … end begin … end in in begin … end; begin … end; proc S () ~ proc S () ~ let let var s: Array 4 of Char; var s: Array 4 of Char; in in begin … end begin … end

in begin … endin begin … end

Organização do Armazenamento Pilha (Variáveis LocaisVariáveis Locais)

Acessando Varáveis Não- Locais

frameframefor Pfor P

globalsglobalsSB

LB

ST (1) Depois que o programa chama P

Acessando Varáveis Não- Locais

frameframefor Pfor P

globalsglobalsSB

L1

ST

(2) Após P chamar Qframeframe

for Qfor Q

LB

Acessando Varáveis Não- Locais

frameframefor Pfor P

globalsglobalsSB

LB

ST (3) Depois deretornar de Q

Acessando Varáveis Não- Locais

frameframefor Pfor P

globalsglobalsSB

L1

ST

(4) Após P chamar Sframeframe

for Sfor S

LB

Acessando Varáveis Não- Locais

frameframefor Pfor P

globalsglobalsSB

L1

(5) Após S chamar Qframeframe

for Sfor S

ST

LBframeframefor Qfor Q

Acessando Varáveis Não- Locais

frameframefor Pfor P

globalsglobalsSB

L1

ST

(6) Após Q chamar Rframeframe

for Sfor S

LB

frameframefor Qfor Q

frameframefor Rfor R

L2

Acessando Varáveis Não- Locais

frameframefor Pfor P

globalsglobalsSB

L1

ST

(7) Após retorno de Rframeframe

for Sfor SLB

frameframefor Qfor Q

Acessando Varáveis Não- Locais

frameframefor Pfor P

globalsglobalsSB

L1

ST

(8) Após retornode Qframeframe

for Sfor S

LB

Instruções para acessar variáveis

• Exemplos:Exemplos:– LOAD LOAD dd [ [SBSB]]

• Para procedimento R acessar uma variável globalPara procedimento R acessar uma variável global

– LOAD LOAD dd [ [LBLB]]• Para procedimento R acessar uma variável local a ele próprio;Para procedimento R acessar uma variável local a ele próprio;

– LOAD LOAD dd [ [L1L1];];• Para procedimento R acessar uma variável local a Q;Para procedimento R acessar uma variável local a Q;

– LOAD LOAD dd [ [L2L2];];• Para procedimento R acessar uma variável local a P;Para procedimento R acessar uma variável local a P;

Estrutura Estendida de um frame

ligação dinâmicaendereço de retorno

ligação

dados locais L1 = content(LB)L2 = content(content(LB))L3 = content(content(content(LB)))

ligação estática