använda VariablesEdit
synlighet och livslängd för VariablesEdit
variabler kan ha olika synlighet eller omfattning beroende på hur de deklareras och används. Omfattning avser möjligheten att komma åt innehållet i en viss variabel vid en viss punkt i programmet.
vanligtvis bestäms en variabels omfattning av dess inneslutande block. Ett block kan uttryckligen bifogas på vissa språk (börja/avsluta, {/} par), medan i andra är blocket implicit.
nästan alla språk har ett övergripande avgränsningsomfång, och om ett program förklarar en variabel i detta omfång är det känt som en global variabel.
en lokal variabel är däremot en som bara är synlig, eller” i omfattning”, inom dess block.
Tänk på den här koden:
integer globalVariableglobalVariable = 5begin integer localVariable localVariable = 7 globalVariable = 8endlocalVariable = 3 /* <-- this is a syntax error */
den globala variabeln deklareras utanför något block, så är det i det (implicita) globala omfånget, vilket gör det till en global variabel. den lokala variabeln deklareras i begin / end-blocket, vilket begränsar dess räckvidd till det blocket.
variabel globalVariable startar som 5, tilldelas 8 i blocket och avslutas som 8. Variabel localVariable tilldelas 7, går sedan ut ur räckvidden innan den olagligt tilldelas 3. Det finns ingen variabel localVariable på denna nivå.
livslängden för en variabel anger när variabeln är aktiv. I det föregående exemplet skapas en global variabel i början av programmet och har en livstid som är lika med programmets längd. För localVariable skapas det inte förrän strax efter att blocket börjar direktivet. Dess liv är över när programmet passerar slutdirektivet.
dynamisk minnesallokeringredigera
många program har mycket specifika syften och behöver mycket specifika och små områden för minne. Om vi skrev ett program för att läsa bildfiler är vi inte säkra på exakt hur stora bilderna kan vara. Vissa kan vara hundratals megabyte, medan vissa kan vara kilobyte eller mindre. Att tilldela hundratals megabyte som inte behövs skulle göra programmet svårt att köra på vissa datorer medan allokering av för lite minne skulle innebära att det finns några bilder vi inte kan hantera.
ett bra tillvägagångssätt för detta problem är att allokera minne efter behov. Detta kallas dynamisk minnesallokering. Vi ber helt enkelt om så mycket som vi behöver medan programmet körs (snarare än vid kompileringstid), inte mer och inte mindre. I vårt exempel skulle detta låta oss redigera både stora och små bildfiler på ett effektivt och effektivt sätt. Det finns en viss extra komplexitet eftersom det inte längre är språket som handlar om allokeringsdetaljerna, utan oss direkt. I vårt exempel, om vi kör på en nedre dator, kanske det inte finns tillräckligt med minne för att rymma stora bildfiler, så vi måste upptäcka (och eventuellt graciöst misslyckas) i sådana situationer.
dynamisk minnesallokering är en huvudkälla till” minnesläckor”, där program allokerar, använder och sedan görs med ett minnesområde, men misslyckas med att markera det som tillgängligt igen. Dessa problem kan vara svåra att spåra eftersom läckor, till skillnad från andra buggar, inte är uppenbara.
vissa moderna språk har inbyggda mekanismer för att försöka förhindra minnesläckor, så kallade sophämtning. Detta system håller reda på vilken fördelning som används var, när den är utanför räckvidden. Sophämtning har en liten prestanda straff, men det är nu allmänt betraktas som framsteg. Java och Python har till exempel en sopsamlare.