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