Nomes, Amarrações e Escopo

Propaganda
LinguagensdeProgramação
Nomes,AmarraçõeseEscopo
AndreiRimsaÁlvares
Sumário
•  Nomes
•  Amarrações
•  Escopo
NOMES
LinguagensdeProgramação
Nomes
•  Conceitomaisamploquevariáveis
•  Podemrepresentar
–  Variáveis
–  Labels
–  Sub-programas(funções)
–  Parâmetrosformais
–  Outrasconstruções
DecisõesdeDesign
•  Qualdeveserotamanhomáximodeumnome?
•  Pode-seuLlizarcaracteresconectores?
•  Osnomessãocase-sensi(ve?
•  Palavrasespeciaissãoreservadas?
FormatodosNomes
•  Tamanhofixoouvariável?
–  FORTRANIeFORTRAN777caracteres
–  FORTRAN90eC31caracteres
–  C++Semlimitesnateoria,masdependedeimplementação
–  JavaSemlimites
•  Case-sensiLveoucase-insensiLve?
–  Case-sensiLvediminuialegibilidadedocódigo
•  Ex.:rosa,Rosa,ROSA
PalavrasEspeciais
•  Palavrasespeciais
–  Nomearaçõesaseremexecutadas
–  SeparamenLdadesestáLcas
•  Palavrasreservadasvspalavras-chave
–  Ex.:emFORTRAN
REAL laranja
REAL = 3.4
REAL INTEGER
INTEGER REAL
Variáveis
•  Variáveissãoabstraçõesdeendereçosdememória
•  Tornamosprogramasmaisfáceisdecodificareentender
•  Umavariávelpodesercaracterizadapeloseu:
–  Nome
–  Endereço
–  Valor
–  Tipo
–  Tempodevida
–  Escopo
Variáveis:Nomes
•  IdenLficadoresdasvariáveis
Variáveis:Endereços
•  Endereçodememóriaassociado
•  Ummesmonomepodeestarassociadoadiferentesendereços
–  Duasvariáveiscomomesmonome(emfunçõesdisLntas)
–  Mesmavariável,masemumafunçãorecursiva
•  Esteendereçoéconhecidocomol-value
Variáveis:Aliases
•  MúlLplosidenLficadoresapontandoparaamesmaáreade
memória
•  Podehaverperdadelegibilidade
–  Amodificaçãodeumavariáveltemefeitoemoutravariável
Variáveis:Tipo
•  Determinafaixadevaloresqueumavariávelpodereceber
–  Exemplo:short(-32.768a32767)
•  Conjuntodeoperaçõesassociadas
–  Operações:+,-,*,/
–  Funções:abs,exp
Variáveis:Valor
•  Oconteúdodoendereçodememóriaassociadoavariável
–  Abstraçãodamemóriacomotamanhodavariável
•  Tambémconhecidacomor-value
–  Paraacessaror-value,deve-seconhecerol-value
AMARRAÇÕES
LinguagensdeProgramação
Conceituação
•  Amarração(oubinding)éumaassociaçãoentreenLdadesde
programação
–  Variável/Valor
–  IdenLficador/Tipo
–  Operador/símbolo
•  Otempoqueocorreaamarraçãoéchamadotempodeamarração
•  EnfoquenaamarraçãodeidenLficadoresaenLdades
TemposdeAmarração
•  Asconstruçõesdeumalinguagempodemterosseguintestempos
deamarração
1) 
2) 
3) 
4) 
5) 
6) 
TempodeprojetodaLP
Tempodeimplementação
Tempodecompilação
Tempodeligação
Tempodecarga
Tempodeexecução
Porqueéimportantesaber
otempodeamarração?
1)TempodeProjetodaLP
•  Definiçãodossímbolosdalinguagemeseucomportamento
–  Ex:*(mulLplicação)
•  Definiçãodaspalavras-reservadaseseucomportamento
–  Ex.:true,if,while
2)TempodeImplementação
•  Implementadasduranteacodificaçãodotradutor(emgeralnos
compiladores)
•  Exemplo:EmC,definiçãodafaixadevaloresdoLpo
–  char-128a127
–  int-2,147,483,648a2,147,483,647
3)TempodeCompilação
•  AssociaçãodavariávelcomseuLpo
–  Exemplo:
int i;
char c;
•  Associaçãodeexpressõescomseusoperadores
–  Exemplo:
3 * 2
(x >> 4) & 0xF
4)TempodeLigação
•  Integração(ligação)deváriosmóduloscompiladospreviamente
•  Exemplo
#include <stdio.h>
#include <math.h>
void main() {
printf("%f\n", sqrt(25));
}
Ondeestáa
implementação
dafunçãosqrt?
NabibliotecadematemáLca
(libm.a)quepodeserligada
adicionandoaflag–lmaogcc
5)TempodeCarga
•  Duranteocarregamentodoprograma
–  Memóriasassociadasavariáveisglobaiseconstantes
–  EndereçosdememóriarelaLvossubsLtuídosporendereçosde
memóriaabsolutos
6)TempodeExecução
•  Ocorridasemtempodeexecução
•  Exemplo:
–  Associaçãodevaloravariável
•  Ex:int x = 5;
–  Associaçãodeáreasdememóriaavariáveis
•  Ex:int x = new int;
Exercício
•  ConsidereoseguintetrechodecódigoemCepreenchaatabela:
int cont;
/* ... */
cont = cont + 5;
Exemplo
PossíveisLposdecont
Tipodecont
Possíveisvaloresdecont
Valordecont
Possíveissignificadosdooperador+
Significadodooperador+nestaatribuição
Representaçãointernadoliteral5
TempodeAmarração
Amarrações
•  O momento em que ocorre a ligação pode ser classificado como
cedo(earlybinding)outardio(latebinding)
•  Quantomaiscedoocorrealigação,maioraeficiênciadeexecução
do programa, mas menor a flexibilidade das estruturas
disponibilizadas
AmarraçãodeTipo
•  OLpodeveseramarradoavariávelparaqueestasejareferenciada
peloprogramas
•  Aspectosimportantes
–  ComooLpodeveserdefinido?
–  Quandoaamarraçãodeveserfeita?
•  AmarraçõesdeLpos
AmarraçãoEstáEca
AmarraçãoDinâmica
•  Antesdaexecução
•  Duranteaexecução
•  Permaneceinalteradanaexecução •  Podesercriada/alteradanaexecução
AmarraçãodeTipoEstáLca
• 
PodeserobLdaatravésde
–  Declaração explícita: instrução do programa que lista nomes
devariáveiseespecificaosLpos.
•  Ex.:emC:inti,charc;
–  Declaraçãoimplícita:ConvençõesdeterminamseuLpo.
•  Exemplo em Fortran: começam com I, J, K, L, M, ou N
(INTEGER),outras(REAL)
•  ExemploemPerl:começamcom$(escalar),@(array),
%(hashtable)
AmarraçãodeTipoDinâmica
•  A variável é vinculada a um Lpo quando lhe é atribuída um valor
emumainstruçãodeatribuição
•  A variável que está sendo atribuída é vinculada ao Lpo do valor,
variávelouexpressãodoladodireitodaatribuição
•  Vantagens:
–  Flexibilidadeegeneralidade
•  Desvantagens:
–  Reduçãodacapacidadededetecçãodeerropelocompilador
–  Custodeimplementaçãodavinculaçãodinâmica
AmarraçãodeTipoDinâmica
•  ExemplodealteraçãodeLpodinamicamenteemC#
dynamic variavel = new Int32();
variavel = 10;
// Int32
variavel = 2.5; // Double
variavel = ”25/02/2011"; //String
variavel = DateTime.Parse(variavel); // Data
•  ExemplodeoperadoresquealteramoLpo
–  PHP
<?php
$x = 20;
var_dump($x);
$x += 'Texto...';
var_dump($x);
?>
–  JavaScript
<script>
var x = 20;
alert(typeof(x));
x += "Texto...";
alert(typeof(x));
</script>
AmarraçõesdeArmazenamento
•  AlocaçãoAmarraçãofeitaemumacéluladememóriadisponível
obLdadeumpooldememória
•  DesalocaçãoDevolveracéluladememóriadesvinculadaà
variáveldevoltaaopooldememória
•  TempodevidaOtemponoqualaquelavariávelestávinculadaa
céluladememóriaalocada
–  Começaquandoavariáveléalocadaeterminaquandoelaé
desalocada
AmarraçõesdeArmazenamento
•  Classificaçãodasvariáveisquantoàamarraçãodearmazenamento
–  VariáveisestáLcas
–  Variáveisstack-dinâmicas(pilha)
–  Variáveisheap-dinâmicas
•  Explícitas
•  Implícitas
VariáveisEstáLcas
•  Vinculadasàmemóriaantesdaexecuçãoepermanecematéo
programaterminar
•  Vantagens
–  Variáveis em subprogramas sensíveis à história (retêm valores
entrechamadas)
–  Eficiência: endereçamento direto; inexistência de overhead de
alocaçãoedesalocação
•  Desvantagens
–  Flexibilidadereduzida(recursão)
–  ImpossibilidadedecomparLlhamentodamemória
VariáveisEstáLcas
•  ExemploemC
#include <stdio.h>
static char* var = "global";
void main() {
printf("%s\n", var);
}
EmCéalocadaem
tempodecompilação
•  ExemploemJava
class Foo {
public static String bar = "foobar";
}
EmJavaéalocadaemtempode
carregamentodaclasse
VariáveisStack-Dinâmicas
•  Vinculadasàcélulasdememórianomomentodadeclaração,maso
LpoédefinidoestaLcamente
•  Vantagens
–  Permiterecursividade
–  PermiteocomparLlhamentodememória
•  Desvantagens
–  Overheaddealocaçãoedesalocaçãoemtempodeexecução
–  Nãosãosensíveisàhistória
VariáveisStack-Dinâmicas
•  ExemploemC
void funct(int size) {
char buffer[size];
/* ... */
}
VariáveisHeap-DinâmicasExplícitas
•  Células(abstratas)dememóriaalocadasedesalocadaspelo
programadorduranteaexecuçãodoprograma
•  Aheapmantémumacoleçãodecélulasalocadasdinamicamente
(altamentedesorganizada)
•  Célulassomentepodemserreferenciadasatravésdeponteirosou
referências
•  AvinculaçãodeLpoéfeitaestaLcamente,masoarmazenamentoé
feitodinamicamente
VariáveisHeap-DinâmicasExplícitas
•  Vantagens
–  Gestãodinâmicadememória
•  Desvantagens
–  Custoassociadoamanutençãodaheap(alocação/desalocação)
–  AuLlizaçãodeponteirosnãoésegura
VariáveisHeap-DinâmicasExplícitas
•  ExemploemC
int* node = malloc(sizeof(int));
/* ... */
free(node);
•  ExemploemC++
int* node = new int;
/* ... */
delete node;
•  ExemploemJava
Integer node = new Integer(10);
/* ... */
Ondeéfeitaaliberação
damemóriaemJava?
VariáveisHeap-DinâmicasImplícitas
•  Armazenamento(céluladememória)somenteéassociadoquando
umvaloréatribuído
•  Vantagens
–  ElevadograudeflexibilidadedoLpodevariável,permiLndo
definircódigosgenéricos
•  Desvantagens
–  Ineficienteporquetodososatributosdavariávelsãodinâmicos;
–  Dificuldadededetecçãodeerrospelocompilador.
VariáveisHeap-DinâmicasImplícitas
•  ExemploemJavaScript
<script>
var list = [ 5, "texto" ];
alert(typeof(list));
</script>
•  ExemploemPerl
#!/usr/bin/perl!
!
my @array = ( "1", "2", "3");!
!
for $e (@array) {!
print $e . "\n";!
}!
ESCOPO
LinguagensdeProgramação
Escopo
•  Emquaispartesdoprograma(instruções)umavariávelévisível
(visibilidade)
–  Ouseja,sepodeserreferenciadanaqueleponto
•  Variáveisnão-locaisdeumaunidadedoprogramasãoaquelas
visíveis,masnãodeclaradaslá
•  Asregrasdeescopodeterminamcomoosnomessãoassociados
comasvariáveis
Escopo
•  Exemplo
01: int a = 13;
02: void f() {
03:
int b = a;
04:
int a = 2;
05:
b = b + a;
06: }
// Referência à variável do ponto 1
// Referência à variável do ponto 4
EscoposAninhados
•  Definiçãodeescoposdentrodeoutros,formandoumasequência
deescoposcomsucessoreseantecessores
•  Aredefiniçãodeumavariávelcomomesmonome(numescopo
interior)deumajáexistentenumescopoexterior,permite
"esconder"(shadow)adefiniçãoexterior
–  C++,Pascal,ADApermitemoacessoaestasvariáveis
escondidasemescoposexteriores
–  JáJavanãoaceitashadowdentrodeprocedimentos
TiposdeEscopo
•  EstáLco
–  Baseadonadescriçãotextualdoprograma
–  Amarraçõesfeitasemtempodecompilação
•  Ex:Algol,Pascal,C,C++,Java,C#,Ada…
•  Dinâmico
–  BaseadonasequênciadeaLvação(chamadas)dosmódulosdo
programa
–  Amarraçõesfeitasemtempodeexecução
•  Ex:Lisp,APL,SNOBOL,Smalltalk…
EscopoEstáLco
•  Blocos
–  Permitequeumaseçãodecódigopossuasuaspróprias
variáveislocaiscomescoporeduzido
–  Trechodecódigodelimitadopormarcadores
•  Pascal:begineend
•  C,C++:{e}
EscopoEstáLco
x
x
x
y
y
w
z
w
BlocoMonolíLco
BlocosNãoAninhados
z
x
BlocosAninhados
EscopoEstáLco
x
BlocoMonolíLco
•  Programacomumúnicobloco
–  Amarraçõescomvisibilidadeglobal
•  Estruturamuitoelementar
–  Nãoapropriadaparagrandesprogramas
–  Dificultaacodificaçãoporgrandes
equipesdeprogramadores
•  Ex:BASICeCOBOL
EscopoEstáLco
x
y
z
w
BlocosNãoAninhados
•  Programadividoemblocos
–  Somentelocaisouglobais
•  Qualquervariávelnão-localdeveserglobal
•  Exemplo
–  FORTRAN:Todosossubprogramassão
separadosecadaumatuacomoum
bloco
EscopoEstáLco
•  Blocospodemseraninhadosdentrode
outrosblocos
x
y
w
z
x
BlocosAninhados
•  IdenLficadorespodemseramarradosem
cadabloco
–  IdenLficadoressãoprocuradosde
“dentroparafora”
•  Vantagem:programas+legíveis
•  Desvantagem:ocultamentodevariáveis
EscopoEstáLco
•  ExemplodeocultamentoemC:
#include <stdio.h>
void main() {
int i = 0;
int x = 10;
while (i++ < 100) {
float x = 3.231;
printf("x = %f\r\n", x * i);
}
}
Javanãopermite
talocultamento!
EscopoEstáLco
•  Problemascomestruturaaninhada
P
A
D
P
B
C
E
BlocoDduplicado
A
D
B
C
E
BlocoDacessívelpormais
blocosqueintencionado
D
EscopoEstáLco
•  CuLlizaumaabordagemmista
–  Definidosporfunções:Blocosnão-aninhados
•  Funçõespodemserreusadasevariáveisglobaispodemser
comparLlhadas(visibilidadeglobal)
–  Definidosinternamente:Blocosaninhados
•  Nãopodeserreaproveitado
EscopoEstáLco
•  ExemploemC
01:
02:
03:
04:
05:
06:
07:
08:
09:
#include <stdio.h>
int x = 10;
int y = 15;
void f() {
if (y – x)
int z = x + y;
}
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
void g() {
int w;
w = x;
}
void main() {
f();
x = x + 3;
g();
}
EscopoDinâmico
•  Sãoamarradasdeacordocomofluxodeprograma
•  IdenLficadoréassociadoàdeclaraçãomaispróximanapilhade
chamada
•  Exemploem
linguagemhipotéLca
program p {
inteiro x = 1;
procedimento sub1() {
escreva(x);
}
procedimento sub2() {
inteiro x = 3;
sub1();
}
sub2();
sub1();
}
EscopoDinâmico
•  Problemas
–  PerdadeeficiênciaverificaçãodeLposemtempode
execução
–  Reduçãonalegibilidadedi~cildeterminarasequênciade
chamadas
–  Acessolentoavariáveisnãolocaisdi~cilidenLficaros
idenLficadoresdasequênciadechamadas
–  Reduçãodaconfiabilidadevariáveislocaisacessadaspor
quaisquerfunçõeschamadas
TempodeVida
•  Escopoetempodevidapossuemumarelaçãopróxima,massão
conceitosdiferentes
–  EscopoestáLcoéumconceitotextual
–  Tempodevidaéumconceitotemporal
TempodeVida
program P
var m: integer;
procedure R (n: integer);
begin
if n > 0 then R (n-1)
end;
begin
R(2)
end.
início P
Escopo de n
Escopo de m
início R(2) início R(1) início R(0) fim R(0)
tempo de vida n=0
tempo de vida n=1
tempo de vida n=2
tempo de vida m
fim R(1)
fim R(2)
fim P
TempodeVida
•  ExemploemC
void foo() {
static int y;
/* ... */
}
int main() {
int x;
foo();
}
•  Variávelx
–  Escopo:nãoestendefoo
–  Tempodevida:estendefoo
•  Variávely
–  Escopo:visívelemfoo
–  Tempodevida:estendeportodoo
programa
AmbientesdeReferenciamento
•  Conjuntodetodososnomesvisíveisemumadeterminada
instruçãooupontodeprograma
•  NoescopoestáLco,oambientedereferenciamentoéconsLtuído
detodasasvariáveisdeclaradasemseuescopolocal,como
conjuntodetodasasvariáveisdeseusescoposascendentesvisíveis
AmbientesdeReferenciamento
program exemplo;
var a,b: integer;
procedure sub1;
var x,y: integer;
begin (1) end;
procedure sub2;
var x: integer;
procedure sub3;
var x: integer;
begin (2) end;
begin (3) end;
begin (4) end;
•  Ponto(1)
–  x, y (???)
–  a, b (???)
•  Ponto(2)
–  x (???)
–  a, b (???)
•  Ponto(3)
–  x (???)
–  a, b (???)
•  Ponto(4)
–  a, b (???)
AmbientesdeReferenciamento
program exemplo;
var a,b: integer;
procedure sub1;
var x,y: integer;
begin (1) end;
procedure sub2;
var x: integer;
procedure sub3;
var x: integer;
begin (2) end;
begin (3) end;
begin (4) end;
•  Ponto(1)
–  x, y (sub1)
–  a, b (exemplo)
•  Ponto(2)
–  x (sub3)
–  a, b (exemplo)
•  Ponto(3)
–  x (sub2)
–  a, b (exemplo)
•  Ponto(4)
–  a, b (exemplo)
Constantes
•  Umaconstanteéumavariávelvinculadaaumvalornomomento
emqueévinculadaaumacéluladememória
•  Ovalordasconstantesnãopodeseralterado
•  Ajudamnalegibilidadeeconfiabilidadedoprograma
InicializaçãodeVariáveis
•  Avinculaçãodeumavariávelaumvalor,nomomentoemqueé
vinculadaaumacéluladememória,édesignadoporinicialização
•  Exemplos
–  Fortran:REALPIINTEGERSOMA
DATASOMA/0/,PI/3,14159/
–  Ada:SOMA:INTEGER:=0;
•  Pascalnãooferecemeiosdeseinicializarvariáveis,excetona
atribuição
ISSOÉTUDOPESSOAL!
LinguagensdeProgramação
Download