paradigmas de linguagens de programacao - aula #3
Post on 25-May-2015
1.621 Views
Preview:
DESCRIPTION
TRANSCRIPT
Paradigmas de Linguagens de Programação
Paradigma Imperativo [Sub-programas]Aula #3
(CopyLeft)2009 - Ismar Frango ismar@mackenzie.br
Slide traduzido de Vitaly Shmatikov, U. Texas - http://www.cs.utexas.edu/~shmat/courses/cs345_spring08/
Uma sub-rotina/função/procedimento é um escopo nomeado parametrizado
Pode retornar um valor (geralmente chamando-se de função)x = (b*b - sqrt(4*a*c))/2*a
Pode não retornar valorChama-se “procedure” (Ada/Pascal),
“subroutine” (Fortran), “void functions/methods” (C, C++, Java)
Contêm declarações de variáveis locais e instruções
Argumentos podem ser passados para o escopoPode ser
referenciado e até sobrecarregado
Abstração Procedimental
Argumentos e Parâmetros
• Argumento: expressão que aparece em uma chamada
• Parâmetro: identificador que aparece na declaração
• O casamento parâmetro-argumento pode ser por número e posição– Há exceções, como em Perl, onde
os parâmetros são disponíveis como elementos de um array @_, ou como em Ada, que usa passagem nomeada
int h, i;void B(int w) { int j, k; i = 2*w; w = w+1;} void A(int x, int y) { bool i, j; B(h);}int main() { int a, b; h = 5; a = 3; b = 2; A(a, b);}
Como funciona a execução de sub-programas?
Modelo simples de memória
procedure P ( c: integer ) x: integer; procedure Q ( a, b: integer ) i, j: integer; begin x := x+a+j; end; begin Q(x,c); end;
Activation Records (AR)
• Bloco de informação (“frame”) associado com cada chamada, incluindo:– Parâmetros– Variáveis locais– Endereço de retorno– Local onde colocar o valor de retorno quando da saída
do sub-programa (se houver retorno)– Link de controle para o AR do caller– Variáveis temporarias e resultados intermediários – Pode ter um link de acesso ao “escopo-pai” da função
(depende da linguagem)• Cada chamada de um subprograma gera uma instância de
um AR – Activation Record Instance, ou ARI
Layout de um Activation Record
• Return address– Onde está o código a
ser executado quando o sub-programa terminar?
• Return-result address– Endereço no AR do
caller que recebe o retorno
• Parameters– Contêm os dados
vindos do caller
Control link
Local variables
Intermediate results
Environment pointer
Parameters
Return address
Return-result addr
Exemplo
• Funçãofact(n) = if n<= 1 then 1 else n * fact(n-
1)– Return result address:
• local onde colocar fact(n)
– Parameters• Recebe o valor de n
– Intermediate results• Locais com os valores de
fact(n-1)
Control link
Local variables
Intermediate results
Environment pointer
Parameters
Return address
Return result addr
x86 Activation Record
frame pointer
stack pointer
http://www.inf.ufrgs.br/~nicolas/pdf/Compiladores22-runtime.pdf
10
Frame Pointer
• Aponta para o fim da frame corrente
g(…)
{
f(a1,…,an);
}
g caller
f callee
Arg n…Arg 2Arg 1Static linkLocal varsRet addressTemporariesSaved regsArg m…Arg 1Static link
f’s frame
g’s frame
next frame
sp
fp
Control link
fact(n-1)
n
Return-result addr
3
fact(3)
Function Call
(O Return address é um ponteiro no segmento de código)
Control link
fact(n-1)
n
Return-result addr
2
fact(2)
fact(n) = if n<= 1 then 1
else n * fact(n-1)
Control link
fact(n-1)
n
Return-result addr
k
fact(k)
Environment pointer
Control link
fact(n-1)
n
Return-result addr
1
fact(1)
Function Return
Control link
fact(n-1)
n
Return-result addr
3
fact(3)
Control link
fact(n-1)
n
Return-result addr
1
2
fact(2)
Control link
fact(n-1)
n
Return-result addr
1
fact(1)
fact(n) = if n<= 1 then 1
else n * fact(n-1)
Control link
fact(n-1)
n
Return-result addr
2
3
fact(3)
Control link
fact(n-1)
n
Return-result addr
1
2
fact(2)
Highaddresses
Lowaddresses
Caller:– avalia os parâmetros efetivos e os coloca na pilha– Registradores em uso pelo chamador são salvos emmemória– armazena o endereço de retorno e o valor antigo doframe_pointer no registro de ativação da rotinachamada e atualiza o valor do frame_pointer;
Calee:– salva valores de registradores e outras informações do estado da máquina;– inicializa variáveis locais e começa sua execução.
Sequência da chamada
Callee:– armazena o valor de retorno logo após o registro de ativação da rotina chamadora;– restaura o apontador do topo do RA e os registradores da máquina e desvia para o endereço de retorno dentro da rotina chamadora;
Caller:– copia o valor retornado no seu próprio registro de ativação
Sequência do retorno
top related