Você está na página 1de 9

Armazenamento

Introduo

Quando o programador entender o uso de variveis, ter entendido a essncia da programao (Dijkstra) afirmao ultrapassada. Programao imperativa caracterizada pelo uso de variveis e comandos de atribuio. Um estudo completo sobre variveis e armazenamento inclui tipos de variveis, modelo de armazenamento, tempo de vida, comandos e efeitos colaterais.

Paradigmas de Linguagens de Programao Patrcia D. L. Machado

Variveis e Alterao de Valores

Variveis e Alterao de Valores

Em programao imperativa, uma varivel um objeto que contm um valor que pode ser avaliado e alterado. Variveis so usadas para modelar objetos do mundo real. Tipos:

Variveis em programas funcionais so equivalentes matemtica. Estas linguagens no possuem variveis como as da programao imperativa, mas sim como as da matemtica. Vamos considerar no nosso estudo um modelo abstrato de armazenamento:

Temporrias: criadas e usadas dentro de um programa. Persistentes: tem existncia independente do tempo de vida (execuo) de um programa. (arquivos)

Uma memria uma coleo de clulas (ou locaes) Cada clula possui um status (alocada ou desalocada) Cada clula possui um valor armazenvel ou um valor indefinido.

Estas variveis so diferentes das variveis da matemtica que possuem um nico valor dependente do contexto onde forem declaradas.

Exemplo: Considere uma varivel n : Object em Java.

Variveis Compostas
Uma varivel de um tipo composto possui componentes que por sua vez so tambm variveis.
type Ponto = record x :In ,y teger ; end; .. . var p1 ,p2 : Ponto ; p1 .. . p1.x := 10 ; p1.y := 30;

Alterao Total ou Seletiva

Alterao total - todos os componentes so alterados num nico passo. (p2 = p1;) : Alterao seletiva - apenas um componente alterado em um passo. (p1.x := 50;)

p1.x p1.y 10 30

Arrays

Arrays

Uma varivel do tipo array pode ser vista como um mapeamento de um conjunto de ndices para variveis componentes. O conjunto de ndices normalmente um subintervalo de valores consecutivos. Tipos:

Dinmico - conjunto de ndices definido na criao da varivel, ou seja, em tempo de execuo, pela avaliao de uma expresso. (Ada)
m : In teger:= .. .; .. . toris array ( teger range <>) of Fl t In oa ; type Vec a : Vec tor(1 .10) . ; b : Vec tor(0 . . m); tor(v : Vec )is.. tor .; procedure readvec .. . a := b { poss ve apenas se b t ver o mesmo n de comp. l i . } readvector ;readvector ; (a) (b)

Esttico - conjunto de ndices definido antes da compilao. (Pascal)

Arrays

Arrays (Exerccio)
3.2 Em muitas linguagens de programao, strings so definidos como arrays de caracteres. Compare as conseqncias disto quando a varivel string for:
(a) um array esttico (b) um array dinmico (c) um array flexvel

Flexvel - conjunto de ndices no fixo. Assim, os limites do conjunto de ndices podem ser alterados sempre que um novo valor de array for associado a varivel. (Java e Smalltalk) (Smalltalk)
a <- #(1 2 3 4) ... a <- # (31 28 31 30 31 30 31 31 30 31 30 31)

(JAVA)
int [] a; ... a = new int[3]; a = new int[20]; ...

Considere operaes de string como atribuio, comparao e concatenao. Comparao e concatenao podem ser definidas ? Dica: Aplicao direta das definies de arrays esttico, dinmico e flexvel, e strings e suas operaes.

Valores Armazenveis

Valores Armazenveis

Chamamos valores armazenveis (storables) todos os valores que podem ser armazenados em clulas simples e no podem ser seletivamente alterados. Em Pascal:

Em ML

valores primitivos registros, construes e listas funes referncias a variveis

valores primitivos conjuntos apontadores

Em Java

valores primitivos referncias a variveis

Tempo de Vida

Variveis Locais e Globais


program P; .; var x :.. procedure Q; .; var y :.. begin .. R .. . . end; procedure R; .; var z :.. . begin .. end; begin .. Q .. R .. . . . end.

Tempo de vida de uma varivel o intervalo de tempo entre a sua criao (alocao) e a sua desalocao. Uma varivel s precisa ocupar memria enquanto estiver ativa.
Variveis Locais e Globais

Uma varivel local aquela declarada dentro de um bloco para ser usada apenas dentro dele. (bloco = begin ... end; em Pascal, { ... } em JAVA) Uma varivel global aquela declarada em um bloco externo que contm o bloco em que est sendo usada. (conceito relativo)

Variveis Locais e Globais


Variveis Heap (Apontadores)


Uma varivel local pode ter diferentes tempos de vida se o bloco no qual est declarada for ativado mais de uma vez. Cada tempo de vida de uma mesma varivel corresponde a tempos de vida de variveis diferentes. Portanto, uma varivel local no pode guardar um valor entre sucessivas ativaes do bloco onde est declarada. Uma varivel em Pascal sempre inicializada com valor indefinido. Algumas linguagens com C e PL/1 possuem variveis estticas, que aps serem criadas s so desalocadas no final da execuo do programa, mesmo que tenham sido declaradas em um bloco interno.

