notas-de-aula- Schneider
29 pág.

notas-de-aula- Schneider

Disciplina:Linguagens de Programação I260 materiais733 seguidores
Pré-visualização11 páginas
de parâmetros” mais o tipo de retorno se o
subprograma for uma função. Pode ser visto como o tipo do subprograma.

2.5.1.3 Parâmetros
São uma forma de fornecer os dados para o processamento de um subprograma. Deixam o
subprograma mais legível que o uso de variáveis externas. O escopo reduzido ajuda a evitar erros.
Eles também são usados para receber dados resultantes do processamento dos subprogramas.

Parâmetros podem ser dados ou subprogramas.

A vinculação entre parâmetros reais e formais por ser feita pela posição ou pelo nome. Em algumas
linguagens pode-se usar a duas formas ao mesmo tempo (ex.: Ada e Python).

Nem sempre é obrigatório usar todos os parâmetros. Nesse caso é preciso existir alguma regra a
respeito daqueles não vinculados.

Nem sempre é preciso definir um número fixo de parâmetros. Nesses casos, parâmetros são
geralmente vistos como elementos de um vetor ou lista.

São geralmente variáveis stack-dinâmicas.

2.5.1.4 Procedimentos e Funções
Procedimentos produzem resultados alterando estados de variáveis externas no programa (efeitos
colaterais) já que não retornam valor. As variáveis não são necessariamente visíveis no programa.
Por exemplo: o procedimento write do Pascal altera o estado da saída padrão, por isso podemos
dizer que sua execução altera variáveis externas apesar disso não ficar muito visível no programa.
Sabemos que essas variáveis são externas ao write pois outros procedimentos têm acesso à saída
padrão.

Funções são modelos das funções matemáticas mas que, ao contrário delas, podem apresentar
efeitos colaterais. São “substituídas” por um valor (ver 2.5.3.2) e geralmente usadas dentro de
expressões. Podem ser entendidas como operadores.

prof. Bruno Schneider 18

Notas de Aula de GCC105 - BCC e BSI - UFLA

As funções são mais genéricas que os procedimentos já que podem fazer tudo o que eles fazem e
ainda retornar um valor. Apesar disso, algumas linguagens reduzem ou limitam completamente (no
caso de linguagens não procedurais) a possibilidade de criação de efeitos colaterais numa função,
aproximado-as das funções matemáticas e tornando-as distintas dos procedimentos.

Em algumas linguagens (como C, C++ e Java) não existem procedimentos e as funções não
precisam fazer parte de uma expressão.

2.5.2 Ambientes de referência locais
Subprogramas são peças importantes do controle de escopo, indicando limites para a vinculação de
nomes.

Geralmente as variáveis locais são stack-dinâmicas. Para permitir maior velocidade, algumas
linguagens ainda usam a vinculação estática ao armazenamento, usando variáveis stack-dinâmicas
somente nos subprogramas recursivos. Em algumas linguagens é necessário declarar explicitamente
quando um programa é recursivo.

2.5.3 Métodos de passagem de parâmetros
Os parâmetros são uma forma boa de transmitir dados para dentro e para fora de um subprograma.
Os parâmetros formais podem ser usados para (a) receber dados dos parâmetros reais, (b)
transmitir dados para os parâmetros reais ou (c) ambos. Esses três modelos são conhecidos por (a)
modo entrada, (b) modo saída ou (c) modo entrada/saída.

2.5.3.1 Passagem por valor
O valor do parâmetro real é usado na inicialização do parâmetro formal. Esse, por sua vez, funciona
como uma variável local. Implementa o modo entrada.

É um método seguro, mas requer tempo e armazenamento extra para a cópia.

A passagem de ponteiros por valor pode ser confundida com a passagem por referência quando o
valor de uma variável é uma referência (ex.: ponteiros). Nesse caso, a passagem por valor pode
causar o mesmo efeito de uma passagem por referência (alteração do valor do parâmetro real). Na
linguagem Java, em que as variáveis podem ser referências, sem que isso fique explícito para o
programador, essa confusão é maior.

