Usando VariablesEdit
Visibilidad y Vida útil de las variables VariablesEdit
Las variables pueden tener una visibilidad o alcance diferentes, según cómo se declaren y utilicen. El alcance se refiere a la capacidad de acceder al contenido de una variable en particular en un punto determinado del programa.
Por lo general, el ámbito de una variable está determinado por su bloque envolvente. Un bloque se puede encerrar explícitamente en algunos idiomas (begin / end, pares { / }), mientras que en otros el bloque es implícito.
Casi todos los idiomas tienen un ámbito delimitador general, y si un programa declara una variable en este ámbito, se conoce como variable global.
Una variable local, por el contrario, es una que solo es visible, o» en el ámbito», dentro de su bloque.
Considere este código:
integer globalVariableglobalVariable = 5begin integer localVariable localVariable = 7 globalVariable = 8endlocalVariable = 3 /* <-- this is a syntax error */
la variable global se declara fuera de cualquier bloque, por lo que está en el ámbito global (implícito), lo que la convierte en una variable global. la variable local se declara en el bloque begin / end, limitando su ámbito a ese bloque.
La variable globalVariable comienza como 5, se asigna 8 en el bloque y sale como 8. A la variable localVariable se le asigna 7, luego sale del ámbito antes de ser asignada ilegalmente 3. No hay variables variables locales en este nivel.
La vida útil de una variable le indica cuándo la variable está activa. En el ejemplo anterior, se crea una variable global al inicio del programa y tiene una vida útil igual a la duración del programa. Para localVariable, no se crea hasta justo después de que comience la directiva block. Su vida útil termina cuando el programa pasa la directiva final.
Asignación dinámica de memoriaeditar
Muchos programas tienen propósitos muy específicos y necesitan áreas muy específicas y pequeñas para la memoria. Si estuviéramos escribiendo un programa para leer archivos de imagen, no estamos seguros de qué tan grandes podrían ser las imágenes. Algunos podrían ser cientos de megabytes, mientras que otros podrían ser kilobytes o menos. Asignar cientos de megabytes que no son necesarios haría que el programa sea difícil de ejecutar en algunos equipos, mientras que asignar muy poca memoria significaría que hay algunas imágenes que no podemos manejar.
Un buen enfoque para este problema es asignar memoria según sea necesario. Esto se denomina Asignación dinámica de memoria. Simplemente pedimos todo lo que necesitamos mientras el programa está en ejecución (en lugar de en tiempo de compilación), ni más ni menos. En nuestro ejemplo, esto nos permitiría editar archivos de imagen grandes y pequeños de una manera eficiente y efectiva. Hay una cierta complejidad añadida, ya que ya no es el lenguaje el que se ocupa de los detalles de la asignación, sino nosotros directamente. En nuestro ejemplo, si nos estamos ejecutando en un equipo de gama baja, es posible que no haya suficiente memoria para acomodar archivos de imagen grandes, por lo que tenemos que detectar (y posiblemente fallar correctamente) en tales situaciones.
La asignación dinámica de memoria es una fuente principal de» fugas de memoria», donde los programas asignan, usan y luego se hacen con un área de memoria, pero no la marcan como disponible una vez más. Estos problemas pueden ser difíciles de rastrear ya que, a diferencia de otros errores, las fugas no son fáciles de detectar.
Algunos lenguajes modernos tienen mecanismos incorporados para tratar de evitar fugas de memoria, conocidos como recolección de basura. Este sistema realiza un seguimiento de qué asignación se utiliza, dónde y cuándo está fuera de alcance. La recolección de basura tiene una ligera penalización de rendimiento, pero ahora se considera comúnmente como progreso. Java y Python, por ejemplo, tienen un recolector de basura.