usando VariablesEdit
visibilidade e vida útil das variáveis VariablesEdit
as variáveis podem ter visibilidade ou âmbito diferentes, de acordo com a forma como são declaradas e utilizadas. Escopo refere-se à capacidade de acessar o conteúdo de uma variável particular em um determinado ponto do programa.
Geralmente, o escopo de uma variável é determinado por seu bloco envolvente. Um bloco pode ser fechado explicitamente em algumas línguas (pares begin/end, { / }), enquanto em outras o bloco está implícito.
quase todas as linguagens têm um escopo envolvente global, e se um programa declara uma variável neste escopo, é conhecido como uma variável global.
uma variável local, em contraste, é uma que só é visível, ou “em escopo”, dentro de seu bloco.
considere este código:
integer globalVariableglobalVariable = 5begin integer localVariable localVariable = 7 globalVariable = 8endlocalVariable = 3 /* <-- this is a syntax error */
a variável global é declarada fora de qualquer bloco, assim é no (implícito) escopo global, tornando-se uma variável global. a variável local é declarada no bloco de início/fim, limitando seu escopo a esse bloco.
variável globalvariável começa como 5, é atribuído 8 no bloco e sai como 8. Variável localvariável é atribuído 7, em seguida, sai do âmbito de aplicação antes de ser atribuído ilegalmente 3. Não existe variável localvariável neste nível.
A vida de uma variável indica-lhe quando a variável está activa. No exemplo anterior, uma variável global é criada no início do programa e tem uma vida igual à duração do programa. Para variável local, ele não é criado até que logo após o bloco começa a diretriz. Sua vida acaba quando o programa passa a diretriz final.
alocação dinâmica de memória
muitos programas têm propósitos muito específicos e precisam de áreas muito específicas e pequenas para a memória. Se estávamos escrevendo um programa para ler arquivos de imagem, não temos certeza de quão grandes as imagens poderiam ser. Alguns podem ser centenas de megabytes, enquanto outros podem ser kilobytes ou menos. Alocação de centenas de megabytes que não são necessários faria o programa difícil de executar em alguns computadores enquanto alocação de memória muito pouco significaria que existem algumas imagens que não podemos lidar.
uma boa abordagem para este problema é alocar memória conforme necessário. Isto é chamado alocação dinâmica de memória. Nós simplesmente pedimos tanto quanto precisamos enquanto o programa está em execução (ao invés de no tempo de compilação), nem mais nem menos. No nosso exemplo, isso nos permitiria editar arquivos de imagem enormes e minúsculos de uma forma eficiente e eficaz. Há alguma complexidade adicional, uma vez que não é mais a linguagem que está lidando com os detalhes da alocação, mas nós diretamente. Em nosso exemplo, se estamos rodando em um computador de baixo fim, pode não haver memória suficiente para acomodar grandes arquivos de imagem, então temos que detectar (e possivelmente falha graciosamente) em tais situações.
alocação dinâmica de memória é uma fonte principal de” vazamentos de memória”, onde os programas alocam, usam e são então feitos com uma área de memória, mas não conseguem marcá-lo como estando disponível mais uma vez. Estes problemas podem ser difíceis de rastrear, uma vez que ao contrário de outros bugs, vazamentos não são facilmente aparentes.
algumas línguas modernas têm mecanismos embutidos para tentar evitar vazamentos de memória, conhecidos como coleta de lixo. Este sistema mantém o controle de qual alocação é usada onde, quando está fora do escopo. A recolha de lixo tem uma pequena penalidade de desempenho, mas agora é comumente considerado como progresso. Java e Python, por exemplo, têm um coletor de lixo.