resumodeaulaslp1-120404204313-phpapp02
27 pág.

resumodeaulaslp1-120404204313-phpapp02

Disciplina:Linguagens de Programação I260 materiais733 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.

“Heap” – Monte, um pouco sem controle, coisas jogadas sem organização.

Tempo de vida de uma variável – 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.

“Garbage Collection” – 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 “melhor sobrar do que faltar” 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,

“especiais”.

Normalmente tem-se parênteses, operadores, e mais alguns operadores que todos juntos forma-se algo chamado

“expressão”.

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 “+” 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 ‘a’ tem-se algo parecido num tipo ‘b’. É 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 ‘0’ para falso e ‘1’ para verdadeiro.

Tem-se certa dificuldade de se seguir conceitos matemáticos, porque em matemática tem-se “abreviações” dos

operadores “(a>b>c)” no caso da programação, quer-se dizer que (a>b e a>c) o que não existe. No caso da linguagem

“C” 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 “chavear” 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 “Left value” e o da direita de “Right value”, 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 “copie um valor de um lado para o outro”

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