Paradigmas de Linguagens de Programação Paradigma Imperativo [Sub-programas] Aula #3 (CopyLeft)2009 - Ismar Frango ismar@mackenzie.br
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 valor Chama-se “procedure” (Ada/Pascal),  “subroutine” (Fortran),  “void functions/methods” (C, C++, Java) Abstração Procedimental Slide traduzido de Vitaly Shmatikov, U. Texas - http://www.cs.utexas.edu/~shmat/courses/cs345_spring08/ Contêm declarações de variáveis locais e instruções Argumentos podem ser passados para o escopo Pode ser referenciado e até sobrecarregado
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ção fact(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
Frame Pointer Aponta para o fim da frame corrente g(…) { f(a1,…,an); } g    caller f    callee Arg n … Arg 2 Arg 1 Static link Local vars Ret address Temporaries Saved regs Arg m … Arg 1 Static link f’s frame g’s frame next frame sp fp
Function Call (O  Return address  é um ponteiro no segmento de código ) fact(n) = if n<= 1  then 1 else n * fact(n-1) Control link fact(n-1) n Return-result addr 3 fact(3) Control link fact(n-1) n Return-result addr 2 fact(2) 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) High addresses Low addresses
Caller: –  avalia os parâmetros efetivos e os coloca na pilha –  Registradores em uso pelo chamador são salvos em memória –  armazena o endereço de retorno e o valor antigo do frame_pointer no registro de ativação da rotina chamada 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

Paradigmas de Linguagens de Programacao - Aula #3

  • 1.
    Paradigmas de Linguagensde Programação Paradigma Imperativo [Sub-programas] Aula #3 (CopyLeft)2009 - Ismar Frango ismar@mackenzie.br
  • 2.
    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 valor Chama-se “procedure” (Ada/Pascal), “subroutine” (Fortran), “void functions/methods” (C, C++, Java) Abstração Procedimental Slide traduzido de Vitaly Shmatikov, U. Texas - http://www.cs.utexas.edu/~shmat/courses/cs345_spring08/ Contêm declarações de variáveis locais e instruções Argumentos podem ser passados para o escopo Pode ser referenciado e até sobrecarregado
  • 3.
    Argumentos e ParâmetrosArgumento: 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); }
  • 4.
    Como funciona aexecuçã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;
  • 5.
    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
  • 6.
    Layout de umActivation 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
  • 7.
    Exemplo Função fact(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
  • 8.
    x86 Activation Recordframe pointer stack pointer
  • 9.
  • 10.
    Frame Pointer Apontapara o fim da frame corrente g(…) { f(a1,…,an); } g  caller f  callee Arg n … Arg 2 Arg 1 Static link Local vars Ret address Temporaries Saved regs Arg m … Arg 1 Static link f’s frame g’s frame next frame sp fp
  • 11.
    Function Call (O Return address é um ponteiro no segmento de código ) fact(n) = if n<= 1 then 1 else n * fact(n-1) Control link fact(n-1) n Return-result addr 3 fact(3) Control link fact(n-1) n Return-result addr 2 fact(2) 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)
  • 12.
    Function Return Controllink 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) High addresses Low addresses
  • 13.
    Caller: – avalia os parâmetros efetivos e os coloca na pilha – Registradores em uso pelo chamador são salvos em memória – armazena o endereço de retorno e o valor antigo do frame_pointer no registro de ativação da rotina chamada 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
  • 14.
    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