resumodeaulaslp1-120404204313-phpapp02
27 pág.

resumodeaulaslp1-120404204313-phpapp02


DisciplinaProgramação I21.537 materiais245.166 seguidores
Pré-visualização7 páginas
que 
não tem como se prever o que será feito pelo compilador. Ou será uma situação criada automaticamente, 
como variáveis temporárias para se guardar alguma coisa. 
\u201cHeap\u201d \u2013 Monte, um pouco sem controle, coisas jogadas sem organização. 
Tempo de vida de uma variável \u2013 inicia-se no momento da vinculação, até o momento em que a vinculação acaba 
(desvinculação), independentemente de mudanças na vinculação. 
\u201cGarbage Collection\u201d \u2013 os programadores frequentemente esquecem-se de declarar que não querem mais uma 
variável. Então se torna necessário evitar que o programador faça isto, com um controle mais automático por 
meio de algoritmos (contadores em todos os ponteiros). É menos eficiente em termos de tempo e aproveitamento 
de memória, porém facilita alocando mais memória do que o necessário é o \u201cmelhor sobrar do que faltar\u201d Java é 
um exemplo de linguagem que possui Garbage Collection. 
Inicialização 
 
Quando uma variável é vinculada a um armazenamento é necessário que seja vinculada a um valor também. Auxilia 
a mostrar o que funciona e o que não funciona. Não basta apenas inicializar, é necessário que se inicialize com 
alguma coisa. Normalmente inicializa-se com zeros, o hardware normalmente possui circuitos para colocar zeros em 
grandes quantidades de bits, tal quantidade significará uma coisa ou outra dependendo dos tipos. 
Uma string em C conforme abaixo, seria uma String vazia. 
0 0 0 0 0 0 0 0 0 0 
Pode-se gastar tempo com 2 inicializações, tanto inicialização do programador quanto do compilador, quando o 
compilador faz isso automaticamente tem-se menos eficiência. A inicialização é, realmente, o valor após a 
declaração do armazenamento. 
 
 18 
Avaliação de Expressões 
(A+B)*C 
Normalmente tem-se algumas expressões ou símbolos previamente criados. 
Alguns são definidos pela matemática, outros são meramente símbolos representados pelo teclado que não são tão, 
\u201cespeciais\u201d. 
Normalmente tem-se parênteses, operadores, e mais alguns operadores que todos juntos forma-se algo chamado 
\u201cexpressão\u201d. 
Para se calcular uma expressão, dar um significado para aquela serie de símbolos é: 
1. Ordem de avaliação: como cada expressão tem uma ordem de processamento, é melhor que se faça um 
único significado para tudo. Portanto haverá associatividade entre alguns operadores. Associatividade à 
direita e à esquerda. Um exemplo de associatividade à esquerda seria (a+b+c). Outro exemplo de 
associatividade à direita seria o comando de atribuição em C/C++. 
 
2. Definição do compilador: as regras de execução das expressões podem ser previamente determinadas pelo 
compilador ou não, dependendo da linguagem. Em Java é sempre do mesmo jeito, o que prejudica a 
velocidade de execução. E C++ não se tem a garantia de que será compilado e executado sempre do mesmo 
jeito, porém se terá a garantia de que a execução/compilação será mais rápida. 
 
3. Ordem de avaliação dos operandos: f(a) + f(b) aqui, os operandos são também funções, então o compilador 
terá de calcular cada um separadamente para no final calcular a expressão. 
 
4. Sobrecarga de Operadores: quando o mesmo nome está associado/vinculado está associado com mais de 
uma operação diferente, é necessário se especificar qual a operação está mais correta. Algumas linguagens 
permitem que o usuário faça a modificação da especificação dos operandos, um \u201c+\u201d pode significar uma 
operação. Quando a linguagem permite isto, quer dizer que a linguagem possui sobrecarga. Na maioria das 
linguagens só se e possível utilizar nomes previamente definidos, outras são mais flexíveis como, por 
exemplo, digitar muitos símbolos e associar a um nome para alguma coisa. A sobrecarga de operadores 
(possibilidade de o programador definir novos usos para os identificadores) é mais comum em linguagens 
mais modernas. Costuma-se dizer que a sobrecarga de operadores é um recurso bom, porque aumenta a 
legibilidade. Outro problema da sobrecarga de operadores é no caso de bibliotecas, em que cada um que cria 
uma biblioteca pode associar um símbolo/operador diferente, reduzindo a padronização e ocasionando 
ambiguidade, a linguagem não sabe mais como distinguir o significado de um operador para o outro. 
 
 
 
 
 
 
 19 
