S_LP1_subprogramas_slides_estudados - Pré P2 - Schneider
38 pág.

S_LP1_subprogramas_slides_estudados - Pré P2 - Schneider


DisciplinaProgramação I20.558 materiais240.012 seguidores
Pré-visualização3 páginas
Passagem por Referência (2/2)
\u25cf Desvantagens:
\u2013 Acesso lento.
\u2013 Pode permitir aliasing:
\u25cf Colisão de parâmetros \u2013 exemplo na sintaxe do Pascal:
            procedure sub1(a: integer, b: integer);
            \u2026
            sub1(x, x);
\u25cf Colisão de elementos de array \u2013 exemplo na sintaxe do Pascal:
            sub1 (a[i], a[j]; /* se i = j */
            sub2 (a, a[i]);
\u25cf Colisão entre parâmetros formais e globais.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Passagem por Nome (1/3)
\u25cf Passagem por Nome (múltiplos modos):
\u25cf Parâmetros passados por nome, o parâmetro real é, com efeito, 
textualmente substituído para o parâmetro formal correspondente em 
todas as suas ocorrências no subprograma.
\u25cf Parâmetros formais são vinculados a valores ou a endereços reais no 
momento da chamada ao subprograma.
\u25cf Propósito:
\u2013 Flexibilidade na vinculação tardia.
\u25cf Resultados semânticos:
\u2013 Se o parâmetro real for uma variável escalar, será passado por referência.
\u2013 Se o parâmetro real for uma expressão constante, será passado por valor.
\u2013 Se o parâmetro real for um elemento de array, será passado diferente de 
qualquer em dos métodos estudados.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Passagem por Nome (2/3)
\u25cf Exemplo, em ALGOL:
   procedure BIGSUB;
      integer GLOBAL;
      integer array LIST[1 : 2];
      procedure SUB(PARAM);              begin
         integer PARAM;                    LIST[1] := 2;
         begin                             LIST[2] := 2;
            PARAM := 3;                    GLOBAL := 1;
            GLOBAL := GLOBAL + 1;          SUB(LIST[GLOBAL]);
            PARAM := 5;                  end.
         end;
\u25cf Após a execução, o array LIST tem os valores 3 e 5, ambos definidos em SUB.
\u2013 O acesso a LIST[2] é oferecido depois que GLOBAL se incrementa para o valor 2 em SUB.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Passagem por Nome (3/3)
\u25cf Desvantagens da passagem por nome:
\u25cf Referência muito ineficientes.
\u25cf São difíceis de implementar e podem confundir tanto leitores como os 
escritores de programas.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Exemplos em Linguagens de Programação (1/2)
\u25cf FORTRAN :
\u25cf Antes do FORTRAN 77, passagem por referência.
\u25cf FORTRAN 77 \u2013 variáveis escalares são passados como valor-resultado.
\u25cf ALGOL 60:
\u25cf Passagem por nome é o padrão.
\u25cf Passagem por valor é opcional.
\u25cf C:
\u25cf Passagem por valor.
\u25cf Passagem por referência através da utilização de ponteiros.
\u25cf Pascal e Modula-2:
\u25cf Passagem por valor é o padrão.
\u25cf Passagem por referência é opcional.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Exemplos em Linguagens de Programação (2/2)
\u25cf C++:
\u25cf Como o C, mas também permite tipo referência, o qual providência a eficiência da 
passagem por referência com a semântica da passagem por valor.
\u25cf Exemplo:
        void fun (const int &p1, int p2, int &p3){ .... }
\u2013 p1 é passado por referência, mas não pode ser mudado na função fun.
\u2013 o parâmetro p2 é passado por valor.
\u2013 o parâmetro p3 é passado por referência.
\u25cf ADA:
\u25cf Todos os três modos semânticos estão disponíveis:
\u2013 Em modo out podem ser atribuídos, mas não referenciados.
\u2013 Em modo in podem ser referenciados, mas não atribuídos.
\u2013 Em modo inout podem ser tanto atribuídos como referenciados.
\u25cf Java:
\u25cf Como o C++, exceto variáveis de referência, que são passados por referência.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Parâmetros de Verificação de Tipo
\u25cf Agora considerado muito importante para a confiabilidade;
\u25cf FORTRAN 77 e C original:
\u25cf Nenhum.
\u25cf Pascal, Modula-2, FORTRAN 90, Java e ADA:
\u25cf Ela é sempre requerida.
\u25cf ANSI C e C++:
\u25cf A escolha é feita pelo usuário.
\u25cf Exemplo:
      double sin(x)       double sin(double x)
         double x;        {...}
      {...}
\u25cf Evita a verificação de tipos Método protótipo, variáveis são coagidas caso não
 sejam do mesmo tipo.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Considerações de Projeto para Passagem de Parâmetros
\u25cf Eficiência.
\u25cf Uma direção ou duas direções.
\u25cf Estas duas estão em conflito com uma outra:
\u25cf Boa programação:
\u2013 Limitar o acesso as variáveis, o qual significa que uma direção é sempre 
possível.
\u25cf Eficiência:
\u2013 Passar por referência é o modo mais rápido para passar estruturas de 
tamanho significativo.
\u25cf Também, funções poderão não permitir parâmetros de referência.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Parâmetros que são Nomes de Subprogramas (1/5)
\u25cf Os parâmetros são checados quanto ao tipo:
\u25cf Pascal inicial e FORTRAN 77 não faziam.
\u25cf Versões posteriores do Pascal, Modula-2 e FORTRAN 90 fazem.
\u25cf ADA não permite subprogramas como parâmetros.
\u25cf C e C++ passam ponteiros para funções, sendo que os parâmetros 
podem ser verificados.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Parâmetros que são Nomes de Subprogramas (2/5)
\u25cf Exemplo em Pascal:
   procedure integral (function fun (x: real): real;
                       liminf, limsup: real;
                       var result: real);
    ...
    var funvar: real;
    begin
    ...
    funvar := fun(liminf);
    ...
    end;
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Parâmetros que são Nomes de Subprogramas (3/5)
\u25cf Qual é o ambiente de referenciamento correto para executar o 
subprograma passado:
\u25cf Possibilidades:
\u2013 O ambiente da instrução de chamada que ordena o subprograma passado 
(vinculação rasa).
\u2013 O ambiente da definição do subprograma passado (vinculação profunda).
\u2013 O ambiente da instrução de chamada que passou o subprograma como um 
parâmetro real (vinculação ad hoc).
\u25cf Para linguagens de escopo estático, a vinculação profunda é mais 
natural.
\u25cf Para linguagens de escopo dinâmico, a vinculação rasa é mais natural.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Parâmetros que são Nomes de Subprogramas (4/5)
\u25cf Exemplo na sintaxe do Pascal:
   procedure SUB1;
    var x : integer;
      procedure SUB2;
      begin
         write('x = ', x);
      end;
      procedure SUB3;
      var x : integer;
      begin
         x := 3;
         SUB4(SUB2);
      end;
   procedure SUB4 (SUBX);
   var x : integer;
   begin
      x := 4;
      SUBX;
   end;
begin
   x := 1;
   SUB3;
end.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Parâmetros que são Nomes de Subprogramas (5/5)
\u25cf Vinculação rasa:
\u25cf O ambiente de referenciamento dessa execução é o de SUB4, de modo 
que a referência a x em SUB2 é vinculada à local x em SUB, e o 
resultado do programa é x = 4.
\u25cf Vinculação profunda:
\u25cf O ambiente de referenciamento da execução de SUB2 é o de SUB1, de 
modo que a referência a x em SUB2 é vinculada à local x em SUB1, e o 
resultado é x = 1.
\u25cf Vinculação ad hoc:
\u25cf O ambiente de referenciamento da execução de SUB2 é o de SUB3, de 
modo que a referência a x em SUB2 é vinculada à local x em SUB3, e o 
resultado é x = 3.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Subprogramas Sobrecarregados (1/3)
\u25cf Um subprograma sobrecarregado é um que tem o mesmo nome que 
outro subprograma no mesmo ambiente de referenciamento.
\u25cf C++ e Java possuem subprogramas sobrecarregados predefinidos, e 
usuários podem escrever seus próprios subprogramas 
sobrecarregados.
Subprogramas
Paradigmas de Linguagens de Programação
http://www.ybadoo.com.br/
Subprogramas Sobrecarregados (2/3)
\u25cf Exemplo em ADA:
   procedure MAIN is
      type VETOR_FLOAT is array (INTEGER range <>) of FLOAT;
      type VETOR_INT is array (INTEGER range <>) of INTEGER;
      ...
      procedure