Amarração e escopo

1.807 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.807
No SlideShare
0
A partir de incorporações
0
Número de incorporações
33
Ações
Compartilhamentos
0
Downloads
34
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Amarração e escopo

  1. 1. Amarração e escopo Prof: Sergio Souza Costa Adaptado de © 2004, Programming Language Design Concepts D.A. Watt, University of Glasgow
  2. 2. Sobre mim Sérgio Souza Costa Professor - UFMA Doutor em Computação Aplicada (INPE) prof.sergio.costa@gmail.com https://sites.google.com/site/profsergiocosta/home https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta http://www.slideshare.net/skosta/presentations?order=popular
  3. 3. Conteúdo ● Amarrações e ambientes. ● Escopo, estrutura de bloco e visibilidade. ● Declarações. ● Blocos.
  4. 4. Amarrações Expressões e comandos em linguagens de programação possuem identificadores. Amarração é associação entre um identificador e uma entidade, tais como valores, variáveis e funções. Cada declaração produz uma ou mais amarrações. Um ambiente de referenciamento ou namespace é um conjunto de amarrações. Cada expressão e ou comando é interpretado em um particular ambiente.
  5. 5. Amarrações: Identificador Identificadores são utilizados em um contexto mais amplo do que simplesmente em variáveis ● métodos, sub-programas, pacotes, módulos, classes, parâmetros Um identificador é uma string usada para identificar alguma entidade em um programa. Para ver onde cada linguagem utiliza identificadores, veja na gramática da linguagem: ● https://javacc.dev.java.net/servlets/ProjectDocumentList?folderID=110
  6. 6. Amarrações: Identificador - Formato ● Exemplos: ○ Fortran95: 31 caracteres ○ C89: sem limitação de tamanho (apenas os 31 primeiros são significativos) ○ C99: 61 primeiros significativos ○ Java, C#, Ada, C++: sem limite ■ Os implementadores podem colocar um limite ● Normalmente o limite é dado para reduzir o tamanho da tabela de símbolos ● Na maioria das linguagens o formato é: ○ letra_ (letra_ | digito)*
  7. 7. Amarrações: Identificador - Formato ● Algumas linguagens permitem espaços nos nomes das variáveis ○ Ex.: Soma dos Salarios, Variavel de teste (anteriores ao FORTRAN 90) ● Linguagens baseadas em C diferenciam minúsculas de maiúsculas ○ ROSE != Rose != rose ○ Pode levar a problemas de legibilidade e facilidade de escrita ■ parseInt != parseint = ParseInt ○ Uso de convenções de estilo
  8. 8. procedure p is z: constant Integer := 0; c: Character; procedure q (x: in Float) is c: constant Float := 3.0e6; b: Boolean; begin … end q; begin … end p; { b -> variavel booleana, c -> o numero real 3.0*106 , p -> um procedimento sem parametros, q -> procedimento com um parametro real, x -> uma variavel real, z -> o inteiro 0 } { c -> uma variavel caracter, p -> um procedimento sem parametros, q -> procedimento com um parametro real, z -> o inteiro 0 } Ambiente de referenciamento
  9. 9. Ambiente:  Atividade Qual o ambiente de cada ponto enumerado no programa C abaixo: int n; (1) void zero(){ (2) n=0; } (3) void inc(int d){ (4) n+=d; } (5) void main(int argc, char**argv){ (6) ... }
  10. 10. Escopo O escopo de uma declaração (ou de uma amarração) é a porção do programa no qual ela tem efeito. Em algumas linguagens antigas (tais como o Cobol), o escopo de cada declaração era todo o programa. Nas linguagens modernas existe o conceito de bloco, e o escopo de cada declaração é controlada por esta estrutura.
  11. 11. Bloco Um bloco é o elemento que delimita o escopo das declarações. Ele possui diferentes formas dependendo da linguagem ● C: bloco ({}), corpo de funções, unidades de compilação. ● Java: bloco ({}), corpo de métodos, declarações de classes, pacotes. ● Ada: bloco (declare … begin … end;), corpo de procedures, pacotes, tasks, etc. Uma estrutura bloco é a forma em que os blocos são arranjandos no programa.
  12. 12. Blocos monolíticos Algumas linguagens (como Cobol) possuem uma estrutura de blocos monolítica, o programa completo é um único bloco. O escopo de cada declaração é o programa todo. declaration of x declaration of z declaration of y declaration of x declaration of z declaration of y escopo de x, y, z
  13. 13. Estruturas de blocos simples Algumas linguagens (ex. Fortran) não permitem blocos dentro de outros blocos: declaration of x declaration of z declaration of y escopo de x escopo de y escopo de z
  14. 14. Estruturas de blocos aninhadas Linguagens modernas os blocos podem ser aninhadas dentro de outros blocos. declaration of x declaration of z declaration of y Escopo de x Escopo de y Escopo de z
  15. 15. Escopo e visibilidade Uma ocorrência da amarração acontece quando existe uma ocorrência de um identificador I, onde I está amarrado a alguma entidade X; Uma aplicação da ocorrência do identificador I é uma ocorrência de I, quando é feita dentro da entidade X na qual I está amarrada. A essa aplicação, nós dizemos que I denota X. Se a linguagem tem escopo estático, dizemos que toda aplicação da ocorrência de I deve corresponder a exatamente uma ocorrência da amarração de I.
  16. 16. procedure p is z : constant Integer := 0; c : Character; procedure q (x : in Float) is c : constant Float := 3.0e6; b : Boolean; begin … b … c … x … z … end q; begin … c … z … end p; Escopo e visibilidade: Exemplo
  17. 17. Ocultação Se um identificado I é declarado em dois diferente blocos, I denota uma diferente entidade em cada bloco. Se identificador I é declado em dois blocos aninhados, I denota uma entidade no bloco mais externo e uma diferente entidade no bloco mais interno. O bloco mais interno oculta o mais externo. declaração de x declaração de x declaração de x declaração de x X mais externo está oculto
  18. 18. Declarações ● Uma declaração é uma construção de programas que  será elaborada para produzir amarrações. ● Uma declaração pode ter efeitos colaterais (tais como a criação de uma variável). ● Uma definição é uma declaração onde o único é produzir amarrações.
  19. 19. Declarações Formas de declarações: ● tipo ● constant ● variable ● definições de procedimentos ● colaterais ● sequenciais ● recursivas
  20. 20. Declaração de tipo ● Uma  declaração de tipo amarra um identificador a um tipo. ● Uma definição de tipo amarra um identificador a um tipo existente. ● Alternativamente, uma declaração de tipo  pode introduzir um novo tipo distinto de todos já existentes
  21. 21. Exemplo C: Declaração de tipos ●“typedef …” amarra um identificador a um tipo existente: typedef char* Alpha; Alpha s; char* t; s = t; ●Enquanto “enum …”, “struct …”, ou“union …” amarra um identificador a um novo tipo: struct Book {Alpha title, int edition}; struct Author {Alpha name, int age}; Book b; Author a; a = b;
  22. 22. Exemplo Ada: Declaração de tipos Em Ada, sempre é definido um novo tipo : type Alpha is array (1 .. 32) of Character; type Book is record title: Alpha; edition: Integer; end record; type Author is record name: Alpha; age: Integer; end record; b: Book; a: Author; a := b; Ilegal
  23. 23. Exemplo Haskell: Declaração de tipos Amarra a um tipo existente (type): type Nome = String type Idade = Int type Aluno = (Nome,Idade) type Professor = (Nome,Idade) getName :: Aluno -> Nome getName (n,_) = n A função getName espera um aluno, porém ela aceitou X que é um professor.
  24. 24. Declaração de Constantes ●Uma declaração de constante amarra um identificador a um valor (constante). ●Em Ada, ela tem a forma: I : constant T := E; Onde amarra o identificador I ao valor da expressão E, que deve ser do tipo T. ●Algumas linguagens restringem a expressão E a um literal, ou a uma expressão que pode ser avaliada em tempo de compilação.
  25. 25. Declaração de variáveis ●Uma declaração de variável amarra um identificador a uma variável. ●Em Ada, tem a seguinte forma: I : T := E; Essa declaração cria uma variável de tipo T, amarra I para esta variável, e inicializa o seu valor pela expressão E. ●Em Ada, é possível renomear declaração de variáveis: I : T renames V; Isso amarra I a uma existente variável V.
  26. 26. Declaração de variáveis Ada: type Country is (UK, FR, …); pop : array (Country) of Natural; declare c : Country := …; p : Integer renames pop(c); begin … p := p + 1; … end;
  27. 27. Definição de procedimentos Uma definição de procedimento amarra um identificado a um procedimento. Na maioria das linguagens, podemos definir tanto procedimento quando funções. def hello(): print "Hello World!" return def multiply(a,b) product = a * b end multiply a b = a * b PYTHON RUBY HASKELL
  28. 28. Exemplo em Ada Definição de função: function even (n: Integer) return Boolean is begin return (n mod 2 = 0); end; Definição de procedimento: procedure double (n: in out Integer) is begin n := n * 2; end;
  29. 29. Composição de declarações Como compor um conjunto de declarações: ●  Colaterais ●  Sequenciais ●   Recursivas
  30. 30. Declaração colateral Uma declaração colateral tem o formato D1 and D2, onde as sub-declarações são independentes uma da outra. Incomum em linguagens imperativas, mais presente em linguagens funcionais. Exemplo ML val e = 2.7183 and pi = 3.1416
  31. 31. Declaração sequencial Uma declaração seqüencial tem o formato D1; D2,  onde D2 é considerada após D1 e amarrações produzidas por D1 podem ser usados em D2. type Nome = Array[0..30] of Char; Pessoa = record nome : Nome; idade : Integer; end;
  32. 32. Declarações recursivas Permite usar amarrações que ela mesmo produz: type Int_Node; type Int_List isaccess Int_Node; type Int_Node is record elem:Integer; succ:Int_List; end record;
  33. 33. Blocos Grupo de construções de um programa que delimita o escopo das declarações contidas nele.      Detalhando mais um pouco .... Tipos     Comandos     Expressões
  34. 34. Comando-bloco É uma forma de comando que contém uma declaração local (ou grupo de declarações) D e um subcomando C. As amarrações produzidas por D são usada somentes para execuções em C e essas amarrações sobrepõe qualquer amarração ao mesmo identificador no ambiente fora do bloco. São comuns em linguagens imperativas: C e Java: { D C } Ada: declare D begin C end;
  35. 35. Expressão-bloco É uma forma de expressão que contêm uma declaração local (ou grupo de declarações) D e um subexpressão E. As amarrações produzidas por D são usada somentes para avaliação em E e essas amarrações sobrepõe qualquer amarração ao mesmo identificador no ambiente fora do bloco.
  36. 36. Expressão-bloco - Haskell area r = let pi = 3.1415 r2 = r ^ 2 in pi * r2
  37. 37. Tempo da amarração O momento no tempo onde a amarração ocorre é chamado de tempo de amarração (binding time) ● Podem ocorrer em tempo de design da LP, de implementação, de compilação, de carga, de ligação, de execução
  38. 38. Tempo da amarração ● Por exemplo, o * é normalmente amarrado a operação de multiplicação em tempo de projeto da LP ● Um tipo de dado, tal como int em C, é amarrado a uma lista de valores em tempo de implementação da linguagem ● Variáveis em Java são amarradas a um tipo de dados em tempo de compilação. ● Uma variável é amarrado a uma célula de memória em tempo de carga. ● Variáveis declaradas em métodos em Java são amarradas a memória em tempo de execução. ● Uma chamada a outro pacote é amarrada a esse pacote em tempo de ligação.
  39. 39. Tempo da amarração ● Considere a seguinte sentença em C: count = count + 5 ● Exemplos de amarração: ○ O tipo de count é amarrado em tempo de compilação ○ A lista de valores possíveis para count é definida em tempo de projeto do compilador C ○ O significado do sinal + é determinado em tempo de compilação, quando o tipo dos operandos for determinado ○ A representação interna do literal 5 é amarrada em tempo de projeto do compilador. ○ O valor de count é amarrado em tempo de execução com esta sentença

×