Paradigmas de Linguagens de Programação Linguagem Imperativa 2 Augusto Sampaio e Paulo Borba Departamento de Informática Universidade Federal de Pernambuco Explorando Conceitos • Abstração – Função – Procedimento • Parametrização – Cópia – Definição – Nome Abstração em Programação • Processo pelo qual ignora-se detalhes irrelevantes, concentrando-se em idéias gerais ao invés de caracterizações delas • Definição de novas operações (conceitos) em um programa • Operação versus Implementação da mesma – O que? versus Como? Abstração em Linguagens • Uma abstração contém um objeto computável – Uma função contém uma expressão – Um procedimento contém um comando • Uma abstração pode ser invocada, resultando na execução do seu objeto computável Abstração de Função • Contém – uma expressão (como em LF1, ML, e Haskell) – expressão comando, ou um comando que retorna uma valor (como em Pascal e C) • Quando invocada avalia (executa) a sua expressão (comando) e dá como resultado o valor associado Abstração de Função • Abstração com identificador – Construída por uma declaração de função (como em Pascal, C, LF1, LF2, e ML) • Abstração sem identificador (anônima) – Construída por um valor função (como em LF2, ML, e Haskell) Abstração de Procedimento • Contém um comando • Quando invocada executa o seu comando, lendo e atualizando variáveis • Normalmente tem um identificador associado: – construída por uma declaração de procedimento Outras Abstrações Princípio da abstração. É possível construir abstrações contendo outros tipos de objetos: – Acesso a variável (Id, Id.Id, Id[Id]) – Declarações Parametrização • Operações genéricas ou parametrizadas, cujos comportamentos variam de acordo com os parâmetros fornecidos • Abstrações podem ser parametrizadas em relação aos valores ou variáveis que ela manipula Parâmetros e Argumentos • Argumento – Valor fornecido para a execução do objeto da abstração • Parâmetro formal – Identificador utilizado na construção da abstração para denotar um argumento • Parâmetro real – Expressão cuja avaliação resulta em um argumento; fornecida na invocação da abstração Parâmetros e Argumentos • Argumentos são valores da linguagem, mas – em certas linguagens nem todos valores podem ser argumentos (arquivos em Pascal) – funções e procedimentos nem sempre são valores (Pascal, LI2, e C) • Há vários mecanismos para associar argumentos a parâmetros formais antes da execução do objeto da abstração Mecanismos de Cópia • O parâmetro real é avaliado resultando no argumento • O parâmetro formal denota uma variável local à abstração • Variações: – Valor – Resultado – Valor-resultado Mecanismos de Cópia Valor (LF2, LI2, Java, Pascal, C, ML) – O argumento é copiado para a variável local antes da execução do objeto da abstração – A variável local pode ser não só inspecionada, mas também atualizada Mecanismos de Cópia Resultado – O argumento tem que ser uma referência para uma variável – O valor inicial da variável local não é determinado – No final da execução do objeto da abstração, o valor da variável local é copiado para a variável cuja referência foi recebida como argumento Mecanismos de Cópia Valor-resultado – O argumento tem que ser uma referência para uma variável – O valor da variável associada ao argumento é copiado para a variável local antes da execução do objeto da abstração – No final da execução do objeto da abstração, o valor da variável local é copiado para a variável cuja referência foi recebida como argumento Mecanismos de Cópia • Desvantagens: – Ineficiente do ponto de vista computacional – Válido apenas para tipos cujos valores possam ser atribuídos a variáveis • Vantagem: – Facilidade para entendimento do código Mecanismos de Definição • O parâmetro real é avaliado resultando no argumento • O parâmetro formal denota o identificador de uma declaração local à abstração • O argumento denota o corpo da declaração, que é associado (bound) ao identificador Mecanismos de Definição Declaração Parâmetros dec Id = Corpo; proc p(dec Id) = ...Id...; ... p(Corpo); Variações: – Constante – Definição (renomeação) de variável – Procedimento ou função Mecanismos de Definição Constante – Declaração: const Id = Expressão; – O argumento é um valor – Id denota este valor no escopo do objeto da abstração – Id não é uma variável, como em parâmetro por valor, consequentemente tem o mesmo valor durante a execução do objeto da abstração Mecanismos de Definição Definição de Variável (Referência) – Declaração: var Id = AcessoVariável; – O argumento é uma referência para uma variável – Id denota esta variável no escopo do objeto da abstração – Qualquer leitura ou atualização feita com Id é uma leitura ou atualização da variável Mecanismos de Declaração • Desvantagens: – Aliasing; dois identificadores associados a uma mesma variável – n := 1; n := n + m n := 1 + m – Dificulta entendimento do código • Vantagens: – Semântica uniforme e simples; válido para todos os tipos de valores – Eficiente (exceto para sistemas distribuídos) Mecanismo de Ordem Normal Nome – O parâmetro real não é avaliado antes do início da execução do objeto da abstração – Não há argumento! – O parâmetro formal é substituído pelo parâmetro real no objeto da abstração • trocando os nomes de variáveis locais para evitar conflitos de nomes – O objeto resultante é executado Mecanismo de Ordem Normal • Desvantagens: – O parâmetro real pode ser avaliado várias vezes (exceto com Lazy evaluation, válido para linguagens sem efeitos colaterais) – Ineficiente, em geral – Dificulta entendimento do código • Vantagens: – O parâmetro real é avaliado sob demanda – Operações não estritas (Church-Rosser) Leitura • Programming Language Concepts and Paradigms – Capítulo 5 Exercícios e Projetos • Estenda a Linguagem Imperativa 2 com os seguintes recursos: – Passagem de parâmetros por resultado, valorresultado, constante, referência, e nome – Funções como em Pascal ou C – Comando como expressões, como em C – Procedimentos de alta ordem – Blocos como em C ou Pascal