Pode ser criada e desalocada em qualquer instante. So criadas por comandos e acessadas por um apontador. Apontadores so valores de primeira classe. A criao de uma varivel heap feita por uma operao chamada alocador. Em Pascal, new. Aps sua criao (alocao), a varivel fica acessvel enquanto existir um apontador para ela ou at que seja desalocada por uma operao chamada desalocador. Em Pascal, dispose. Apontadores para uma varivel heap que foi desalocada tornam-se dangling references (referncias soltas).

Variveis Heap

Variveis Persistentes

Apontadores e variveis heap podem ser usados para definir tipos recursivos.
tL t tNode type In is = ^In In tNode = r ecord head :In teger ; tal:In is ; i tL t end;

Tempo de vida transcende a execuo de um programa.


Ex: Arquivos so variveis compostas.

Mesmo que se tenha bastante cautela, o uso de ponteiros suscetvel a erros e obscuro. Quase todas as linguagens imperativas do suporte a definio de apontadores e no do suporte a tipos recursivos diretamente.

Um arquivo serial uma seqncia de componentes; um arquivo direto um array de componentes.

Variveis Persistentes

Dangling References (referncias soltas)

Por eficincia, muitas linguagens restringem o acesso a arquivos. Em Pascal:


Apenas um componente de cada vez pode ser lido em um arquivo. Um arquivo s pode ser alterado atravs de uma nova cpia. Atribuio de um arquivo completo proibida.

A tentativa de referenciar uma varivel que no est mais alocada chamada referncia solta ou dangling reference. Apontadores para variveis heap so valores de primeira classe, mas apontadores para variveis locais so geralmente valores de segunda classe. Referncias soltas podem ocorrer quando uma varivel heap recebe como valor um apontador para uma varivel local.

Em Pascal, um parmetro de programa considerado uma varivel persistente. Princpio: todos os tipos da linguagem possam ser usados para definir tanto variveis persistentes quanto temporrias.

Dangling References (referncias soltas)


Exemplo em uma verso hipottica de Pascal:

Dangling References (referncias soltas)

In ; var r: ^ teger procedure P; teger ; var v :In r:= &v ; end; begin P; r^ 1 := ; end;

Pascal trata referncias a variveis locais como valores de segunda classe que s podem ser passados como argumentos. Em Algol-68, referncias a variveis locais no podem ser associadas a variveis heap com tempo de vida maior. Em linguagens funcionais, todas as variveis so heap. Como JAVA trata este problema ?

Comandos

Comandos

Trecho de programa a ser executado para alterar variveis. Caractersticos da programao imperativa. Podem ser simples ou compostos.

Tipos fundamentais:

Skip (ou comando nulo) Atribuies Chamadas de Procedimento Comandos seqenciais Comandos colaterais Comandos condicionais Comandos interativos

Comandos

Skips

Algumas linguagens provem os desvios (jumps, exits, ...) para tornar o fluxo dos comandos nica-entrada/mltipla sada.

No tem efeito. Usado como condicionais: componente de comandos

i E then C else skip f

Atribuio

Atribuio

V := E; onde V uma referncia a varivel e E uma expresso. Em linguagens onde referncias (endereo) a variveis so valores de primeira classe, V pode ser uma expresso que resulte no endereo de uma varivel. ( f..then m e i . lse n) := 7

Uma atribuio mltipla permite que um mesmo valor seja associado a um conjunto de variveis em um mesmo comando: V1 := V2 : ..:= Vn := E = . Uma atribuio simultnea permite que valores de n expresses sejam associados simultaneamente a n variveis. V1, .. Vn := E1, .. En ., ., m, n := n m ,

Atribuio

Atribuio

