Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

<p>INSTITUTO DE INFORMÁTICA</p><p>Universidade Federal de Goiás</p><p>Variáveis: Nomes e Amarração</p><p>Linguagens e Paradigmas de Programação</p><p>Prof Bruno Silvestre</p><p>brunoos@inf.ufg.br</p><p>Introdução</p><p>● Linguagens imperativas são muito ligadas à abstração da máquina</p><p>de von Neumann</p><p>○ Memória e CPU</p><p>● Variáveis são a representação das células de memória</p><p>● Mudança de linguagem de máquina para Assembly teve um ganho</p><p>enorme</p><p>2</p><p>● Mudança de linguagem de máquina para Assembly teve um ganho enorme</p><p>○ Parar de usar endereços e usar nomes</p><p>○ Melhora na legibilidade e redigibilidade</p><p>■ Compilador tomou conta dos endereços</p><p>value = 12;</p><p>0x4782</p><p>Memória</p><p>mov 12, (0x4782)</p><p>12</p><p>Introdução</p><p>3</p><p>Introdução</p><p>● Em alguns casos, é forte a associação</p><p>○ variável → célula de memória</p><p>● Mas em outros não há relação direta</p><p>● Exemplos:</p><p>○ int x; // Associação direta</p><p>○ int y[4][4][5]; // Memória tridimensional?</p><p>4</p><p>Introdução</p><p>● Programador em geral pensa só na variável como área de memória</p><p>● Tem mais alguma coisa?!?</p><p>5</p><p>● Variáveis são caracterizadas por um conjunto de atributos</p><p>○ Nome</p><p>○ Endereço</p><p>○ Valor</p><p>○ Tipo</p><p>○ Tempo de vida</p><p>○ Escopo</p><p>class Variavel {</p><p>String nome;</p><p>Pointer</p><p>endereço;</p><p>Value valor;</p><p>Type tipo;</p><p>LifeCicle tempo;</p><p>Scope escopo;</p><p>}</p><p>Atributos das Variáveis</p><p>6</p><p>7</p><p>Nome da Variável</p><p>Nomes</p><p>● Nas linguagens de alto nível, os nomes são associados a funções, rótulos,</p><p>variáveis e outras construções</p><p>● Questões:</p><p>○ Qual o tamanho máximo de um nome?</p><p>○ Podem ser usados caracteres de conexão?</p><p>○ Há distinção entre maiúsculas e minúsculas?</p><p>○ As palavras especiais são palavras reservadas ou palavras-chave?</p><p>8</p><p>Tamanho do Nome</p><p>● Um nome é uma string de caracteres usada para identificar alguma</p><p>entidade de um programa</p><p>● As primeiras LPs usavam nomes de um único caractere</p><p>○ Isso ocorria por serem fundamentalmente matemáticas</p><p>● Fortran 95: até 31 caracteres</p><p>9</p><p>Tamanho do Nome</p><p>● C99: sem limite internamente, mas considera relevante somente os</p><p>63 primeiros caracteres. Símbolos externos são limitados a 31</p><p>caracteres (linker)</p><p>10</p><p>Tamanho do Nome</p><p>● Java, C#: sem limite</p><p>● C++: não especificado, mas limitado pela implementação (tamanho</p><p>da tabela de símbolos)</p><p>11</p><p>Forma do Nome</p><p>● Em praticamente toda linguagem atual, os nomes são compostos por letras,</p><p>números e o underline.</p><p>○ [a-zA-Z_][a-zA-Z0-9_]*</p><p>● Underline já foi muito usado, atualmente a notação “camel case” domina</p><p>○ A forma de escrita é estilo de programação, ou seja, não é forçado pelo compilador</p><p>12</p><p>Forma do Nome</p><p>● Outros formatos:</p><p>○ PHP: variáveis começam com '$'</p><p>○ Perl: de acordo com o tipo, o símbolo inicial pode ser '$', '@' ou '%'</p><p>○ Ruby: símbolo '@' para variáveis de instância e '@@' para variáveis classe</p><p>● Prejudicial?!?</p><p>13</p><p>my %fruit_color = (</p><p>apple => "red",</p><p>banana => "yellow"</p><p>);</p><p>my $animal = "camel";</p><p>my $answer = 42;</p><p>Tipo Escalar</p><p>my @animals = ("camel", "llama", "owl");</p><p>if (@animals < 5) { ... }</p><p>Forma do Nome: Perl</p><p>Tipo Hash</p><p>Tipo Hash</p><p>14</p><p>Forma do Nome</p><p>● Outros formatos:</p><p>○ PHP: variáveis começam com '$'</p><p>○ Perl: de acordo com o tipo, o símbolo inicial pode ser '$', '@' ou '%'</p><p>○ Ruby: símbolo '@' para variáveis de instância e '@@' para variáveis classe</p><p>● Uso desses símbolos ajuda a identificar melhor os elementos</p><p>do programa (legibilidade)</p><p>15</p><p>● Fortran (< 90) permite espaço no nome</p><p>● Exemplo:</p><p>○ “Sum Of Salaries” == “SumOfSalaries”</p><p>Forma do Nome</p><p>16</p><p>”Blank spaces are ignored in Fortran 77.</p><p>So if you remove all blanks in a Fortran 77</p><p>program, the program is still acceptable to a</p><p>compiler but almost unreadable to</p><p>humans…</p><p>Fonte:</p><p>https://en.wikibooks.org/wiki/Fortran_77_Tutorial</p><p>17</p><p>Forma do Nome</p><p>● Os nomes em C, C++ e Java são case sensitive</p><p>○ rose, Rose, rOse, rOSe, rosE (todos diferentes)</p><p>○ Camel Case: redigibilidade</p><p>■ nextInt() vs nextint()</p><p>● Prejudicial?!?</p><p>18</p><p>Forma do Nome</p><p>● Os nomes em C, C++ e Java são case sensitive</p><p>○ Nomes parecidos levam à suposição de relação entre eles: legibilidade</p><p>● Em Java:</p><p>○ List e list → mesma coisa?!?</p><p>● Em alguns casos, difícil de evitar:</p><p>○ métodos e classes padrões de Java e C# seguem a convenção camel case</p><p>19</p><p>20</p><p>Palavra Reservada</p><p>vs</p><p>Palavra-Chave</p><p>Palavras Especiais</p><p>● Usadas como unidades sintáticas</p><p>● Associar significado a alguns nomes</p><p>○ if, then, else, while, repeat, begin, end</p><p>● Melhorar a legibilidade do programa</p><p>○ { } @ # & ^ % -> ** ? .</p><p>● Em algumas linguagens, as palavras especiais são classificadas</p><p>como palavras reservadas, mas em outras são apenas palavras-</p><p>chave</p><p>21</p><p>Palavras Reservadas</p><p>● Não podem ser usadas como nomes no seu programa</p><p>● Muitas palavras reservadas atrapalham a programação</p><p>○ Memorizar</p><p>○ Restringem o vocabulário</p><p>22</p><p>● COBOL: ~ 300 palavras reservadas</p><p>○ LENGTH, COUNT, DESTINATION, BOTTON</p><p>Sobrou o que,</p><p>Rick?</p><p>23</p><p>Palavras</p><p>Reservadas</p><p>Palavras Reservadas</p><p>● Às vezes os nomes pré-definidos veem de bibliotecas, como C/C++ e Java</p><p>● Ao importar a biblioteca, não é possível redefinir os nomes</p><p>○ Exemplo: printf()</p><p>24</p><p>program numbers</p><p>real integer</p><p>integer real</p><p>real = 123</p><p>integer = 123.5</p><p>write (*,*) real</p><p>write (*,*) integer</p><p>end program numbers</p><p>Palavras-Chave</p><p>● Têm significado especial em um</p><p>determinado contexto</p><p>● Legibilidade?!?</p><p>25</p><p>26</p><p>Tipo da Variável</p><p>Tipo da Variável</p><p>● Define a faixa de valores que pode ser armazenado e as</p><p>operações sobre eles</p><p>○ int a = 5</p><p>○ char c = 2</p><p>○ double d = a / c (que operação é esta?)</p><p>27</p><p>28</p><p>Endereço da</p><p>Variável</p><p>● Endereço de memória ao qual a variável está associada</p><p>○ Conhecido como “valor-l” (left value)</p><p>a = a + 1</p><p>Endereço da Variável</p><p>29</p><p>● Endereço de memória ao qual a variável está associada</p><p>● Nem sempre é tão simples assim:</p><p>○ Posso ter uma variável associada a endereços diferentes, em momentos</p><p>diferentes de execução do programa?</p><p>○ Posso ter variáveis diferentes com o mesmo endereço?</p><p>Endereço da Variável</p><p>30</p><p>int mdc(int x, int y) {</p><p>int tmp = x % y;</p><p>if (tmp == 0)</p><p>return y;</p><p>else</p><p>return mdc(y, tmp);</p><p>}</p><p>Endereço da Variável</p><p>● Posso ter uma variável</p><p>associada a endereços</p><p>diferentes, em momentos</p><p>diferentes de execução do</p><p>programa?</p><p>31</p><p>● Posso ter variáveis diferentes com o mesmo endereço?</p><p>void calc(int *r, int *a, int *b) {</p><p>r[0] = a[0] * b[0];</p><p>r[0] = r[0] + (a[0] / b[0]);</p><p>}</p><p>void calc(int *r, int *a, int *b) {</p><p>r[0] = (a[0] * b[0]) + (a[0] / b[0]);</p><p>}</p><p>Endereço da Variável</p><p>32</p><p>a = { 8 }; b = { 2 }; r = { 0 }; → calc(r, a, b)</p><p>void calc(int *r, int *a, int *b) {</p><p>r[0] = a[0] * b[0];</p><p>r[0] = r[0] + (a[0] / b[0]);</p><p>}</p><p>void calc(int *r, int *a, int *b) {</p><p>r[0] = (a[0] * b[0]) + (a[0] / b[0]);</p><p>}</p><p>Endereço da Variável</p><p>33</p><p>a = { 8 }; b = { 2 }; → calc(a, a, b)</p><p>void calc(int *r, int *a, int *b) {</p><p>r[0] = a[0] * b[0];</p><p>r[0] = r[0] + (a[0] / b[0]);</p><p>}</p><p>void calc(int *r, int *a, int *b) {</p><p>r[0] = (a[0] * b[0]) + (a[0] / b[0]);</p><p>}</p><p>Endereço da Variável</p><p>34</p><p>calc(a, a, b) → alias</p><p>void calc(int *r, int *a, int *b) {</p><p>r[0] = a[0] * b[0];</p><p>r[0] = r[0] + (a[0] / b[0]);</p><p>}</p><p>void calc(int *r, int *a, int *b) {</p><p>r[0] = (a[0] * b[0]) + (a[0] / b[0]);</p><p>}</p><p>Endereço da Variável</p><p>35</p><p>36</p><p>Valor da Variável</p><p>Valor da Variável</p><p>● Valor é o conteúdo da memória associada</p><p>● Pensar em células individuais de memória nem sempre é</p><p>conveniente</p><p>○ int → 4 bytes</p><p>● Usar a ideia de célula abstrata</p><p>○ int → 1 célula inteira</p><p>● Uma variável tem dois valores</p><p>○ valor-r (right): valor armazenado</p><p>○ valor-l (left): endereço associado</p><p>37</p><p>a = a + 1</p><p>● Qual é o valor-l e o valor-r de x?</p><p>● Qual é o valor-l e o valor-r de y?</p><p>● Qual é o valor-l e o valor-r de str[3]?</p><p>0x4780</p><p>O problema é do compilador ou do programador?</p><p>40</p><p>0x4784</p><p>y</p><p>x</p><p>int x = 40;</p><p>int y = 33;</p><p>char str[] = {'a','b','c','d'};</p><p>x = x + y;</p><p>str[3] = x;</p><p>str 0x4788</p><p>0x478C</p><p>0x4790</p><p>0x4794</p><p>0x4798</p><p>0x479C</p><p>Valor da Variável</p><p>38</p><p>a | b | c | d</p><p>33</p><p>39</p><p>Amarração:</p><p>Conceito Geral</p><p>Amarração: Conceito Geral</p><p>● Amarração (Vinculação) é</p><p>a</p><p>associação entre atributo e</p><p>entidade ou entre operação e</p><p>símbolo</p><p>○ * → multiplicação</p><p>○ int var → var é do tipo inteiro</p><p>40</p><p>● Momentos de amarração</p><p>○ Na definição da linguagem</p><p>○ Na implementação da linguagem</p><p>○ Na compilação do programa</p><p>○ Na ligação do programa (link)</p><p>○ Na carga ou execução do programa</p><p>Amarração: Conceito Geral</p><p>● Momentos que a amarração</p><p>ocorre</p><p>○ Na definição da linguagem</p><p>○ Na implementação da linguagem</p><p>○ Na compilação do programa</p><p>○ Na ligação do programa (link)</p><p>○ Na carga ou execução do</p><p>programa</p><p>● Quando acontece essa</p><p>amarração?</p><p>○ biblioteca → ?!?</p><p>○ * (multiplicação) → ?!?</p><p>○ endereço da var → ?!?</p><p>○ tipo long de C→ ?!?</p><p>○ tipo da variável → ?!?</p><p>41</p><p>Amarração: Conceito Geral</p><p>● Quando acontece essa amarração?</p><p>○ biblioteca → na ligação do programa (link)</p><p>○ * (multiplicação) → na definição da linguagem</p><p>○ endereço da var → na carga ou execução do programa</p><p>○ tipo long → na implementação da linguagem</p><p>○ tipo da variável → na compilação do programa</p><p>42</p><p>Amarração: Conceito Geral</p><p>● Em Java: count = count + 5</p><p>● Quando é definido:</p><p>○ O tipo de count?</p><p>○ Os valores que count pode armazenar?</p><p>○ O significado de '+'?</p><p>○ O valor final de count?</p><p>43</p><p>44</p><p>Amarração</p><p>Amarração do Tipo da Variável</p><p>Amarração do Tipo das Variáveis</p><p>● Antes de referenciar/usar uma variável no programa, devemos vincular</p><p>um tipo a ela</p><p>● Amarração de tipo:</p><p>○ Estática: Tipo definido antes da execução programa e não é mais alterado</p><p>○ Dinâmica: Tipo definido em tempo de execução ou quando a variável é alterada</p><p>45</p><p>46</p><p>Amarração</p><p>Amarração Estática de Tipo</p><p>Amarração Estática de Tipo</p><p>● Tipo da variável é definido antes do programa ser executado</p><p>○ Declaração explícita de tipo</p><p>○ Declaração implícita de tipo</p><p>47</p><p>Amarração Estática de Tipo</p><p>● Declaração explícita de tipo</p><p>int sum, count, i;</p><p>● Declaração implícita de tipo</p><p>○ Através de algum critério. Exemplo: inicialização</p><p>var x = 2; // x será sempre inteiro</p><p>○ Fortran: identificador começando com I,J,K,L,M ou N é inteiro,</p><p>senão é considerado real</p><p>○ Perl: símbolos $, @ e %</p><p>○ Problema com a legibilidade</p><p>48</p><p>● É possível derivar o tipo das variáveis e de acordo com as</p><p>constantes, operações e outra variáveis</p><p>● Exemplo em ML → fun square (x : real) : real = x * x;</p><p>fun circumf(x) = 3.1415 * x * x;</p><p>fun times10(x) = 10 * x;</p><p>fun square(x) = x * x;</p><p>fun square(x) : real = x * x;</p><p>Declaração Implícita: Inferência de Tipo</p><p>49</p><p>● É possível derivar o tipo das variáveis e de acordo com as</p><p>constantes, operações e outra variáveis</p><p>● Exemplo em ML → fun square (x : real) : real = x * x;</p><p>fun circumf(x) = 3.1415 * x * x;</p><p>fun times10(x) = 10 * x;</p><p>fun square(x) = x * x;</p><p>fun square(x) : real = x * x;</p><p>Declaração Implícita: Inferência de Tipo</p><p>50</p><p>Real</p><p>Integer</p><p>Integer</p><p>Real</p><p>51</p><p>Amarração</p><p>Amarração Dinâmica de Tipo</p><p>● Tipo não é amarrado ao nome, mas sim ao valor atribuído</p><p>x = 123;</p><p>x = “ABC”;</p><p>x = [1, 2, 3];</p><p>class Var {</p><p>Tipo t;</p><p>Value v;</p><p>};</p><p>x = { int, 123 }</p><p>x = { string, “ABC” }</p><p>x = { array, [1,2,3] }</p><p>Amarração Dinâmica de Tipo</p><p>52</p><p>● Você precisa de uma função que:</p><p>○ Some dois inteiros → retorne inteiro</p><p>○ Some dois reais → retorne real</p><p>Amarração Dinâmica de Tipo</p><p>53</p><p>● Programador tem mais flexibilidade para criar funções genéricas</p><p>● Os tipos de x e y vão depender dos valores passados como</p><p>parâmetro</p><p>○ sum(1, 2)</p><p>○ sum(1.2, 2.3)</p><p>function sum(x, y) {</p><p>return x + y</p><p>}</p><p>Amarração Dinâmica de Tipo</p><p>54</p><p>Amarração Dinâmica de Tipo</p><p>● Impacto na confiabilidade</p><p>○ Compilador não consegue verificar o tipo antecipadamente</p><p>● Linguagens geralmente interpretada</p><p>● Deve verificar o tipo dinamicamente</p><p>○ Compilador não consegue gerar código para a operação desejada</p><p>○ Exemplo: C = A + B</p><p>● Estrutura interna de representação da variável deve dar suporte ao</p><p>armazenamento de qualquer tipo</p><p>55</p><p>Resumo</p><p>56</p><p>● Nomes</p><p>○ Tamanho e forma</p><p>○ Palavras especiais</p><p>● Variáveis</p><p>○ Endereço</p><p>○ Valor</p><p>○ Tipo</p><p>● Amarração</p><p>○ Estática</p><p>○ Dinâmica</p><p>○ Inferência de tipo</p><p>Slide 1</p><p>Introdução</p><p>Introdução</p><p>Introdução</p><p>Introdução</p><p>Atributos das Variáveis</p><p>Nome da Variável</p><p>Nomes</p><p>Tamanho do Nome</p><p>Tamanho do Nome</p><p>Tamanho do Nome</p><p>Forma do Nome</p><p>Forma do Nome</p><p>Forma do Nome: Perl</p><p>Forma do Nome</p><p>Forma do Nome</p><p>Slide 17</p><p>Forma do Nome</p><p>Forma do Nome</p><p>Palavra Reservada vs Palavra-Chave</p><p>Palavras Especiais</p><p>Palavras Reservadas</p><p>Palavras Reservadas</p><p>Palavras Reservadas</p><p>Palavras-Chave</p><p>Tipo da Variável</p><p>Tipo da Variável</p><p>Endereço da Variável</p><p>Endereço da Variável</p><p>Endereço da Variável</p><p>Endereço da Variável</p><p>Endereço da Variável</p><p>Endereço da Variável</p><p>Endereço da Variável</p><p>Endereço da Variável</p><p>Valor da Variável</p><p>Valor da Variável</p><p>Valor da Variável</p><p>Amarração: Conceito Geral</p><p>Amarração: Conceito Geral</p><p>Amarração: Conceito Geral</p><p>Amarração: Conceito Geral</p><p>Amarração: Conceito Geral</p><p>Amarração Amarração do Tipo da Variável</p><p>Amarração do Tipo das Variáveis</p><p>Amarração Amarração Estática de Tipo</p><p>Amarração Estática de Tipo</p><p>Amarração Estática de Tipo</p><p>Declaração Implícita: Inferência de Tipo</p><p>Declaração Implícita: Inferência de Tipo</p><p>Amarração Amarração Dinâmica de Tipo</p><p>Amarração Dinâmica de Tipo</p><p>Amarração Dinâmica de Tipo</p><p>Amarração Dinâmica de Tipo</p><p>Amarração Dinâmica de Tipo</p><p>Resumo</p>

Mais conteúdos dessa disciplina