Conversão de Tipos 
No hardware costuma-se ser mais restrito com tipos. O objetivo da conversão de tipos é criar outra variável com 
outro tipo, mas que irá significar a mesma coisa, outra representação com outro tipo diferente. Caracterizada em 
dois tipos: 
1.) Estreitamento: alguns valores não possuem nada parecido para se colocar num tipo novo. 
2.) Alargamento: existe uma representação aproximada para qualquer valor, para qualquer valor representado 
num tipo \u2018a\u2019 tem-se algo parecido num tipo \u2018b\u2019. É mais segura, possui uma garantia maior de que irá 
acontecer. 
 Na necessidade de novos tipos em que o hardware não consegue trabalhar, a linguagem pode oferecer novas 
opções, recursos. Há uma serie de conversões em que a linguagem faz automaticamente, outras linguagens serão 
necessárias à conversão de tipos da própria linguagem. 
 
Coerção em Expressões 
Acontecem implicitamente em expressões de modo misto (os operandos não estão na posição certa, no sentido de 
que a operação não existe, e por isso necessita uma conversão de tipos previamente para ser efetuada). 
 
Operadores Relacionais e Expressões Booleanas 
O processamento entre operando é uma relação, daí designa-se que o quando o resultado de uma operação com os 
operadores gera um booleano, chama-se expressão booleana. O operador booleano nem sempre existe, mas mesmo 
que não exista, deve-se haver uma referencia ao booleano, e frequentemente tem-se um número inteiro para 
representar estes valores, como mais comuns \u20180\u2019 para falso e \u20181\u2019 para verdadeiro. 
Tem-se certa dificuldade de se seguir conceitos matemáticos, porque em matemática tem-se \u201cabreviações\u201d dos 
operadores \u201c(a>b>c)\u201d no caso da programação, quer-se dizer que (a>b e a>c) o que não existe. No caso da linguagem 
\u201cC\u201d faz-se por relação de precedência primeira (a>b) e depois (b>c). Em Java não há conversão de booleano para 
algum tipo numérico. 
Avaliação em curto circuito 
Tem-se uma expressão e outros operadores, mas às vezes pode-se não precisar percorrer toda expressão para 
calcular o resultado, caso consiga-se detectar a operação em questão, calcula-se. (possibilidade de que a avaliação 
não seja processada por inteiro, faz se o caminho mais curto para se chegar ao resultado) O contrário seria o circuito 
longo, em que se varre toda a expressão o que gasta mais tempo. É mais comum em expressões booleanas em que se 
exclui uma determinada parte {(a and b) or c} o que pode gerar um efeito colateral, pelo fato de que se deixou fazer 
uma parte de uma operação, o estado das coisas é diferente, resultando em algo diverso aquilo pretendido. Algumas 
linguagens possibilitam \u201cchavear\u201d o efeito de querer ou não fazer-se uso da avaliação em curto circuito com 
comandos específicos, Ada é uma linguagem que possibilita isto. 
 
 
 20 
Operador de atribuição 
Fundamental para qualquer linguagem imperativa. Bastante necessário, algumas linguagens possuem um operador 
bem simples, como no caso de Pascal {:=} outras linguagens possuem extras a mais em seus operadores. 
Chama-se o operando da esquerda de \u201cLeft value\u201d e o da direita de \u201cRight value\u201d, e são operandos com 
características distintas. Na direita, é Necessário que seja capaz de transformar em um valor, no caso da esquerda é 
necessário que ele seja capaz de transformar algo em endereço. Nem sempre é possível atribuir um endereço ao 
operando da esquerda. 
(Left value) {Operador de atribuição da linguagem} (Right value) 
 
ATRIBUIÇÃO SIMPLES 
É a mais comum, assim como Pascal, do tipo \u201ccopie um valor de um lado para o outro\u201d 
ALVOS MÚLTIPLOS 
Copia um valor para vários lugares, frequentemente as linguagens utilizam uma vírgula para separar as variáveis, 
como por exemplo: {a,b=0} 
ALVOS CONDICIONAIS