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