A passagem por valor deve ser preferida pelo programador nos casos em que se deseja o modo de
entrada e que a quantidade de informações passadas é pequena.

O livro texto usa as expressões "mudança física" e "transferência física" na explicação desta
implementação de passagem de parâmetros. Esses termos não foram definidos e costumam induzir
uma ideia inapropriada do processo de transferência de valores; eles devem ser evitados.

2.5.3.2 Passagem por resultado
O parâmetro funciona como uma variável local, cujo valor é copiado para o parâmetro real ao final
do subprograma. Implementa o modo saída.

O parâmetro real deve ser apropriado ao recebimento de valores, ou seja, deve estar associado a um
left value.

Pode causar problemas na ocorrência de colisão entre parâmetros reais (um único parâmetro real

prof. Bruno Schneider 19

Notas de Aula de GCC105 - BCC e BSI - UFLA

vinculado a dois ou mais parâmetros formais). Pode causar semântica ambígua em função do
momento em que se determina o endereço de retorno.

Assim como a passagem por valor, exige mais tempo e armazenamento.

Os compiladores costumam usar este método para retornar o valor de função. Esse retorno é um
parâmetro especial, no sentido de que ele não aparece junto dos outros parâmetros e o parâmetro
real não é vinculado a um nome. Isso ajuda na redução dos problemas do método.

2.5.3.3 Passagem por valor-resultado
É a cópia do valor para um armazenamento separado durante chamada e durante o encerramento do
subprograma. É uma implementação do modo entrada/saída.

Tem as desvantagens da passagem por valor e as da passagem por resultado.

2.5.3.4 Passagem por referência
Transfere uma referência (geralmente um endereço) ao invés do valor, de forma que o parâmetro
formal passa a ser um apelido (alias) do parâmetro real. É uma implementação do modo
entrada/saída.

Essa forma de passagem de parâmetros é tida como rápida porque uma referência é uma quantidade
pequena de informação e tem sempre o mesmo tamanho, independentemente do tamanho do valor a
que se refere. Entretanto, é possível que o tempo e espaço necessários para passagem de uma
referência sejam iguais ou maiores que os necessários para a cópia de um valor. Assim, a passagem
por referência de grandes quantidades de informação é mais rápida que a passagem por valor, o que
torna este método vantajoso mesmo em situações nas quais o programador deseja o modo de
entrada.

A passagem por referência cria efeitos colaterais e por isso deve ser evitada quando se deseja
apenas o modo entrada de pouca informação.

Da mesma forma que a passagem por resultado, pode causar problemas na ocorrência de colisão de
parâmetros reais. Pode criar apelidos (aliases) que dificultam a leitura do código (ex.: o parâmetro
pode ser um alias para uma variável global).

Apesar de ser bastante comum, costuma não ser oferecida por linguagens que escondem o
gerenciamento de memória do programador (ex.: Java).

Algumas linguagens permitem a passagem por referência constante, na qual o parâmetro formal é
tratado como constante, mesclando as vantagens deste método com a segurança do modo de entrada
(ex.: C++). Nas linguagem sem esse recurso, a passagem de uma constante por referência não deve
ser permitida pelo compilador, pois poderia permitir a alteração do valor de uma constante.

Na linguagem C++ é permitido dizer que o valor de retorno de uma função é passado por
referência.

2.5.3.5 Passagem por nome
A passagem por nome é muito diferente das outras formas. Nela, o parâmetro formal é textualmente
substituído pelo parâmetro real. Isso pode ser implementado de várias formas, com semânticas
diferentes.

Por exemplo, se o parâmetro real for uma expressão constante, pode-se usar uma implementação

prof. Bruno Schneider 20

Notas de Aula de GCC105 - BCC e BSI - UFLA

como a da passagem por valor (semântica de entrada). Se for uma variável, pode-se usar uma
implementação como a passagem por referência (semântica de entrada/saída).

2.5.4 Parâmetros que são nomes de subprogramas
Muitas