Você está na página 1de 48

Subprogramas

[INF1125 PLP]

INF1125 Paradigmas de Linguagem de Programao

-------------------------------------------------------Prof. Antonio Luiz Cavalcanti Tj


tj@dei.unicap.br

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Nota
O s s l i d e s u t i l i z a d o s n e s s a
disciplina so uma adaptao
dos slides oficiais fornecidos pela
Editora Bookman para cursos
baseados no livro de Robert
Sebesta.
Esse curso segue a estrutura do
livro de Sebesta mudando em
alguns momentos apenas a
ordem de execuo do
contedo.
O p r o f e s s o r d a d i s c i p l i n a
entende que o livro de Sebesta
ainda uma das melhores obras
introdutrias sobre o assunto.
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
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

Prof. 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 execuo
do subprograma chamado
O controle sempre retorna para o chamador quando a execuo do
subprograma termina

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Definies bsicas
Uma definio de subprograma descreve a interface e as aes da
abstrao 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 o
subprograma 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 o
nmero, a ordem e os tipos de seus parmetros formais
O protocolo o perfil de parmetros mais, se for uma funo, seu tipo
de retorno

Prof. 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 inclui
seu corpo
Um parmetro formal uma varivel listada no cabealho do
subprograma e usado nele
Um parmetro real representa um valor ou endereo usado na
sentena de chamada do subprograma

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Correspondncia entre os parmetros reais


e 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

Prof. 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 disperso
annima 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

Prof. 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

sentena yield

def fibonacci(last)

first, second = 1, 1

while first <= last

yield first

first, second = second, first + second

end

end

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Procedimentos e funes
Existem duas categorias de subprogramas
Procedimento so 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

Prof. 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 definies
de 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 e
puderem ser aninhados, qual o ambiente de referenciamento de um
subprograma passado como parmetro?
Os subprogramas podem ser sobrecarregados?
Os subprogramas podem ser genricos?

Prof. 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

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Modelos semnticos de passagem


de parmetros
Modo de entrada
Modo de sada
Modo de entrada e sada

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Modelos de passagem de parmetros

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Modelos conceituais de transferncia


e dados
Um valor real copiado (movimento fsico)
Um caminho de acesso transmitido

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Passagem por valor


O valor do parmetro real usado para inicializar o parmetro formal
correspondente
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 armazenamento
adicional para o parmetro formal e o movimento pode ser custoso

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 entre
parmetros reais

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Passagem por valor-resultado


Modelo de implementao para parmetros no modo de entrada e
sada 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

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 necessrias
cpias nem espao duplicado)
Desvantagens
Acessos mais lentos (do que na passagem por valor) a parmetros formais
Potenciais efeitos colaterais (colises)
Apelidos podem ser criados

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 , na
prtica, textualmente substitudo pelo parmetro formal
correspondente em todas as suas ocorrncias no subprograma

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Implementando mtodos de passagem


de parmetros
Na maioria das linguagens contemporneas, a comunicao via
parmetros ocorre por meio da pilha de tempo de execuo
Passagem por referncia a mais simples de implementar; apenas seu
endereo deve ser colocado na pilha
Um erro sutil, mas fatal, pode ocorrer com parmetros com passagem
por referncia e passagem por valor-resultado: um formal
correspondente a uma constante pode ser trocado erroneamente

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Mtodos de passagem de parmetros das principais


linguagens
C
Passagem por valor
A passagem por referncia atingida por meio do uso de ponteiros como parmetros

C++
Inclui o tipo referncia para passagem por referncia

Java
Todos os parmetros tm passagem por valor
Parmetros objetos tm passagem por referncia

Ada
Trs modelos para transmisso de parmetros: de entrada, de sada e de entrada e sada
Parmetros declarados como de sada podem receber atribuies, mas no podem ser
referenciados; os em modo de entrada podem ser referenciados, mas no receber
atribuies; os do modo entrada e sada podem ser referenciados e receber atribuies

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Mtodos de passagem de parmetros das principais


