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. Conteúdo
● Amarrações e ambientes.
● Escopo, estrutura de bloco e visibilidade.
● Declarações.
● Blocos.
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.
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. 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. 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. 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. 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. 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. 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. 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. 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;
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. 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. 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. 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. 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. 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.
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. 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. 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