Variáveis

581 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
581
No SlideShare
0
A partir de incorporações
0
Número de incorporações
14
Ações
Compartilhamentos
0
Downloads
20
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Variáveis

  1. 1. Variáveis 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 http://www.slideshare.net/skosta/presentations?order=popular https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta
  3. 3. Roteiro ● Modelo simples de armazenamento. ● Variáveis simples e compostas. ● Atribuição: Cópia Vs referência. ● Tempo de vida. ● Ponteiros.
  4. 4. Variáveis e Armazenamento Comandos Expressões com efeitos colaterais Implementação
  5. 5. Variáveis O conceito de variável depende do paradigma de programação.
  6. 6. Variáveis O conceito de variável depende do paradigma de programação. Em linguagens logicas e funcionais (como na matemática), uma variável é um valor fixo, porém desconhecido.
  7. 7. Variáveis O conceito de variável depende do paradigma de programação. Em linguagens logicas e funcionais (como na matemática), uma variável é um valor fixo, porém desconhecido. Em linguagens imperativas (procedural ou OO), uma variável é um contêiner para valores, que podem ser acessados e atualizados.
  8. 8. Variáveis O conceito de variável depende do paradigma de programação. Em linguagens logicas e funcionais (como na matemática), uma variável é um valor fixo, porém desconhecido. Em linguagens imperativas (procedural ou OO), uma variável é um contêiner para valores, que podem ser acessados e atualizados. Tais variáveis podem ser usadas para modelar objetos do mundo real que mudam seus valores no tempo.
  9. 9. Variável pode ser visto como uma quádrupla: (endereço, identificador, tipo, valor)
  10. 10. Variável pode ser visto como uma quádrupla: (endereço, identificador, tipo, valor)
  11. 11. Variáveis int a, b; a = 10; b = 5; Endereço Identificador Tipo 1000 a int 1004 b int Valor 10 5
  12. 12. Armazenamento - Modelo ● Considere o seguinte modelo de armazenamento: ○ Uma memoria (store) é uma coleção de células, onde cada célula tem um endereço único. ○ Cada célula ou está alocada ou desalocada. ○ Cada célula contem um valor ou é indefinida (vulgarmente conhecido como lixo) não alocado 7 true 3.14 ? ‘X’ alocado indefinido
  13. 13. Variáveis simples e compostas Um valor simples é aquele que pode ser armazenado em uma única célula (tipicamente um valor primitivo ou pointeiro) Uma variável simples ocupa uma única célula Uma variável composta ocupa um grupo contíguos de célula.
  14. 14. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela.
  15. 15. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula.
  16. 16. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada.
  17. 17. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end;
  18. 18. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end;
  19. 19. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end; ? n
  20. 20. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end; 0 n
  21. 21. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end; 1 n
  22. 22. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end;
  23. 23. Variável composta Uma variável de um tipo composto tem a mesma estrutura, como o valor do tipo. Por exemplo: ● ● Um registro é uma tupla de variáveis componentes. Uma array é um mapeamento entre uma faixa de indices para um grupo de variáveis componentes. Variáveis componentes podem ser inspecionadas e atualizadas, totalmente ou seletivamente.
  24. 24. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end;
  25. 25. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end;
  26. 26. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today ? ? ? ? ? ?
  27. 27. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today ? ? ? ? 25 ?
  28. 28. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today ? ? dec ? 25 ?
  29. 29. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today 2004 ? dec ? 25 ?
  30. 30. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today 2004 2004 dec dec 25 25
  31. 31. Atualização total ou por seleção Uma variável composta é totalmente atualizado, se isso é feito em um único passo: struct Point {int x; int y;}; ... struct Point p = {10, 5}; Ou seletivamente: struct Point p; p.x = 10;
  32. 32. Arrays, estáticos, dinamicos, flexiveis Array estático é quando os limites dos seus índices são fixados no código do programa, ou seja, seu tamanho é definido em tempo de compilação. Array dinâmico é quando seus índices são fixadas no momento que a variável do array é criada. ○ Em Ada, a definição do tipo do array é fixa, mas não necessário definir os seus limites. Somente quando um array é criado que é definido os seus limites. Arrays flexíveis além de dinâmicos, podem ter seus limites alterado depois de uma atribuição;
  33. 33. Exemplo C: Array estático float v1[] = {2.0, 3.0, 5.0, 7.0}; float v2[10]; ... void print_vector (float v[], int n) { // Print the array v[0], …, v[n-1] in the form “[… … …]”. int i; printf("[%f8.2", v[0]); for (i = 1; i < n; i++) printf(" %f8.2", v[i]); printf("]"); } … print_vector(v1, 4); print_vector(v2, 10);
  34. 34. Exemplo Ada: Array dinâmico type Vector is array (Integer range <>) of Float; v1: Vector(1 .. 4) := (1.0, 0.5, 5.0, 3.5); v2: Vector(0 .. m) := (0 .. m => 0.0); ... procedure print_vector (v: in Vector) is -- Print the array v in the form “[… … …]”. begin put('['); put(v(v'first)); for i in v'first + 1 .. v'last loop put(' '); put(v(i)); end loop; put(']'); end print_vector; … print_vector(v1); print_vector(v2);
  35. 35. Exemplo Java: Array flexível Array variable declarations: float[] v1 = {1.0, 0.5, 5.0, 3.5}; float[] v2 = {0.0, 0.0, 0.0}; … v1 = v2; static void printVector (float[] v) { // Print the array v in the form “[… … …]”. System.out.print("[" + v[0]); for (int i = 1; i < v.length; i++) System.out.print(" " + v[i]); System.out.print("]"); } … printVector(v1); printVector(v2);
  36. 36. Questão Em Java, um array é flexível pois na verdade um array é um ponteiro para um objeto, que tem todos seus componentes. Quando fazemos uma atribuição estamos mudando um ponteiro? Então, array em C são ponteiros ? Então são flexíveis ?
  37. 37. Array em outras linguagens Lua, "arrays" são dinâmicos e flexíveis. Similar a Java, tambem são ponteiros para objetos. function printVetor (v) for i, v in pairs (v) do print (i, v) end end v1 = {10,5,6}; v2 = {10,5,6, 10, 15} v2 = v1 printVetor(v2)
  38. 38. Semânticas de atribuição O que exatamente acontece quando um valor composto é associado a uma variável do mesmo tipo ? Cópia, todos os componentes são copiados para a variável destino. Referência, a variável composta é um ponteiro ou referencia para o valor composto, uma atribuição muda essas referências. C e Ada adotam cópia. Java, JavaScript, Lua .. adota para valores primitivos, mas referência para objetos.
  39. 39. Exemplo Ada: Cópia type Date is record y: Year_Number; m: Month; d: Day_Number; end record; dateA: Date := (2004, jan, 1); dateB: Date; dateB := dateA; dateB.y := 2005; dataA dateB 2004 ? jan ? 1 ?
  40. 40. Exemplo Ada: Cópia type Date is record y: Year_Number; m: Month; d: Day_Number; end record; dateA: Date := (2004, jan, 1); dateB: Date; dateB := dateA; dateB.y := 2005; dataA dateB 2004 2004 jan jan 1 1
  41. 41. Exemplo Ada: Cópia type Date is record y: Year_Number; m: Month; d: Day_Number; end record; dateA: Date := (2004, jan, 1); dateB: Date; dateB := dateA; dateB.y := 2005; dataA dateB 2004 2005 jan jan 1 1
  42. 42. Exemplo Java: Referência class Date { int y, m, d; public Date (int y, int m, int d) { … } } Date dateR = new Date(2004, 1, 1); Date dateS = new Date(2004, 12, 25); dateR dateS 2004 2004 1 12 1 25 dateS = dateR; dateR.y = 2005;
  43. 43. Exemplo Java: Referência class Date { int y, m, d; public Date (int y, int m, int d) { … } } Date dateR = new Date(2004, 1, 1); Date dateS = new Date(2004, 12, 25); dateR dateS = dateR; dateR.y = 2005; 2004 1 1 dateS
  44. 44. Simulando referência Em Ada ou C, conseguimos o efeito de referência usando ponteiros. Em Ada, por exemplo: type Date_Pointer is access Date; Date_Pointer dateP = new Date; Date_Pointer dateQ = new Date; … dateP.all := dateA; dateQ := dateP;
  45. 45. Simulando cópia O efeito de cópia pode ser alcançado em Java ou outras linguagens, clonando o objeto: Date dateR = new Date(2004, 4, 1); dateT = dateR.clone();
  46. 46. Questão Como faço para simular referência para objetos primitivos em Java, JavaScipt, Lua ... ? Atividade: Simulem esse tipo de referência em Java.
  47. 47. Copia vs Referência Em chamadas de funções, a mesma semântica se aplica, dado que quando chamamos uma função estamos fazendo atribuições para as variáveis locais das funções. Esta afirmação é válida para a estratégia call-by-value. Por que linguagens funcionais purais devem usar a estratégia call-byname (avaliação preguiçosa) ?
  48. 48. Tempo de vida Toda variável é criada (ou alocada) em um dado momento e destruída (ou desalocada) em outro momento. Este tempo entre a criação ou destruição, é conhecido como tempo de vida da variável. Uma variável ocupa celulas na memoria somente durante o seu tempo de vida.
  49. 49. Tempo de vida O tempo de vida das variáveis globais é a execução do programa. O tempo de vida de uma variável local é o bloco a qual pertence. O tempo de vida de uma variável heap é arbitrário, limitado pela tempo de execução do programa. Ela pode ser criada e destruída (em geral) em qualquer momento. Seu acesso é feito através de ponteiros. ○ Diferentemente das variáveis locais e globais ela nao tem um identificador, somente endereço.
  50. 50. Exemplo C: variáveis globais e locais int g; void main () { int x1; float x2; . . . P(); . . . Q(); . . . } void P () { float y1; int y2; . . . Q(); . . . } // continuação void Q () { int z; . . . }
  51. 51. Exemplo JavaScript: variáveis globais e locais Em JavaScript uma variavel local é declarado com a palavra reservada "var", caso contrário ela é global. A variavel "a" é local e a "b" é global. function f () { var a = 10; b = 5;} Não existe variável local a bloco em JavaScript: function f () { if (true) { var b = 10; } console.log (b) // b é local a f; }
  52. 52. Exemplo Lua: variáveis globais e locais Similarmente, em Lua existe a palavra reservada "local": function f () local a = 10 b = 5; end f(); print (a, b) Já em Lua, existem variáveis locais a blocos: function f () if (true) then local a = 10 end print (a) end f()
  53. 53. Exemplo Lua: variáveis globais e locais Similarmente, em Lua existe a palavra reservada "local": function f () local a = 10 b = 5; end f(); print (a, b) Nestas linguagens dinâmicas as variáveis Já em Lua, existem variáveis locais a blocos: só existem a partir do momento que são function f () if (true) then local a = 10 end usadas. print (a) end f()
  54. 54. Variáveis Heap O heap é uma coleção de células organizada esparsamente na memória. Uma variável heap não tem identificador, apenas um endereço. ○ Uma variável de referência ou ponteiro é usada para acessar uma variável dinâmica do heap explícita
  55. 55. Variáveis Heap Em C++, o operador de alocação new usa um nome de tipo como operando. Em C é o malloc. Ao ser executado, uma var. din. do heap explícita é criada e um ponteiro para ela é criado. A vinculação da variável ao tipo de dados é feita em tempo de compilação A vinculação da variável ao armazenamento é feita em tempo de execução Algumas linguagens fornecem tanto um operador de alocação quanto de desalocação. ○ Em Java, não existe função para desalocar.
  56. 56. Variáveis Heap - C++ Exemplo: int *intnode; // Cria um ponteiro ... intnode = new int; // Cria a variável ... delete intnode; // Desaloca a variável
  57. 57. Exemplo Ada. Variáveis Heap procedure main is type IntNode; type IntList is access IntNode; type IntNode is record elem: Integer; succ: IntList; end record; odds, primes: IntList := null; function cons (h: Integer; t: IntList) return IntList is begin return new IntNode'(h, t); end; procedure A is begin odds := cons(3, cons (5, cons(7, null))); primes := cons(2, odds); end; procedure B is begin odds.succ := odds.succ.succ; end; begin … A; … B; … end;
  58. 58. Exemplo Ada. Variáveis Heap ● Após chamada e retorno de B: primes 2 3 5 odds 7 heap variables ● Após chamada e retorno de B: primes 2 3 5 7 odds sem referencia
  59. 59. Heap - Acessibilidade Uma variável heap é dita ser acessível se ela pode ser acessada por variáveis ponteiros, local ou global. O tempo de vida de uma variável extende da sua criação até: ○ ser destruída por um operador de desalocação, ex. delete ou free ○ quando ela se torna inacessível (coletor de lixo) ○ termino do programa.
  60. 60. Ponteiros Um ponteiro é uma referência a uma dada variavel, as vezes chamado de referência. Um ponteiro nulo é um tipo especial de valor de ponteiro que não se refere a nenhuma linguagem. Um ponteiro é essencialmente uma variavel cujo valor são endereços para outra variável na memória. Entretanto, cada ponteiro tem também um tipo que permite o compilador inferir o tipo da variável a qual ela aponta. int *p; Então, (*p) é do tipo inteiro.
  61. 61. Exemplo C - Ponteiros Expliquem o que está acontecendo, no código abaixo: long int a, b; a = 10; b = (long int)&a; *((int*)b) = 50; printf ("%d %ldn", a, b);
  62. 62. Exemplo C - Ponteiros Expliquem o que está acontecendo, no código abaixo: long int a, b; a = 10; b = (long int)&a; *((int*)b) = 50; Em printf ("%d %ldn", a, b); C, uma variável ponteiro é como qualquer outra, possui valores e operadores específicos (*, &, +)
  63. 63. Exemplo C - Ponteiros Expliquem o que está acontecendo aqui: struct Point { int x; int y;}; ... struct Point p; *((int*)(&p) ) = 20; *((int*)(&p) + 1 ) = 50; printf ("%d %d n",p.x, p.y);
  64. 64. Exemplo C - Ponteiros Expliquem o que está acontecendo aqui: struct Point { int x; int y;}; ... struct Point p; *((int*)(&p) ) = 20; *((int*)(&p) + 1 ) = 50; Similar printf ("%d %d n",p.x, p.y); a um array, um struct é uma área contígua da memória.
  65. 65. Exemplo C - Ponteiros Expliquem o que está acontecendo aqui: struct Point { int x; int y;}; ... void* pg; pg = (int*)malloc (sizeof (int)); (*(int*)pg) = 10; printf ("%d n", *(int*)pg); pg = realloc (pg, sizeof(struct Point)); (*(int*)pg) = 50; printf ("%d n", (*(struct Point*)pg).x);
  66. 66. Dangling pointer (ponteiro orfão) Um dangling pointer é um ponteiro para uma variável que não existe mais. Considerem este programa em C, o que está acontecendo aqui? int f (int **p) { int a; a = 10; *p = &a; } int f3 () { int b; printf ("%dn", b); } main () { ... f(&q); printf (">> %d n", *q); *q = 50; f3(); ... }
  67. 67. Dangling pointer (ponteiro orfão) C é inseguro, uma variável heap é destruída e seu ponteiro continua existindo podendo ser acessado por uma variável global, por exemplo. Ada é seguro, pois variáveis globais não podem armazenar ponteiros locais. Java é muito seguro, você não tem acesso direto aos ponteiros.
  68. 68. Ponteiros - Atividade Ponteiros são valores de primeira classe em C. Essa característica dá uma grande flexibilidade a linguagem. Com o uso do ponteiro genérico void* e ponteiros para função. Façam uma pesquisa sobre programação genérica em C usando este mecanismo e montem alguns exemplos.

×