linguagens (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 seu
real correspondente com ref

PHP: similar a C#
Perl: parmetros reais so implicitamente colocados em uma matriz
pr-definida chamada de @_
Python e Ruby usam passagem por atribuio (todos os valores de
dados so objetos)

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 no
requerem verificao de tipos
Em Python e Ruby, variveis no tm tipos (objetos sim), ento
verificao de tipos dos parmetros no possvel

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Matrizes multidimensionais como parmetros


Se uma matriz multidimensional passada para um subprograma e o
subprograma compilado separadamente, o compilador precisa
saber o tamanho declarado dessa matriz para construir a funo de
mapeamento de armazenamento

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Matrizes multidimensionais como


parmetros: C e C++
Matriz pode ser passada como um ponteiro, e as dimenses reais da
matriz podem ser includas como parmetros
A funo pode avaliar a funo de mapeamento de armazenamento
escrita pelo usurio usando aritmtica de ponteiros cada vez que um
elemento da matriz precisar ser referenciado

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Matrizes multidimensionais como


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

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Matrizes multidimensionais como


parmetros : Fortran
Os parmetros formais que so matrizes devem ter uma declarao
aps o cabealho
Para matrizes de dimenso nica, os ndices em tais declaraes
so irrelevantes
Mas para matrizes multidimensionais, os ndices em tais declaraes
permitem que o compilador construa a funo de mapeamento do
armazenamento

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Matrizes multidimensionais como


parmetros : Java e C#
Similar a Ada
Matrizes so objetos; elas so todas de uma nica dimenso, mas os
elementos podem ser matrizes
Cada matriz herda uma constante nomeada (length em Java,
Length em C#) que configurada para o tamanho da matriz quando
o objeto matriz criado

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Consideraes de projeto para passagens


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 de
tamanho significativo

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Parmetros que so subprogramas


s vezes, conveniente enviar os nomes de subprogramas como
parmetros
Questes:
1. Tipos de parmetros so verificados?
2. Qual o ambiente de referenciamento correto para um subprograma
enviado como parmetro?

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Parmetros que so subprogramas: verificao de tipos


dos parmetros
C e C++: as funes no podem ser passadas como parmetros, mas
ponteiros para funes podem
FORTRAN 95 possui um mecanismo para fornecer tipos de parmetros
para subprogramas que so passados como parmetros
Ada no permite que subprogramas sejam passados como
parmetros; a funcionalidade fornecida pelos recursos de tipos
genricos

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Parmetros que so subprogramas: ambiente de


referenciamento
Vinculao rasa (shallow binding): O ambiente da sentena de
chamada que chama o subprograma passado
Vinculao profunda (Deep binding): O ambiente da definio do
subprograma passado
Vinculao ad hoc (Ad hoc binding): O ambiente da sentena de
chamada que passou o subprograma como um parmetro real

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Subprogramas sobrecarregados
Um subprograma sobrecarregado um subprograma que possui o
mesmo 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 funes
sobrecarregadas podem ter o mesmo perfil de parmetros e diferirem
apenas em seus tipos de retorno)
Ada, Java, C++ e C# permitem aos usurios escrever mltiplas verses
de subprogramas com o mesmo nome

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Subprogramas genricos
Um subprograma genrico ou polimrfico recebe parmetros de
diferentes tipos em diferentes ativaes
Subprogramas sobrecarregados fornecem um tipo particular de
polimorfismo chamado de poliformismo ad hoc
O polimorfismo paramtrico fornecido por um subprograma que
recebe parmetros genricos que so usados em expresses de tipo
que descrevem os tipos dos parmetros do subprograma

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Subprogramas genricos (continuao)


Ada
Ada fornece polimorfismo paramtrico por meio de uma construo que
suporta a construo de mltiplas verses de unidades de programas para
aceitar parmetros de diferentes tipos de dados
Subprogramas genricos so precedidos pela clusula generic, que lista
as variveis genricas

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Subprogramas genricos (continuao)


C++
Verses de um subprograma genrico so criados implicitamente quando o
subprograma nomeado em uma chamada ou quando seu operador tem o
endereo &
Subprogramas genricos so precedidos pela clusula template, que
lista as variveis genricas

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Subprogramas genricos (continuao)


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

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Subprogramas genricos (continuao)


C# 2005
Similares em termos de recursos queles de Java 5.0
Uma diferena: os parmetros de tipo reais em uma chamada podem ser
omitidos se o compilador puder inferir o tipo no especificado

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Exemplos de poliformismo de parmetros: C++


template <class Type>
Type max(Type first, Type second) {
return first > second ? first : second;
}

O modelo acima pode ser instanciada para qualquer tipo em que o


operador > definido

int max (int first, int second) {


return first > second? first : second;
}

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Questes de projeto para funes


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 ser
retornadas 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

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Operadores carregados definidos pelos usurios


Os operadores podem ser sobrecarregados pelo usurio em Ada, C++,
Python e Ruby
Um exemplo em Ada
function "*" (A,B: in Vec_Type): return Integer is
Sum: Integer := 0;
begin
for Index in A'range loop
Sum := Sum + A(Index) * B(Index)
end loop
return sum;
end "*";

c = a * b; -- a, b, and c are of type Vec_Type

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Corrotinas
Uma corrotina um subprograma especial que possui mltiplas
entradas; 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 unidades
simtrico
Corrotinas fornecem execuo de quasi-concorrncia de unidades
de programas

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Sequncias de controle de execuo possveis

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Sequncias de controle de execuo possveis

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Sequncia de execuo de corrotinas com laos

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao

Resumo
Uma definio de subprograma descreve as aes representadas pelo
subprograma
Subprogramas podem ser funes ou procedimentos
Variveis locais em subprogramas podem ser dinmicas da pilha
ou estticas
Trs modelos fundamentais de passagem de parmetros: modo de
entrada, 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

Prof. Antonio Luiz Cavalcanti Tj

Paradigmas de Linguagens de Programao