Em algumas linguagens como C, operadores binrios podem ser associados a atribuio: n+ 1 := n := n + 1 Um acesso a varivel pode resultar no seu contedo ou no seu endereo (referncia). Ex: read(n) ; n := n + 1; wrte n) i ( ; Como diferenciar ? Depende do contexto.

Na realidade, todo acesso a varivel retorna um endereo, mas, em alguns contextos, via uma operao implcita, o contedo corrente retornado. read(n) n := content ) + 1 ; (n ; wr te i (content ) ; (n )

Atribuio

Chamadas de Procedimento

Esta operao implcita chamada dereferenciao (dereferencing) Em algumas linguagens (ML), esta operao pode ser explcita: n := !n + 1

Ativa um argumentos.

procedimento

aplicado

a
so

P(AP1, .. APn) - onde AP1, .. APn ., ., parmetros reais.

Um parmetro real pode ser uma expresso ou acesso a varivel. Procedimentos podem alterar os valores de variveis passadas como argumento. (passagem por referncia)

Comandos Seqenciais

Comandos Colaterais

A ordem em que comandos so executados muito importante, visto que podem alterar valores de variveis. A composio seqencial de dois comandos usualmente ilustrada como: C 1; C2.

C 1, C2 - podem ser executados em qualquer ordem.


m := 7 n := n + 1 , n := 7 n := n + 1 ,

Uma computao pode ser:

determinstica - possvel prever a seqncia de passos a ser seguida. no-determinstica - caso contrrio.

Comandos Colaterais

Comandos Condicionais

Comandos colaterais so no-determinsticos. Um comando colateral efetivamente determinstico se nenhum subcomando consulta uma varivel alterada por outro.

So formados por um conjunto de subcomandos, onde apenas um escolhido para ser executado. Comando if: lse C2 i E then C 1 e f

Comandos Condicionais

Comandos Condicionais

Comando if (no-determinstico): i E1 then C 1 f | E2 then C2 .. . | En then Cn end i f

Exe mplos: i x >= y then max := x f e max := y lse i x >= y then max := x| f x <= y then max := y end i f

Comandos Condicionais

Comandos Iterativos

Com. condicionais no-determinsticos no geral s so encontrados em linguagens concorrentes. A escolha de um comando pode ser baseada em outros tipos de valores alm de booleanos: case E of L1 : C1; .. . Ln : Cn; end;

Chamadas de procedimentos chamadas de funes Comandos condicionais expresses condicionais Comandos iterativos (loop) caracterstica prpria de linguagens com comandos. Possue um subcomando que executado repetidamente at que uma condio de trmino seja atingida.

Comandos Iterativos

Comandos Iterativos

Tipos:

Iterao indefinida
whi E do C le i E then begin whi E do C end; f le repeat C unti E l

Iterao definida - nmero de passos pode ser determinado; caracterizada por uma varivel de controle.
for V := E1 to E2 do C for V := E1 to E2 by E3 do C for V in E do C (no-determinstico)

Comandos Iterativos
!

Comandos (Exerccio)
3.9 possvel conhecer melhor a semntica de comandos escrevendo equivalncias entre diferentes comandos ou combinaes de comandos, por exemplo:
C; skip equivalente a C C1, C2 equivalente a C2;C1 Porm C1; C2 no equivalente a C2; C1.

Interao Definida

O status da varivel de controle varia de linguagem para linguagem. Em Pascal, uma varivel comum, ento o for pode ser interpretado como: determine a seqnc a de cont e i rol ; V := p ime ro va r da seqnc ; C r i lo ia ; .. . V := t limo va da seqnc ; C lor ia

Tente encontrar quantas equivalncias conseguir. Dica: Considere JAVA e exemplos onde o uso dos seguintes comandos podem gerar um efeito equivalente:
++ e +,= if e switch if e condicional ? while e do-while

Comandos (Exerccio)
3.11 Considere as seguintes questes abaixo com relao a varivel ordinria de controle i em um for. Descubra como Java responde a estas questes. for (i = 0; i < length; i++) { ... // do something to the i th element of a ... } (a) qual o valor da varivel de controle aps a finalizao do for ? (b) qual o valor da varivel de controle caso ocorra um desvio do loop antes de sua finalizao ? Por exemplo, tratamento de excees. (c) o que acontece se o valor desta varivel for alterado dentro corpo do for ? Isto permitido ? Dica: Observe que i declarado fora do for. Construa um programa simples e veja o que acontece.

Expresses com efeitos colaterais (side effects)


A avaliao de uma expresso deve dar um valor como resultado. Em algumas linguagens imperativas, possvel que a avaliao de uma expresso tambm resulte na alterao de um ou mais variveis (efeito colateral).

Expresses com efeitos colaterais (side effects)

Expresses com efeitos colaterais (side effects)

Expresses comando - linguagens imperativas no possuem um conjunto rico de expresses, ento para avaliar expresses necessrio usar comandos: anxn + ... + a2x2 + a1x + a0 var p : Rea ;i:In l teger ; begin p := a ] [n ; fori:= n downto 0 do p := p * x + a i; -1 [] return p end

Linguagens orientadas a expresses - linguagens imperativas onde no existe distino entre comandos e expresses. (Algumas verses de C)

Nestas linguagens, uma expresso sempre retorna um valor e tambm pode alterar variveis. A duplicao de comandos e expresses anlogos eliminada. Para comandos como loop e skip geralmente retornado um valor neutro 0 ou () (void).

Expresses com efeitos colaterais (side effects)

Expresses com Efeitos Colaterais (side effects)


= tchar f ) <> do () * whi (ch : ge le wr te i (ch) () then i ge f tchar f = F gender:= f emale () then else i ge f tchar f = M gender: male = e .. lse .

Por que linguagens com Pascal e Ada mantm a distino entre comandos e expresses ?
" O uso de efeitos colaterais no um bom estilo de programao ! muito criptogrfico.

Side Effects - Exerccio


3.12 Alguns programadores consideram efeitos colaterais com caractersticas teis em linguagens de programao. Apresente argumentos contra e a favor do uso de efeitos colaterais. Dica: Faa uso de exemplos.

Você também pode gostar