Paradigmas de Programação Aula 6 Nomes, Vinculações, Verificação de Tipos e Escopos Prof.: Edilberto M. Silva http://www.edilms.eti.br Prof. Edilberto Silva / edilms.eti.br Introdução As linguagens de programação imperativas são baseadas na arquitetura de Von Neumann. Os espaços de memória utilizados pelas variáveis são diferentes, de acordo com a especificação do tipo de variável (propriedade mais importante da variável). dado 1 dado 2 d PP - Prof. Edilberto Silva - http://edilms.eti,br Nomes Considerações de projeto Tamanho máximo? Caracteres de conexão são permitidos? Sensível a maiúscula/minúscula? Palavras especiais são reservadas ou chaves? Tamanho FORTRAN I: máximo 6 / COBOL: máximo 30 FORTRAN 90 e ANSI C: máximo 31 Ada: sem limite, e todos são significantes PP - Prof. Edilberto Silva - http://edilms.eti,br Sensível a maiúscula/minúscula Desvantagem: legibilidade (nomes que parecem iguais são diferentes) Em Modula-2 nomes pré-definidos possuem letras maiúsculas e minúsculas (e.g. WriteCard) C, C++, Java, e Modula-2 nomes são sensíveis à caixa (alta e baixa) Nomes nas outras linguagens não são Palavras especiais Def: Uma palavra chave (keyword) é uma palavra que é especial somente em certo contexto Desvantagem: legibilidade pobre Def: Uma palavra reservada é uma palavra especial que não pode ser usada como nome definido PP - Prof. Edilberto Silva - http://edilms.eti,br Palavras Especiais São utilizadas para tornar programas mais legíveis ao denominar acções. Na maioria das L.P., as palavras especiais são classificadas como reservadas, e em algumas, são somente palavras-chave. Palavra reservada: é independente do contexto e não pode ser utilizada como um nome. Exemplo: INTEGER REAL (Não permitido – se REAL for reservada) REAL INTEGER (Não permitido – se INTEGER reservada) PP - Prof. Edilberto Silva - http://edilms.eti,br Variáveis Uma variável é uma abstração de um endereço de memória Variáveis podem ser caracterizadas por um 6-tuplas de atributos: nome, endereço, valor, tipo, tempo de vida e ambiente (escopo) Nome - nem toda variável o possui Endereço - o endereço de memória a que está associada. • Uma variável pode possuir endereços diferentes em tempos diferentes durante execução • Uma variável pode ter diferentes endereços em partes diferentes do programa. • Se dois nomes de variáveis podem ser usados para acessar PP - Prof. Edilberto Silva - http://edilms.eti,br Variáveis Endereço: é o endereço de memória à qual está associada uma variável. Os Aliases existem quando duas ou mais variáveis apontam para o mesmo endereço de memória. Os aliases são prejudiciais a uma boa legibilidade Nome: identifica uma entidade. Nem todas as variáveis têm nome. ex.: variáveis temporárias show( x+y ) PP - Prof. Edilberto Silva - http://edilms.eti,br Variáveis Tipo: determina a faixa de valores que a variável pode conter, e o conjunto de operações definidas para os valores deste tipo. n Valor: é o conteúdo da célula de memória associada à variável. n ex. Considere a seguinte atribuição: x := x ; x – Left-value – endereço da variável x – Right-value – v PP - Prof. Edilberto Silva - http://edilms.eti,br Variáveis Alguma das justificativas para se criar aliases não são mais válidas; e.g. reutilização de memória em FORTRAN. (Atualmente basta trocá-las por alocação dinâmica) Tipo - determina a amplitude de valores das variáveis e o conjunto de operações que são definidos para estes valores. Obs: no caso de ponto flutuante o tipo também determina a precisão PP - Prof. Edilberto Silva - http://edilms.eti,br Variáveis Valor - o conteúdo do local a que a variável está associada. Célula abstrata de memória ( Endereço) - a célula física ou conjunto de células associada a uma variável • Considere a atribuição: X := X • Como interpretar cada X? • O l-value de uma variável é o seu endereço • O r-value de uma variável é o seu valor PP - Prof. Edilberto Silva - http://edilms.eti,br Vinculação Uma vinculação (binding) é uma associação, entre um atributo e uma entidade ou entre uma operação e um símbolo Associação entre operação de somar e o símbolo '+' Associação dos atributos (nome, endereço, tipo, valor...) Tempo de vinculação ou associação (Binding time) é o tempo em que o vínc PP - Prof. Edilberto Silva - http://edilms.eti,br Tempos de Vinculação (binding Time) 1. Em tempo de projeto de linguagem --e.g., associação de operador com símbolo da operação 2. Em tempo de implementação associação do tipo pt. fl. Com sua representação 3. Em tempo de compilação associação de uma variável a seu tipo (C, Pascal, Java, etc) 4. Em tempo de carregamento associar em FORTRAN 77 uma variável a um endereço de memória (ou a C variável static ) 5. Em tempo de execução associar um variável local não estática a um endereço de memória; ou associa PP - Prof. Edilberto Silva - http://edilms.eti,br Tempo de Vinculação Exemplo de tempo de vinculação: seja a atribuição X := X + 10 Em tempo de definição de linguagem Estabelecer os possíveis tipos da variável X, por exemplo, real, inteiro, boleano, char, etc e/ou Permitir que programas definam novos tipos como em C, Pascal, ADA... Em tempo de compilação vincular X a um tipo por uma declaração explícita, ex: float X. Em algumas linguagens esta vinculação pode dar-se em tempo de execução, e.g. Smalltalk, Prolog, LISP. Em tempo de implementação vincular X a valores específicos. Se X for do tipo real, então seus valores, a qualquer instante da execução, é um valor do conjunto da seqüência de bits que representa um número real e depende do hardware que executará o programa. PP - Prof. Edilberto Silva - http://edilms.eti,br Tempos de Vinculação Em tempo de execução associar X a um valor específico, por exemplo, via uma atribuição. A atribuição X := X + 10 altera o vínculo de X. Representação da constante 10 Em tempo de definição podemos definir que será representa por pelo string 10 (carater “1” e “0”) ou por uma seqüência de bits em tempo a ser gerada em tempo de execução. Propriedades do operador + Em tempo de definição escolher + para representar adição. Em geral admite-se sobrecarga deste operador para representar adição em inteiros, rea PP - Prof. Edilberto Silva - http://edilms.eti,br Vinculação Importância da vinculação - Questões importantes Em tempo de compilação, classificado como vinculação mais cedo ou em tempo de execução, vinculação mais tarde? Vinculação mais cedo • menor flexibilidade da linguagem, e.g. Fortran, porém maior eficiência. Vinculação mais tardia PP - Prof. Edilberto Silva - http://edilms.eti,br Formas de Vinculação Um vínculo é estático ocorre antes do tempo de execução e permanece inalterado durante a execução do programa. Um vínculo é dinâmico se ocorre durante a execução ou pode ser alterado durante a execução do programa. Tipos de vinculações (Bindings) 1. Como um tipo é espec PP - Prof. Edilberto Silva - http://edilms.eti,br Vinculação Estática Uma declaração explicita é um comando de programa usado para declarar tipos de variáveis. Uma declaração implícita é um mecanismo de default para especificar tipos de variáveis (a primeira ocorrência da variável no programa) FORTRAN, PL/I, BASIC, e Perl possuem declarações implícitas Vantagem: escritabilidade Desvantagem: legibilidade PP - Prof. Edilberto Silva - http://edilms.eti,br Vinculação Dinâmica Especificado através de comando de atribuição, e.x. LIST = {2, 4, 6, 8}; Vantagem: flexibilidade (unidades genéricas de programas) independente de tipos de dados Desvantagens: 1. Custo alto (verificação dinâmica de tipo e interpretação do tipo) 2. Dificulda PP - Prof. Edilberto Silva - http://edilms.eti,br Vinculação de Memória Reserva (Alocação) - pegar uma célula de um conjunto livre de Células (Vinculação – Endereço) Liberação - colocar a célula de volta no conjunto de células livres O tempo de vida de uma variável é o tempo durante o qual ela está associada a uma particular célula de memória. As vinculações de memória a variáveis, podem ser, de acordo com o seu tempo de vida: Variáveis Estáticas / Variáveis Pilhas-Dinâmicas Variáveis Heap-Dinâmicas Explícitas/ Variáveis HeapDinâmicas Implícitas Heap: é um conjunt PP - Prof. Edilberto Silva - http://edilms.eti,br Vinculações de Memória Categorias Variáveis por tempo de vida 1. Estática--associada a célula de memória antes do início da execução e permanece associada à mesma célula durante toda a execução Vantagem: eficiência (endereçamento direto), suporte histórico de subprogramas Desvantagem: falta de flexibilidade (não permite recursão) PP - Prof. Edilberto Silva - http://edilms.eti,br Vinculações de Memória 2 . Pilha-dinâmica--associação de memória é realizada quando da declaração da variável. Se escalar, todos os atributos, exceto endereço, são associados em tempo de compilação Vantagem: • recursão; retém armazenamento Desvantagens: • Overhead de alocação e liber PP - Prof. Edilberto Silva - http://edilms.eti,br Vinculações de Memória 3. Heap-Dinâmico Explicito--Alocação e desativação por diretivas explicitas, especificadas pelo programador, em tempo de execução Referenciadas somente por apontadores e referências, objetos dinâmicos em C++ (via new and delete) e todos os objetos em Java int * intnode ...... intnode = new int; /* aloca uma célula */ ............. delete intnode; /* libera célula */ Vantagem: Gerenciamento dinâmico de memória Desvantagem: ineficiente e não seguro PP - Prof. Edilberto Silva - http://edilms.eti,br Vinculações de Memória 4. Heap Dinâmico Implícito - Alocação e liberação realizada por comandos de atribuição e.g. todas variáveis de APL Vantagem: Flexibilidade, código muito genérico Desvantagens: Ineficiente- todos os atributos são dinâmicos Perca de detecção de erro PP - Prof. Edilberto Silva - http://edilms.eti,br Verificação de Tipos Generalização do conceito de operandos e operadores para incluir subprogramas e atribuições. Verificação de tipo é a atividade que garante que operandos e operadores são de tipos compatíveis. Um tipo é compatível se for correto para o operador ou se for permitido conversão implícita, pelas regras da linguagem, pelo compilador. Esta conversão implícita automática é chamada coesão de tipos (coercion). Um erro de tipo é uma aplicação de um operador a um operando de tipo não apropriado Se todos os bindin PP - Prof. Edilberto Silva - http://edilms.eti,br Tipificação Forte Uma linguagem é fortemente tipada se podemos detectar todo de tipo de erro em tempo de compilação. Vantagem de fortemente tipada: detecção de uso indevido de variáveis que resultam em erros de tipo Obs: Poucas linguagens são fortemente tipadas Linguagens e tipagem forte: 1. FORTRAN 77 (Não é): parâmetros, EQUIVALENCE / 2. Pascal (Não é): variant records / 3. Modula-2 (Não é): variant records, tipo WORD / 4. C and C++ (Não são): verificação de tipo de parâmetro pode ser evitado em parâmetros; PP - Prof. Edilberto Silva - http://edilms.eti,br Inferência de Tipos Em algumas linguagens declaração de tipo não é necessária, o tipo pode ser inferido pelo contexto em que se encontra (ML) ou mesmo não sendo sendo necessário (LISP) Exemplo: ML fun area(l:int, w:int): int = l*w uso equivalente, por inferência de tipo: fun area(l, w): int = l*w fun area(l:int, w) = l*w fun area(l, w:int) = l*w Situação de erro, impossível inferir: fun area(l, w) = l*w PP - Prof. Edilberto Silva - http://edilms.eti,br Compatibilidade Tipos compatibilidade por nome - duas variáveis possuem tipos compatíveis se, ou estão na mesma declaração, ou em declarações que utilizam o mesmo nome de tipo. Fácil de se implementar mas altamente restritivo: Sub-faixas do tipo inteiro não são compatíveis com o tipo inteiro Parâmetros formais devem possuir o mesmo tipo dos correspondentes parâmetros atuais (Pascal) type indextype = 1..100; { um tipo subfaixa} var count : integer; index : indextype; Neste caso PP - Prof. Edilberto Silva - http://edilms.eti,br Compatibilidade de Tipo Compatibilidade por estrutura - duas ou mais variáveis possuem tipos compatíveis se seus tipos possuem estruturas idênticas. Maior flexibilidade, porém mais difícil de se implementar. Exemplos: Pascal padrão type celsius = real; fahrentheit = real tipo1 = array [1..10] of integer tipo2 = array [1..10] of integer tipo3 = tipo2; Celsius e fahrentheit => compatíveis tipo1 e tipo2 => não compatíveis significando que no Pascal padrão não existe compatibilidade por estrutura. Tipo3 PP - Prof. Edilberto Silva - http://edilms.eti,br Escopo O escopo de uma variável é o espaço, em termos de comandos, em que é visível (i.e onde pode ser utilizada) Variáveis não-locais de uma unidade de programa são aquelas que são visíveis mas não estão declaradas nesta uunidade. As regras de escopo de uma linguagem determinam como refe PP - Prof. Edilberto Silva - http://edilms.eti,br Escopos Escopo Estático Baseado no texto estático do programa Para se associar uma referência a uma variável deve-se encontrar sua declaração. Processo de pesquisa: pesquise declarações, primeiro localmente, em seguida em ordem crescente do escopo, até que uma declaração seja encontrada para um dado nome. Escopos aninhados forma uma cadeia de escopos com sucessores e antecessores. PP - Prof. Edilberto Silva - http://edilms.eti,br Constantes Def: Um constante é uma variável que está associada a um valor e a uma célula de memória. Vantagens: legibilidade e modificabilidade O vínculo de valor a nome de constante pode ser estático ( chamadas constantes explícitas) ou dinâmico Linguagens: Pascal: somente para literais Modula-2 e FORTRAN 90: constante-valoradas expressões Ada, C++, e Java: expressões de qualquer tipo PP - Prof. Edilberto Silva - http://edilms.eti,br Inicialização de Variáveis O vínculo de uma variável a um valor no momento em em que é vinculada a um endereço é chamado de inicialização Inicialização é freqüentemente feita no comando de declaração, por exemplo, em Ada SUM : FLOAT := 0.0; Pascal não oferece meios de se inicializar variáveis exceto em run-time por instruções de atribuição PP - Prof. Edilberto Silva - http://edilms.eti,br