Você está na página 1de 25

Linguagens de Programao

Captulo IV Nomes, Vinculaes, Verificao de Tipos e Escopos


Baseado em Conceitos de Linguagens de Programao 4 Edio Robert W. Sebesta Bookman

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 1

Tpicos
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Introduo Nomes Variveis O Conceito de Vinculao Verificao de Tipos Tipificao Forte Compatibilidade de Tipos Escopo Escopo e Tempo de Vida Ambientes de Referenciamento Constantes Inicializao de Variveis
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 2

1. Introduo

As linguagens de programao imperativas so baseadas na arquitectura de Von Neumann. Os espaos de memria utilizados pelas variveis so diferentes, de acordo com a especificao do tipo de varivel (propriedade mais importante da varivel).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 3

Mquina de von Neumann


1050 1051 1052 1053 1054 2010 2011 2012 dado 1 dado 2 dado 3 dado 4 instruo instruo instruo

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 4

2. Nomes

Principais consideraes acerca de nomes:


Qual o comprimento mximo de um nome? Quais os caracteres de conexo ($ ? # @ ~; : / \ | ...) que podem ser utilizados em nomes? Os nomes fazem distino entre maisculas e minsculas? As palavras especiais so:

Palavras reservadas? ou Palavras-chave?


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 5

Nomes

(cont.)

Um Nome uma palavra utilizada para identificar uma entidade de um programa. As primeiras L.P. utilizavam nomes com apenas 1 carcter, pois eram basicamente matemticas. Exs. de comprimentos mximos de nomes:

FORTRAN I: mximo 6 caracteres COBOL: mximo 30 caracteres FORTRAN: 90 e ANSI C: mximo 31 caracteres Ada: no tem limite, e todos so significativos C++: no tem limite, mas as implementaes sim.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 6

Nomes

(cont.)

Caracteres de conexo ($ ? # ~; : / \ | _ etc.)


Pascal, Modula-2, Fortran no permitem As L.P. mais recentes permitem

Distino entre letras Maisculas e Minsculas

Em C, C++, Java e Modula-2 os nomes so sensveis s letras maisculas e minsculas; Os nomes em muitas das outras linguagens no so sensveis.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 7

Nomes

(cont.)

A sensibilidade a letras maisculas e minsculas tem a seguinte desvantagem: Nomes que parecem iguais so diferentes (problema de legibilidade). Ex.: Em C++ os seguintes nomes so distintos: rest, Rest, ResT, REST, PIOR problema de legibilidade: Em C++ e Java, os nomes pr-definidos utilizam uma mistura de letras maisculas e minsculas. ex.: IndexOutOfBoundsException()

Alias: Muitas vezes so utilizados nomes diferentes para referir a mesma entidade

Ex. em linguagem C: typedef int myint; - int e myint so nomes diferentes que referem o mesmo tipo nmeros inteiros int .
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 8

Nomes

(cont.)

Palavras Especiais
So utilizadas para tornar programas mais legveis ao denominar aces. Na maioria das L.P., as palavras especiais so classificadas como reservadas, e em algumas, so somente palavras-chave.

Palavra reservada: independente do contexto e no pode ser utilizada como um nome.

Exemplo:

INTEGER REAL (No permitido se REAL for reservada) REAL INTEGER (No permitido se INTEGER reservada)
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 9

Nomes

(cont.)

Palavra-chave: uma palavra que pode tanto ser especial como no, dependendo do contexto onde est a ser utilizada.

Exemplo:

REAL AUXILIAR REAL REAL (Permitido se REAL for palavra-chave) REAL = 3.4 (Permitido se REAL for palavra-chave)

As Palavras-chave criam um problema de legibilidade.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 10

3. Variveis

Uma Varivel uma abstraco de uma ou mais clulas de memria de um computador. Uma varivel pode ser caracterizada atravs dos seguintes seis atributos:

Nome; Endereo; Valor; Tipo; Tempo de vida; Escopo.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 11

Variveis

(cont.)

Nome: identifica uma entidade.


Nem todas as variveis tm nome. ex.: variveis temporrias show( x+y )

Endereo: o endereo de memria qual est associada uma varivel. Os Aliases existem quando duas ou mais variveis apontam para o mesmo endereo de memria.

Os aliases so prejudiciais a uma boa legibilidade


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 12

Variveis

(cont.)

Tipo: determina a faixa de valores que a varivel pode conter, e o conjunto de operaes definidas para os valores deste tipo. Valor: o contedo da clula de memria associada varivel.
ex. Considere a seguinte atribuio: x := x ; x Left-value endereo da varivel x Right-value valor da varivel (ou expresso que evolui para um valor)

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 13

4. O Conceito de Vinculao

Uma vinculao (binding) uma associao entre uma operao e um smbolo, ou entre um atributo e uma entidade.

ex. associao entre operao de adio e o smbolo + ex. int total;

Associao dos atributos (nome, endereo, tipo, valor, etc.) varivel total.

O momento que realizada a vinculao chamado tempo de vinculao (binding time).

Exemplo:

O smbolo * normalmente vinculado operao de multiplicao no tempo de projecto da linguagem.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 14

Tempos de Vinculao

A vinculao pode acontecer nos seguintes tempos:


Projecto da linguagem (Language design time); Implementao da linguagem (implementao do interpretador/compilador/debuger/etc.) (Language implementation time); Durante a compilao (Compile time); Durante a ligao do programa s bibliotecas (Link); No momento carregamento do programa para execuo (Load time); No tempo de execuo (Run-time).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 15

Tempos de Vinculao
Exemplo de tempos de vinculao: int count = 1;

(cont.)

Vinculao no tempo de projecto da linguagem:


Conjunto de tipos possveis para count; Conjunto de valores possveis para tipo int; Conjunto de significados possveis para smbolo =. Representao interna em memria do nmero 1. Tipo de count; Significado do operador de atribuio =. Associao de count a um endereo de memria; Valor de count - operao de atribuio do nmero varivel.
Engenharia Informtica Linguagens de Programao 2002/2003

Vinculao no tempo de implementao da linguagem:

Vinculao no tempo de compilao


Vinculao no tempo de execuo


Pg. 16

Formas de Vinculao de Tipos


A vinculao do tipo de dados de uma varivel pode ser especificada de forma esttica ou dinmica. Vinculao esttica: quando a vinculao ocorrer antes do tempo de execuo e permanecer inalterada durante todo o tempo de execuo do programa. Vinculao dinmica: quando a vinculao ocorre durante a execuo ou alterada durante a execuo do programa.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 17

Vinculao Esttica de Tipos

Antes que uma varivel possa ser referenciada, esta deve ser vinculada a um tipo de dados, podendo ser efectuada atravs de:

Declarao explcita: especificado os nomes da variveis e os seus tipos. Declarao Implcita: no especificado o tipo da varivel, ele atribudo atravs de convenes pr-estabelecidas pela L.P.

Exemplo: se o nome iniciar com i,j,k,l,m ou n ser implicitamente declarado como integer, caso contrrio ser do tipo real.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 18

Vinculao Dinmica de Tipos

O tipo no especificado por instruo de declarao, mas sim quando atribudo um valor para a varivel.

Vantagem:

Flexibilidade de programao, permitindo a criao de subprogramas genricos (independente do tipo de dados); A capacidade do compilador detectar erros diminuda; Custo elevado para implementao (verificao dinmica de tipo e interpretao do tipo); list = [12.55, 14.99, 7, 10]; list = 11.65;
Engenharia Informtica Linguagens de Programao 2002/2003

Desvantagens:

Ex. JavaScript:

Pg. 19

Vinculaes de memria

Reserva (Alocao) o nome dado a vinculao da varivel a uma ou mais clulas de memria disponvel (da pool de memria). Libertao (Desalocao) o processo de desvincular e devolver a clula de memria ao pool de memria disponvel. Tempo de vida de uma varivel o tempo durante o qual uma varivel est vinculada a uma localizao de memria especfica.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 20

10

Vinculaes de memria

(cont.)

As vinculaes de memria a variveis, podem ser divididas em quatro categorias de acordo com o seu tempo de vida:

Variveis Variveis Variveis Variveis

Estticas Pilhas-Dinmicas Heap-Dinmicas Explcitas Heap-Dinmicas Implcitas

Heap: um conjunto de clulas de memria, desorganizada devido a imprevisibilidade da sua utilizao.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 21

Vinculaes de memria

(cont.)

Variveis Estticas: so vinculadas a clulas de memria antes do incio de execuo do programa, e permanecem associadas s mesmas clulas at o programa terminar. Vantagens:

No existe custo de reservar e libertar memria; Definio de variveis sensveis histria. Endereamento directo de memria (+ rpido).

Desvantagens:
Reduzida flexibilidade na gesto das variveis; A existncia unicamente de variveis estticas no permite recursividade. ex.: C, C++ e Java (usando o especificador static).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 22

11

Vinculaes de memria

(cont.)

Variveis Pilhas-Dinmicas: a associao efectuada em tempo de execuo, na instruo de declarao, e permanece inaltervel at o fim do programa. Vantagens:

Permite recursividade.

Desvantagens:
Custo das operaes de reserva e libertao implcita de memria; ex.: C, C++ (variveis normais): int sum, total;

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 23

Vinculaes de memria

(cont.)

Variveis Heap-Dinmicas Explcitas: as variveis so reservadas e libertadas de memria em tempo de execuo por declaraes explcitas do programador.

Vantagens:

Desvantagens:

Gesto dinmica da memria. Custo das operaes de reserva e libertao de memria; A utilizao de apontadores no segura.

Em JAVA todos os objectos so variveis heap-dinmicas explicitas.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 24

12

Vinculaes de memria

(cont.)

Ex. C++ (Vinculao efectuada atravs de apontadores):


// declarao de um apontador para caracteres

char * buffer; // ...


//reservar espao em memria para 500 caracteres

buffer = new char[500]; // ...


// libertar a memria reservada

delete [ ] buffer;
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 25

Vinculaes de memria

(cont.)

Variveis Heap-Dinmicas Implcitas: so reservadas no momento em que lhe so atribudas valores e libertadas por meio de instrues explcitas. Por vezes so nomes que se adaptam a diferentes tipos de variveis. Vantagens:

Elevado grau de flexibilidade do tipo de varivel, permitindo definir cdigo muito genrico. Ineficiente porque todos os atributos da varivel so dinmicos; Dificuldade de deteco de erros por parte do compilador.
Engenharia Informtica Linguagens de Programao 2002/2003

Desvantagens:

Pg. 26

13

5. Verificao de Tipos

Verificao de tipos: a actividade que assegura que os operandos de um operador so de tipos compatveis. Um tipo compatvel o mesmo do operador ou com permisso da linguagem, um tipo que pode ser convertido no tipo do operador. A operao de converso automtica de um tipo noutro, designa-se por coero. Um erro de tipo, a aplicao de um operador a um tipo no compatvel.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 27

Verificao de Tipos

Se as vinculaes de variveis de uma linguagem forem estticas, a verificao de tipos poder ser efectuada em tempo de compilao. A vinculao dinmica de tipos requer a verificao de tipo em tempo de execuo.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 28

14

6. Tipificao Forte

Linguagem fortemente tipificada: uma linguagem na qual possvel detectar todos os erros de tipos durante o processo de compilao. Vantagens:

Deteco da utilizao indevida de variveis que resultam em erros de tipo. ADA, ML e Java
Engenharia Informtica Linguagens de Programao 2002/2003

Linguagens fortemente tipificadas:

Pg. 29

7. Compatibilidade de Tipos

Quando duas variveis so de tipos compatveis, qualquer uma delas pode ter seu valor atribudo outra. Existem dois mtodos diferentes de compatibilidade de tipos:

Compatibilidade de Nome Compatibilidade de Estrutura

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 30

15

Compatibilidade de Nome

Compatibilidade de Nome: Variveis possuem tipos compatveis se estiverem na mesma declarao ou em declaraes que usem o mesmo nome de tipo.

Vantagens:

mais fcil de implementar. altamente restritiva:

Desvantagens:

Ex. em Pascal: Sub-faixas do tipo inteiro no so compatveis com o tipo inteiro.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 31

Compatibilidade de Nome

(cont.)

Ex. em C++:
// todas as variveis so de tipos compatveis: int x, y, z; // (mesma declarao) int w; // (mesmo tipo de nome das variveis x, y, z)

Ex. em Pascal:
// variveis de tipos no compatveis: type classification= 0...20; var first : integer; last : classification; first := last; -> erro semntico (incompatibilidade de tipos)
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 32

16

Compatibilidade de Estrutura

Compatibilidade de Estrutura: variveis tm tipos compatveis se os seus tipos tiverem estruturas idnticas. Vantagens:

mais flexibilidade. mais difcil de implementar.

Desvantagens:

Ex. em C (compatibilidade de estrutura):


char letraA = A; int ordemA = 65; letraA = ordemA; // ou ordemA = letraA; vlido
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 33

Compatibilidade de Estrutura

(cont.)

Em C++ e Java, a compatibilidade de objectos est relacionado com a hierarquia de herana (ver captulo 11). A linguagem C utiliza equivalncia de tipos por estrutura, enquanto o C++ utiliza equivalncia de nomes. Ex. em Pascal "Padro":
// No existe compatibilidade por estrutura: type type1 = array[1..50]; type2 = array[1..50]; type3 = real; type4 = real; type1 e type2 -> tipos incompatveis (no compatib. por estrut.) type3 e type4 -> tipos compatveis (compatibilidade de nome)
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 34

17

Inferncia de Tipo

Inferncia de tipo: capacidade que a linguagem tem para determinar os tipos das variveis tendo em considerao o contexto em que encontram-se. Desta forma no necessrio especificar todos os tipos das variveis.
Exemplo em ML: fun area(l:int, w:int): int = l*w Funes equivalentes (por inferncia de tipo): fun area(l, w): int = l*w fun area(l:int, w) = l*w Situao de erro (impossvel inferir): fun area(l, w) = l*w
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 35

8. Escopo - Visibilidade

O escopo (scope) de uma varivel, representa a rea do programa onde esta visvel. Ex. em C e C++(escopo definido por bloco):
void foo (int x) { // incio do escopo de x int y; // incio do escopo de y x = y = 0; } // fim do escopo of x and y

As regras de escopo de uma L.P. determinam a forma como as referncias e nomes esto associadas a variveis.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 36

18

Escopo - Visibilidade

1. Procurar variveis localmente 2. Procurar em ordem crescente do escopo at encontrar uma declarao para o nome da varivel.

Algumas regras de escopo:

Escopos aninhados: definio de escopos dentro de outros, formando uma sequncia de escopos com sucessores e antecessores. A redefinio de uma varivel com o mesmo nome (num escopo interior) de uma j existente num escopo exterior, permite "esconder" a definio exterior.
C++, Pascal, ADA, etc. permitem o acesso a estas variveis escondidas em escopos exteriores.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 37

Escopo - Visibilidade

O escopo de uma varivel pode ser:


Esttico; Dinmico. Baseado no texto esttico do programa; Para associar uma referncia a uma varivel necessrio procurar a sua declarao; O escopo esttico pode ser determinado estaticamente antes da execuo (Load Time).
Engenharia Informtica Linguagens de Programao 2002/2003

Escopo Esttico

Pg. 38

19

Escopo Esttico Exemplo 1


int x = 0; void foo () { x++; } void bar () { int x = 0; foo (); } int main() { bar (); printf("%d",x); }
Pg. 39

Considere o seguinte programa em linguagem C. Qual o resultado do programa 0 ou 1?

Engenharia Informtica Linguagens de Programao 2002/2003

Escopo Esttico Exemplo 2

Blocos mtodo para criar novos escopos dentre de um programa.

Considere o seguinte programa em C++.

Qual o resultado da aplicao?

int i = 0; // varivel global ao modulo int main() { int i = 5; { int j = 10; { int k = 15; cout << "i = " << i << endl; cout << "j = " << j << endl; cout << "k = " << k << endl; } // k termina aqui } // j termina aqui cout << "i = " << i << endl; cout << "j = " << j << endl; cout << "k = " << k << endl; return 0; }

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 40

20

Escopo Esttico Exemplo 3


Considere o seguinte programa em Pascal Padro (escopo esttico).

program exemplo; var x: integer; procedure sub1; begin x := 1; (1) end; procedure sub2; var x: integer; begin x := 2; (2) end; begin x := 3; (3) sub1(); sub2(); writeln(x); end.

Qual o resultado do programa 1 ou 2 ou 3?

(1) Varivel x global (2) Varivel x de sub2 (3) Varivel x global


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 41

Escopo Esttico - Avaliao

As variveis globais so visveis a todos os procedimentos/funes/mtodos;

Dificulta futuras modificaes ao programa;

Soluo para o escopo esttico: encapsulamento; A maioria das linguagens imperativas utilizam escopo esttico: Pascal, C, C++, Java, Ada, etc..
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 42

21

Escopo Dinmico

O escopo dinmico baseia-se na sequncia de chamadas de subprogramas e pode ser determinado somente em tempo de execuo. Para associar uma referncia a uma varivel necessrio procurar a sequencia de invocao at encontrar a sua declarao.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 43

Escopo Dinmico Exemplo 1


Considere o seguinte programa em Pascal (escopo dinmico).

program exemplo; var x: integer; procedure sub1; begin x := x + 1; end; procedure sub2; var x: integer; begin sub1(); end; begin x := 1; (1) sub1(); (1) sub2(); (2) writeln(x); end.

Qual o resultado do programa 1 ou 2 ou 3?

(1) Varivel x global (2) Varivel x de sub2


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 44

22

Escopo Dinmico - Avaliao

Programas menos confiveis que os de escopos estticos; Problemas com a legibilidade do programa; Execuo mais lenta; Menos utilizado que o escopo esttico; Linguagens que utilizam escopo dinmico: Smalltalk, APL, SNOBOL.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 45

9. Escopo e Tempo de Vida

Escopo e tempo de vida no esto directamente relacionados. No exemplo:

Exemplo em linguagem C: void foo () { static int y; ... } int main() { int x; foo (); }

Escopo da varivel x no se estende para a funo foo(); Tempo de vida da varivel x, estende-se para a funo foo(). Escopo de y vlido na funo foo(); Tempo de vida de y estende-se por todo o programa.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 46

23

10. Ambientes de Referenciamento

O ambiente de referenciamento de uma instruo o conjunto de todos os nomes visveis na instruo. No escopo esttico, o ambiente de referenciamento constitudo de todas as variveis declaradas em seu escopo local, conjuntamente com o conjunto de todas as variveis de seus escopos ascendentes visveis.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 47

Ambientes de Referenciamento
No exemplo ao lado, os ambientes de referenciamento em cada ponto do programa: (1): x e y de sub1 e a e b de exemplo. (2): x de sub3 e a e b de exemplo. (3): x de sub2 e a e b de exemplo. (4): a e b de exemplo

program exemplo; var a,b: integer; procedure sub1; var x,y: integer begin (1) end; procedure sub2; var x: integer procedure sub3; var x: integer begin (2) end; begin (3) end; (4)

begin end;

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 48

24

11. Constantes

Uma constante uma varivel vinculada a um valor no momento em que vinculada a uma clula de memria. O valor das constantes no pode ser alterado. Ajudam na legibilidade e confiabilidade do programa.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 49

12. Inicializao de Variveis

A vinculao de uma varivel a um valor, no momento em que vinculada a uma clula de memria, designado por inicializao. Exemplos:

Fortran:

REAL PI INTEGER SOMA DATA SOMA /0/, PI /3,14159/ SOMA: INTEGER : = 0;

Ada:

Pascal no oferece meios de se inicializar variveis, excepto durante a execuo das instrues de atribuio.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 50

25