10 - Subprogramas

  • Upload
    evair

  • View
    251

  • Download
    0

Embed Size (px)

Citation preview

  • 7/24/2019 10 - Subprogramas

    1/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    INF1125 Paradigmas de Linguagem de Programao

    --------------------------------------------------------

    Prof. Antonio Luiz Cavalcanti Tj

    [email protected]

    Subprogramas [INF1125 PLP]

  • 7/24/2019 10 - Subprogramas

    2/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Nota

    ! Os s l ides ut i l i zados nessadisciplina so uma adaptao

    dos slides oficiais fornecidos pelaEditora Bookman para cursosbaseados no livro de RobertSebesta.

    ! Esse curso segue a estrutura dolivro de Sebesta mudando emalguns momentos apenas ao r d e m d e e x e c u o d ocontedo.

    ! O professor da d isc ip l inaentende que o livro de Sebestaainda uma das melhores obrasintrodutrias sobre o assunto.

  • 7/24/2019 10 - Subprogramas

    3/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Tpicos do Captulo 9

    ! Introduo

    !

    Fundamentos de subprogramas! Questes de projeto para subprogramas

    ! Ambientes de referenciamento local

    ! Mtodos de passagem de parmetros

    !

    Parmetros que so subprogramas

    ! Subprogramas sobrecarregados

    ! Subprogramas genricos

    ! Questes de projeto para funes

    ! Operadores sobrecarregados definidos pelo usurio

    ! Corrotinas

  • 7/24/2019 10 - Subprogramas

    4/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Introduo

    ! Dois recursos fundamentais de abstrao

    !Abstrao de processos

    ! Desde o incio da histria das linguagens de programao

    !Abstrao de dados

    !

    Desde o incio dos anos 1980

  • 7/24/2019 10 - Subprogramas

    5/48Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Fundamentos de subprogramas

    ! Cada subprograma tem um nico ponto de entrada

    !

    A unidade de programa chamadora suspensa durante a execuodo subprograma chamado

    ! O controle sempre retorna para o chamador quando a execuo dosubprograma termina

  • 7/24/2019 10 - Subprogramas

    6/48Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Definies bsicas

    ! Uma definio de subprograma descreve a interface e as aes daabstrao de um subprograma

    !

    Em Python, definies de programa so executveis; em todas as outras

    linguagens, elas so no executveis

    ! Uma chamada a subprograma a requisio explcita que diz que osubprograma deve ser executado

    !

    Um cabealho de subprograma a primeira parte da definio,incluindo o nome, o tipo de subprograma e os parmetros formais

    ! O perfil de parmetros (ou assinatura) de um subprograma contm onmero, a ordem e os tipos de seus parmetros formais

    !

    O protocolo o perfil de parmetros mais, se for uma funo, seu tipode retorno

  • 7/24/2019 10 - Subprogramas

    7/48Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Definies bsicas (continuao)

    ! Declaraes de funes em C e C++ so chamadas de prottipos

    !

    Uma declarao de subprograma fornece o protocolo, mas no incluiseu corpo

    ! Um parmetro formal uma varivel listada no cabealho dosubprograma e usado nele

    !

    Um parmetro realrepresenta um valor ou endereo usado nasentena de chamada do subprograma

    C d i t t i

  • 7/24/2019 10 - Subprogramas

    8/48Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Correspondncia entre os parmetros reaise formais

    ! Posicional

    !A vinculao dos parmetros reais a parmetros formais por posio:

    o primeiro real vinculado ao primeiro formal e assim por diante

    ! Seguro e efetivo

    ! Palavra-chave

    ! O nome do parmetro formal a que um parmetro real deve ser vinculado

    especificado com o parmetro real! Vantagem: Parmetros podem aparecer em qualquer ordem, evitando

    erros de correspondncia

    ! Desvantagem: O usurio deve saber os nomes dos parmetros formais

  • 7/24/2019 10 - Subprogramas

    9/48Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Valores padro de parmetros formais

    ! Em certas linguagens (como C++, Python, Ruby, Ada e PHP),parmetros formais podem ter valores padro (se nenhum parmetro

    real passado)! Em C++, parmetros padro devem aparecer por ltimo, j que os parmetros so

    posicionalmente associados

    ! Nmero varivel de parmetros! C# permite que os mtodos aceitem um nmero varivel de parmetros, desde que

    sejam do mesmo tipo o mtodo especifica seu parmetro com o modificador

    params

    ! Em Ruby, os parmetros reais so enviados como elementos de uma dispersoannima e o correspondente parmetro formal precedido por um asterisco

    ! Em Python, o real uma lista de valores e o parmetro formal correspondente um

    nome com um asterisco! Em Lua, um nmero varivel de parmetros representado por um parmetro

    formal com reticncias

  • 7/24/2019 10 - Subprogramas

    10/48Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Blocos em Ruby

    ! Ruby inclui mtodos de iterao para suas estruturas de dados

    ! Iteradores so implementados com blocos, que podem ser definidos por aplicaes

    ! Os blocos podem ter parmetros formais, que so especificados entre barras verticais;

    o bloco que passado para o subprograma chamado chamado com uma

    sentenayield

    def fibonacci(last)

    first, second = 1, 1

    while first

  • 7/24/2019 10 - Subprogramas

    11/48Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Procedimentos e funes

    ! Existem duas categorias de subprogramas

    ! Procedimentoso colees de sentenas que definem computaes

    parametrizadas

    ! Funes se parecem estruturalmente com os procedimentos, mas so

    semanticamente modeladas como funes matemticas

    ! Se uma funo um modelo fiel, ela no produz efeitos colaterais

    ! Na prtica, muitas funes em programas tm efeitos colaterais

  • 7/24/2019 10 - Subprogramas

    12/48Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Questes de projeto para subprogramas

    ! As variveis locais so alocadas estaticamente ou dinamicamente?

    !

    As definies de subprogramas podem aparecer em outras definiesde subprogramas?

    ! Que mtodo ou mtodos de passagem de parmetros so usados?

    ! Os tipos dos parmetros reais so verificados?

    ! Se os subprogramas puderem ser passados como parmetros epuderem ser aninhados, qual o ambiente de referenciamento de umsubprograma passado como parmetro?

    ! Os subprogramas podem ser sobrecarregados?

    ! Os subprogramas podem ser genricos?

  • 7/24/2019 10 - Subprogramas

    13/48Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Ambientes de referenciamento local

    ! Variveis locais podem ser dinmicas da pilha

    ! Vantagens

    !

    Suporte para recurso

    ! Armazenamento para variveis locais compartilhado entre alguns

    subprogramas

    ! Desvantagens

    ! Custo para alocao, liberao, tempo de inicializao

    !

    Endereamento indireto

    ! Subprogramas no podem ser sensveis ao histrico

    ! Variveis locais podem ser estticas

    ! Vantagens e desvantagens so o oposto daquelas das variveis locais

    dinmicas da pilha

    Modelos semnticos de passagem

  • 7/24/2019 10 - Subprogramas

    14/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Modelos semnticos de passagemde parmetros

    ! Modo de entrada

    !

    Modo de sada

    ! Modo de entrada e sada

    M d l d d t

  • 7/24/2019 10 - Subprogramas

    15/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Modelos de passagem de parmetros

    Modelos conceituais de transferncia

  • 7/24/2019 10 - Subprogramas

    16/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Modelos conceituais de transfernciae dados

    ! Um valor real copiado (movimento fsico)

    !

    Um caminho de acesso transmitido

    Passagem por valor

  • 7/24/2019 10 - Subprogramas

    17/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Passagem por valor

    ! O valor do parmetro real usado para inicializar o parmetro formalcorrespondente

    !

    Normalmente implementada por cpia

    ! Poderia ser implementada transmitindo um caminho de acesso para o valor

    do parmetro real no chamador, mas isso requereria que o valor estivesse

    em uma clula com proteo contra escrita (uma que pudesse ser apenas

    lida)

    !

    Desvantagens(se cpias so usadas): necessrio armazenamentoadicional para o parmetro formal e o movimento pode ser custoso

    Passagem por resultado

  • 7/24/2019 10 - Subprogramas

    18/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Passagem por resultado

    ! Quando um parmetro passado por resultado, nenhum valor transmitido para o subprograma

    ! O parmetro formal correspondente age como uma varivel local,mas logo antes de o controle ser transmitido de volta para o chamador

    ! Problema em potencial: sub(p1, p1);pode existir uma coliso entreparmetros reais

    Passagem por valor resultado

  • 7/24/2019 10 - Subprogramas

    19/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Passagem por valor-resultado

    ! Modelo de implementao para parmetros no modo de entrada esada no qual os valores reais so copiados

    ! Chamada de passagem por cpia

    ! Parmetros formais tm armazenamento local

    ! Desvantagens:

    !

    As mesmas da passagem por resultado!As mesmas da passagem por valor

    Passagem por referncia

  • 7/24/2019 10 - Subprogramas

    20/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Passagem por referncia

    ! Transmite um caminho de acesso

    !

    Vantagem: processo de passagem eficiente (no so necessriascpias nem espao duplicado)

    ! Desvantagens

    !Acessos mais lentos (do que na passagem por valor) a parmetros formais

    ! Potenciais efeitos colaterais (colises)

    !Apelidos podem ser criados

    Passagem por nome

  • 7/24/2019 10 - Subprogramas

    21/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Passagem por nome

    ! Por substituio textual

    !

    Quando os parmetros so passados por nome, o parmetro real , naprtica, textualmente substitudo pelo parmetro formalcorrespondente em todas as suas ocorrncias no subprograma

    Implementando mtodos de passagem

  • 7/24/2019 10 - Subprogramas

    22/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Implementando mtodos de passagemde parmetros

    ! Na maioria das linguagens contemporneas, a comunicao viaparmetros ocorre por meio da pilha de tempo de execuo

    ! Passagem por referncia a mais simples de implementar; apenas seuendereo deve ser colocado na pilha

    ! Um erro sutil, mas fatal, pode ocorrer com parmetros com passagempor referncia e passagem por valor-resultado: um formal

    correspondente a uma constante pode ser trocado erroneamente

  • 7/24/2019 10 - Subprogramas

    23/48

    Mtodos de passagem de parmetros das principaisli ( ti )

  • 7/24/2019 10 - Subprogramas

    24/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    p g p p plinguagens (continuao)

    ! Fortran 95! Parmetros podem ser declarados para serem dos modos de entrada, de

    sada ou de entrada e sada

    ! C#

    ! Mtodo padro: passagem por valor

    ! Passagem por referncia especificada precedendo um parmetro formal e seureal correspondente com

    ref

    ! PHP: similar a C#

    ! Perl: parmetros reais so implicitamente colocados em uma matrizpr-definida chamada de @_

    !

    Python e Ruby usam passagem por atribuio (todos os valores dedados so objetos)

    Verificao de tipos dos parmetros

  • 7/24/2019 10 - Subprogramas

    25/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Verificao de tipos dos parmetros

    ! Considerado importante para confiabilidade

    !

    FORTRAN 77 e verso original do C: no tinham! Pascal, FORTRAN 90, Java e Ada: sempre requerem

    ! ANSI C e C++: escolha feita pelo usurio

    ! Linguagens relativamente novas como Perl, JavaScript e PHP norequerem verificao de tipos

    ! Em Python e Ruby, variveis no tm tipos (objetos sim), entoverificao de tipos dos parmetros no possvel

    Matrizes multidimensionais como parmetros

  • 7/24/2019 10 - Subprogramas

    26/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Matrizes multidimensionais como parmetros

    ! Se uma matriz multidimensional passada para um subprograma e osubprograma compilado separadamente, o compilador precisa

    saber o tamanho declarado dessa matriz para construir a funo demapeamento de armazenamento

    Matrizes multidimensionais comoparmetros: C e C++

  • 7/24/2019 10 - Subprogramas

    27/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    parmetros: C e C++

    ! Matriz pode ser passada como um ponteiro, e as dimenses reais damatriz podem ser includas como parmetros

    ! A funo pode avaliar a funo de mapeamento de armazenamentoescrita pelo usurio usando aritmtica de ponteiros cada vez que umelemento da matriz precisar ser referenciado

    Matrizes multidimensionais comoparmetros : Ada

  • 7/24/2019 10 - Subprogramas

    28/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    parmetros : Ada

    ! Ada no um problema

    ! Matrizes com restries tamanho parte do tipo da matriz

    !

    Matrizes sem restries tamanho declarado parte da declarao

    do objeto

    Matrizes multidimensionais comoparmetros : Fortran

  • 7/24/2019 10 - Subprogramas

    29/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    parmetros : Fortran

    ! Os parmetros formais que so matrizes devem ter uma declaraoaps o cabealho

    !

    Para matrizes de dimenso nica, os ndices em tais declaraesso irrelevantes

    ! Mas para matrizes multidimensionais, os ndices em tais declaraes

    permitem que o compilador construa a funo de mapeamento do

    armazenamento

    Matrizes multidimensionais comoparmetros : Java e C#

  • 7/24/2019 10 - Subprogramas

    30/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    parmetros : Java e C#

    ! Similar a Ada

    !

    Matrizes so objetos; elas so todas de uma nica dimenso, mas oselementos podem ser matrizes

    ! Cada matriz herda uma constante nomeada (lengthem Java,Lengthem C#) que configurada para o tamanho da matriz quandoo objeto matriz criado

    Consideraes de projeto para passagensde parmetros

  • 7/24/2019 10 - Subprogramas

    31/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    de parmetros

    ! Duas consideraes importantes

    ! Eficincia

    !

    Transferncias de dados de uma via ou de duas vias

    ! Mas as consideraes acima esto em conflito

    ! Boa programao sugere acesso limitado a variveis, o que significa uma

    via, sempre que possvel

    !

    Mas passagem por referncia mais eficiente para passar estruturas detamanho significativo

    Parmetros que so subprogramas

  • 7/24/2019 10 - Subprogramas

    32/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! s vezes, conveniente enviar os nomes de subprogramas comoparmetros

    ! Questes:

    1. Tipos de parmetros so verificados?

    2. Qual o ambiente de referenciamento correto para um subprograma

    enviado como parmetro?

    Parmetros que so subprogramas: verificao de tiposdos parmetros

  • 7/24/2019 10 - Subprogramas

    33/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    dos parmetros

    ! C e C++: as funes no podem ser passadas como parmetros, masponteiros para funes podem

    ! FORTRAN 95 possui um mecanismo para fornecer tipos de parmetrospara subprogramas que so passados como parmetros

    ! Ada no permite que subprogramas sejam passados comoparmetros; a funcionalidade fornecida pelos recursos de tipos

    genricos

    Parmetros que so subprogramas: ambiente dereferenciamento

  • 7/24/2019 10 - Subprogramas

    34/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    referenciamento

    ! Vinculao rasa (shallow binding): O ambiente da sentena dechamada que chama o subprograma passado

    !

    Vinculao profunda (Deep binding): O ambiente da definio dosubprograma passado

    ! Vinculao ad hoc (Ad hoc binding): O ambiente da sentena dechamada que passou o subprograma como um parmetro real

    Subprogramas sobrecarregados

  • 7/24/2019 10 - Subprogramas

    35/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! Umsubprograma sobrecarregado um subprograma que possui omesmo nome de outro subprograma no mesmo ambiente de

    referenciamento! C++, Java, C# e Ada incluem subprogramas sobrecarregados

    pr-definidos

    ! Em Ada, o tipo de retorno e uma funo sobrecarregada podem ser

    usados para desambiguar chamadas (logo, duas funessobrecarregadas podem ter o mesmo perfil de parmetros e diferiremapenas em seus tipos de retorno)

    ! Ada, Java, C++ e C# permitem aos usurios escrever mltiplas versesde subprogramas com o mesmo nome

    Subprogramas genricos

  • 7/24/2019 10 - Subprogramas

    36/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! Um subprograma genricoou polimrficorecebe parmetros dediferentes tipos em diferentes ativaes

    !

    Subprogramas sobrecarregados fornecem um tipo particular depolimorfismo chamado de poliformismo ad hoc

    ! O polimorfismo paramtrico fornecido por um subprograma querecebe parmetros genricos que so usados em expresses de tipo

    que descrevem os tipos dos parmetros do subprograma

    Subprogramas genricos (continuao)

  • 7/24/2019 10 - Subprogramas

    37/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! Ada

    !Ada fornece polimorfismo paramtrico por meio de uma construo que

    suporta a construo de mltiplas verses de unidades de programas paraaceitar parmetros de diferentes tipos de dados

    ! Subprogramas genricos so precedidos pela clusula generic, que lista

    as variveis genricas

    Subprogramas genricos (continuao)

  • 7/24/2019 10 - Subprogramas

    38/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! C++

    ! Verses de um subprograma genrico so criados implicitamente quando o

    subprograma nomeado em uma chamada ou quando seu operador tem oendereo &

    ! Subprogramas genricos so precedidos pela clusula template, que

    lista as variveis genricas

    Subprogramas genricos (continuao)

  • 7/24/2019 10 - Subprogramas

    39/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! Java 5.0

    ! Diferenas entre genricos em Java 5.0 e aqueles em C++ e Ada:

    1.

    Parmetros genricos em Java 5.0 podem ser classes

    2. Mtodos genricos em Java 5.0 so instanciados apenas uma vez, como

    mtodos realmente genricos

    3.As restries podem ser especificadas na faixa de classes que podem ser

    passados para o mtodo genrico como parmetros genricos

    4.

    Tipos coringas de parmetros genricos

    Subprogramas genricos (continuao)

  • 7/24/2019 10 - Subprogramas

    40/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! C# 2005

    ! Similares em termos de recursos queles de Java 5.0

    !

    Uma diferena: os parmetros de tipo reais em uma chamada podem seromitidos se o compilador puder inferir o tipo no especificado

    Exemplos de poliformismo de parmetros: C++

  • 7/24/2019 10 - Subprogramas

    41/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    template

    Type max(Type first, Type second) {

    return first > second ? first : second;

    }

    !

    O modelo acima pode ser instanciada para qualquer tipo em que ooperador > definido

    int max (int first, int second) {

    return first > second? first : second;}

    Questes de projeto para funes

  • 7/24/2019 10 - Subprogramas

    42/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! Os efeitos colaterais so permitidos?!

    Os parmetros para funes devem ser sempre parmetros no modo de entrada

    ! Que tipos de valores podem ser retornados?! A maioria das linguagens de programao imperativas restringe os tipos que

    podem ser retornados

    ! C permite que quaisquer tipos, exceto matrizes e funes

    ! C++ tambm permite tipos definidos pelo usurio

    !

    Em Ada, subprogramas podem retornar qualquer tipo, mas no podem serretornadas a partir de funes

    !

    Mtodos em Java e C# podem retornar qualquer tipo

    !

    Em Python e Ruby, mtodos so objetos que podem ser tratados como qualquer

    outro

    !

    Lua permite funes retornaram mltiplos valores

  • 7/24/2019 10 - Subprogramas

    43/48

    Corrotinas

  • 7/24/2019 10 - Subprogramas

    44/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! Uma corrotina um subprograma especial que possui mltiplasentradas; as corrotinas chamadora e chamada esto em um

    relacionamento mais igualitrio! A invocao de uma corrotina chamada de uma continuao em

    vez de uma chamada

    ! Na verdade, o mecanismo de controle das corrotinas

    frequentemente chamado de modelo de controle de unidadessimtrico

    ! Corrotinas fornecem execuo de quasi-concorrncia de unidadesde programas

  • 7/24/2019 10 - Subprogramas

    45/48

    Sequncias de controle de execuo possveis

  • 7/24/2019 10 - Subprogramas

    46/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Sequncia de execuo de corrotinas com laos

  • 7/24/2019 10 - Subprogramas

    47/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    Resumo

  • 7/24/2019 10 - Subprogramas

    48/48

    Prof. Antonio Luiz Cavalcanti Tj Paradigmas de Linguagens de Programao

    ! Uma definio de subprograma descreve as aes representadas pelosubprograma

    !

    Subprogramas podem ser funes ou procedimentos

    ! Variveis locais em subprogramas podem ser dinmicas da pilhaou estticas

    ! Trs modelos fundamentais de passagem de parmetros: modo deentrada, modo de sada e modo de entrada e sada

    ! Algumas linguagens permitem sobrecarga de operatores

    ! Subprogramas podem ser genricos

    !

    Uma corrotina um subprograma especial que tem mltiplas entradas