stringtranslate.com

Variable (informática)

En programación de computadoras , una variable es una ubicación de almacenamiento abstracta emparejada con un nombre simbólico asociado , que contiene alguna cantidad conocida o desconocida de datos u objetos denominados valores ; o en términos más simples, una variable es un contenedor con nombre para un conjunto particular de bits o tipo de datos (como entero , flotante , cadena , etc.). Una variable puede eventualmente asociarse o identificarse mediante una dirección de memoria . El nombre de la variable es la forma habitual de hacer referencia al valor almacenado, además de hacer referencia a la propia variable, según el contexto. Esta separación de nombre y contenido permite que el nombre se utilice independientemente de la información exacta que representa. El identificador en el código fuente de la computadora puede vincularse a un valor durante el tiempo de ejecución y, por lo tanto, el valor de la variable puede cambiar durante el curso de la ejecución del programa . [1] [2] [3] [4]

Las variables en programación pueden no corresponderse directamente con el concepto de variables en matemáticas . Este último es abstracto y no hace referencia a un objeto físico como una ubicación de almacenamiento. El valor de una variable informática no es necesariamente parte de una ecuación o fórmula como en matemáticas. A las variables en programación informática con frecuencia se les dan nombres largos para que sean relativamente descriptivas de su uso, mientras que las variables en matemáticas a menudo tienen nombres concisos, de uno o dos caracteres, para mayor brevedad en la transcripción y manipulación.

La ubicación de almacenamiento de una variable puede estar referenciada por varios identificadores diferentes, una situación conocida como aliasing . Asignar un valor a la variable usando uno de los identificadores cambiará el valor al que se puede acceder a través de los otros identificadores.

Los compiladores tienen que reemplazar los nombres simbólicos de las variables con las ubicaciones reales de los datos. Si bien el nombre, el tipo y la ubicación de una variable a menudo permanecen fijos, los datos almacenados en la ubicación pueden cambiar durante la ejecución del programa.

Acciones sobre una variable

En los lenguajes de programación imperativos , generalmente se puede acceder a los valores o cambiarlos en cualquier momento. En lenguajes lógicos y funcionales puros , las variables están vinculadas a expresiones y mantienen un valor único durante toda su vida debido a los requisitos de transparencia referencial . En los lenguajes imperativos, el mismo comportamiento lo exhiben las constantes (nombradas) (constantes simbólicas), que normalmente se contrastan con las variables (normales).

Dependiendo del sistema de tipos de un lenguaje de programación, es posible que las variables solo puedan almacenar un tipo de datos específico (por ejemplo, entero o cadena ). Alternativamente, un tipo de datos puede asociarse solo con el valor actual, permitiendo que una sola variable almacene cualquier cosa admitida por el lenguaje de programación. Las variables son los contenedores para almacenar los valores.

Variables y alcance:

Identificadores que hacen referencia a una variable

Se puede utilizar un identificador que haga referencia a una variable para acceder a la variable con el fin de leer el valor, modificar el valor o editar otros atributos de la variable, como permiso de acceso, bloqueos , semáforos , etc.

Por ejemplo, una variable puede estar referenciada por el identificador " total_count" y la variable puede contener el número 1956. Si la misma variable rtambién está referenciada por el identificador " ", y si se utiliza este identificador " r", el valor de la variable es modificado a 2009, luego leer el valor usando el identificador " total_count" arrojará un resultado de 2009 y no 1956.

Si solo se hace referencia a una variable mediante un único identificador, ese identificador puede denominarse simplemente el nombre de la variable ; de lo contrario podemos hablar de él como uno de los nombres de la variable . Por ejemplo, en el ejemplo anterior el identificador " total_count" es un nombre de la variable en cuestión y " r" es otro nombre de la misma variable.

Alcance y extensión

El alcance de una variable describe en qué parte del texto de un programa se puede usar la variable, mientras que la extensión (también llamada vida útil ) de una variable describe cuándo en la ejecución de un programa la variable tiene un valor (significativo). El alcance de una variable afecta su extensión. El alcance de una variable es en realidad una propiedad del nombre de la variable y la extensión es una propiedad de la ubicación de almacenamiento de la variable. Estos no deben confundirse con el contexto (también llamado entorno ), que es una propiedad del programa y varía según el punto del texto o la ejecución del programa; consulte alcance: descripción general . Además, la vida útil del objeto puede coincidir con la vida útil variable, pero en muchos casos no está vinculada a ella.

El alcance es una parte importante de la resolución del nombre de una variable. La mayoría de los lenguajes definen un alcance específico para cada variable (así como cualquier otra entidad nombrada), que puede diferir dentro de un programa determinado. El alcance de una variable es la parte del texto del programa para la cual el nombre de la variable tiene significado y para la cual se dice que la variable es "visible". La entrada a ese ámbito normalmente comienza la vida útil de una variable (cuando entra en contexto) y la salida de ese ámbito normalmente finaliza su vida útil (cuando sale de contexto). Por ejemplo, una variable con " alcance léxico " tiene significado sólo dentro de una determinada función/ subrutina , o más finamente dentro de un bloque de expresiones/declaraciones (de acuerdo con el alcance de la función o el alcance del bloque ); Esta es una resolución estática, que se puede realizar en tiempo de análisis o en tiempo de compilación. Alternativamente, una variable con alcance dinámico se resuelve en tiempo de ejecución, en función de una pila de enlace global que depende del flujo de control específico . Las variables a las que sólo se puede acceder dentro de determinadas funciones se denominan " variables locales ". Se puede hacer referencia a una " variable global ", o una con alcance indefinido, en cualquier parte del programa.

La extensión , por otro lado, es un aspecto de tiempo de ejecución ( dinámico ) de una variable. Cada enlace de una variable a un valor puede tener su propia extensión en tiempo de ejecución. La extensión del enlace es la porción del tiempo de ejecución del programa durante la cual la variable continúa haciendo referencia al mismo valor o ubicación de memoria. Un programa en ejecución puede entrar y salir de una extensión determinada muchas veces, como en el caso de un cierre .

A menos que el lenguaje de programación incluya recolección de basura , una variable cuya extensión sobrepasa permanentemente su alcance puede resultar en una pérdida de memoria , por lo que la memoria asignada para la variable nunca podrá liberarse dado que la variable que se usaría para hacer referencia a ella con fines de desasignación ya no lo está. accesible. Sin embargo, puede estar permitido que un enlace de variable se extienda más allá de su alcance, como ocurre en los cierres de Lisp y las variables locales estáticas de C ; cuando la ejecución vuelve al alcance de la variable, la variable se puede volver a utilizar. Se dice que una variable cuyo alcance comienza antes que su extensión no está inicializada y, a menudo, tiene un valor arbitrario e indefinido si se accede a ella (ver puntero salvaje ), ya que todavía no se le ha asignado explícitamente un valor particular. Una variable cuya extensión termina antes de su alcance puede convertirse en un puntero colgante y considerarse no inicializada una vez más ya que su valor ha sido destruido. Se puede decir que las variables descritas en los dos casos anteriores están fuera de extensión o sin consolidar . En muchos idiomas, es un error intentar utilizar el valor de una variable cuando está fuera de extensión. En otros idiomas, hacerlo puede producir resultados impredecibles . Sin embargo, a dicha variable se le puede asignar un nuevo valor, lo que le otorga una nueva extensión.

Para ahorrar espacio, el espacio de memoria necesario para una variable puede asignarse sólo cuando la variable se utiliza por primera vez y liberarse cuando ya no sea necesaria. Una variable solo es necesaria cuando está dentro del alcance, por lo que comenzar la vida útil de cada variable cuando ingresa al alcance puede dar espacio a las variables no utilizadas. Para evitar desperdiciar ese espacio, los compiladores suelen advertir a los programadores si se declara una variable pero no se utiliza.

Se considera una buena práctica de programación hacer que el alcance de las variables sea lo más limitado posible para que las diferentes partes de un programa no interactúen accidentalmente entre sí modificando las variables de cada una. Hacerlo también impide la acción a distancia . Las técnicas comunes para hacerlo son hacer que diferentes secciones de un programa utilicen diferentes espacios de nombres o hacer que las variables individuales sean "privadas" mediante el alcance de variables dinámicas o el alcance de variables léxicas .

Muchos lenguajes de programación emplean un valor reservado (a menudo denominado nulo o nulo ) para indicar una variable no válida o no inicializada.

Mecanografía

En lenguajes de tipo estático como Go o ML , una variable también tiene un tipo , lo que significa que solo se pueden almacenar ciertos tipos de valores en ella. Por ejemplo, una variable de tipo " entero " tiene prohibido almacenar valores de texto.

En lenguajes de tipo dinámico como Python , el tipo de una variable se infiere por su valor y puede cambiar según su valor. En Common Lisp , ambas situaciones existen simultáneamente: a una variable se le asigna un tipo (si no está declarado, se supone que es el supertipoT universal ) que existe en el momento de la compilación. Los valores también tienen tipos que se pueden verificar y consultar en tiempo de ejecución.

La escritura de variables también permite resolver polimorfismos en tiempo de compilación. Sin embargo, esto es diferente del polimorfismo utilizado en las llamadas a funciones orientadas a objetos (denominadas funciones virtuales en C++ ), que resuelve la llamada en función del tipo de valor en lugar de los supertipos que la variable puede tener.

Las variables suelen almacenar datos simples, como números enteros y cadenas literales, pero algunos lenguajes de programación permiten que una variable también almacene valores de otros tipos de datos . Estos lenguajes también pueden permitir que las funciones sean polimórficas paramétricas . Estas funciones operan como variables para representar datos de múltiples tipos. Por ejemplo, una función nombrada lengthpuede determinar la longitud de una lista. Dicha lengthfunción puede ser polimórfica paramétrica al incluir una variable de tipo en su firma de tipo , ya que el número de elementos en la lista es independiente de los tipos de elementos.

Parámetros

Los parámetros formales (o argumentos formales ) de funciones también se denominan variables. Por ejemplo, en este segmento de código Python ,

>>> def  sumardos ( x ): ...  devolver  x  +  2 ... >>> sumardos ( 5 ) 7

la variable nombrada xes un parámetro porque se le asigna un valor cuando se llama a la función. El número entero 5 es el argumento que da xsu valor. En la mayoría de los idiomas, los parámetros de función tienen alcance local. xSolo se puede hacer referencia a esta variable específica nombrada dentro de la addtwofunción (aunque, por supuesto, otras funciones también pueden tener variables llamadas x).

Asignación de memoria

Los detalles de la asignación de variables y la representación de sus valores varían ampliamente, tanto entre lenguajes de programación como entre implementaciones de un lenguaje determinado. Muchas implementaciones de lenguajes asignan espacio para variables locales , cuya extensión dura una única llamada a función en la pila de llamadas y cuya memoria se recupera automáticamente cuando la función regresa. De manera más general, en la vinculación de nombres , el nombre de una variable está vinculado a la dirección de algún bloque particular (secuencia contigua) de bytes en la memoria, y las operaciones en la variable manipulan ese bloque. La referencia es más común para variables cuyos valores tienen tamaños grandes o desconocidos cuando se compila el código. Estas variables hacen referencia a la ubicación del valor en lugar de almacenar el valor en sí, que se asigna desde un grupo de memoria llamado montón .

Las variables vinculadas tienen valores. Un valor, sin embargo, es una abstracción, una idea; En la implementación, un valor está representado por algún objeto de datos , que se almacena en algún lugar de la memoria de la computadora. El programa, o el entorno de ejecución , debe reservar memoria para cada objeto de datos y, dado que la memoria es finita, garantizar que esta memoria se utilice para su reutilización cuando el objeto ya no sea necesario para representar el valor de alguna variable.

Los objetos asignados del montón deben recuperarse, especialmente cuando ya no son necesarios. En un lenguaje de recolección de basura (como C# , Java , Python, Golang y Lisp ), el entorno de ejecución recupera automáticamente objetos cuando las variables existentes ya no pueden hacer referencia a ellos. En lenguajes que no recolectan basura, como C , el programa (y el programador) deben asignar memoria explícitamente y luego liberarla para recuperarla. De lo contrario, se producirán pérdidas de memoria , en las que el montón se agota a medida que se ejecuta el programa y se corre el riesgo de que falle al agotarse la memoria disponible.

Cuando una variable se refiere a una estructura de datos creada dinámicamente, a algunos de sus componentes solo se puede acceder indirectamente a través de la variable. En tales circunstancias, los recolectores de basura (o funciones de programa análogas en lenguajes que carecen de recolectores de basura) deben lidiar con un caso en el que solo es necesario recuperar una parte de la memoria accesible desde la variable.

Convenciones de nombres

A diferencia de sus contrapartes matemáticas, las variables y constantes de programación comúnmente toman nombres de varios caracteres, por ejemplo COSTo total. Los nombres de un solo carácter se utilizan más comúnmente sólo para variables auxiliares; por ejemplo, i, j, kpara variables de índice de matriz .

Algunas convenciones de nomenclatura se aplican a nivel del idioma como parte de la sintaxis del idioma que implica el formato de identificadores válidos. En casi todos los idiomas, los nombres de las variables no pueden comenzar con un dígito (0 a 9) y no pueden contener espacios en blanco. El hecho de que se permitan o no signos de puntuación en los nombres de variables varía de un idioma a otro; muchos idiomas sólo permiten el guión bajo ("_") en los nombres de variables y prohíben cualquier otra puntuación. En algunos lenguajes de programación, los sigilos (símbolos o puntuación) se colocan en identificadores de variables para indicar el tipo de datos o el alcance de la variable.

La distinción entre mayúsculas y minúsculas de los nombres de variables también varía entre idiomas y algunos idiomas requieren el uso de un determinado caso para nombrar ciertas entidades; [nota 1] La mayoría de los idiomas modernos distinguen entre mayúsculas y minúsculas; algunos idiomas más antiguos no lo son. Algunos idiomas reservan ciertas formas de nombres de variables para su propio uso interno; En muchos idiomas, los nombres que comienzan con dos guiones bajos ("__") suelen entrar en esta categoría.

Sin embargo, más allá de las restricciones básicas impuestas por un idioma, la denominación de las variables es en gran medida una cuestión de estilo. A nivel de código de máquina , no se utilizan nombres de variables, por lo que los nombres exactos elegidos no le importan a la computadora. Por lo tanto, los nombres de las variables las identifican; por lo demás, son solo una herramienta para que los programadores hagan que los programas sean más fáciles de escribir y comprender. El uso de nombres de variables mal elegidos puede hacer que el código sea más difícil de revisar que los nombres no descriptivos, por lo que a menudo se recomiendan nombres que sean claros. [5] [6]

Los programadores a menudo crean y cumplen pautas de estilo de código que ofrecen orientación sobre cómo nombrar variables o imponen un esquema de nomenclatura preciso. Los nombres más cortos se escriben más rápido pero son menos descriptivos; Los nombres más largos a menudo hacen que los programas sean más fáciles de leer y el propósito de las variables más fácil de entender. Sin embargo, la verbosidad extrema en los nombres de las variables también puede dar lugar a un código menos comprensible.

Tipos de variables (basados ​​en la vida útil)

Podemos clasificar las variables según su vida útil. Los diferentes tipos de variables son estáticas, dinámicas de pila, dinámicas de montón explícitas y dinámicas de montón implícitas. Una variable estática también se conoce como variable global, está vinculada a una celda de memoria antes de que comience la ejecución y permanece en la misma celda de memoria hasta su finalización. Un ejemplo típico son las variables estáticas en C y C++. Una variable dinámica de pila se conoce como variable local, que se vincula cuando se ejecuta la declaración de declaración y se desasigna cuando regresa el procedimiento. Los ejemplos principales son variables locales en subprogramas C y métodos Java. Las variables dinámicas de montón explícitas son celdas de memoria sin nombre (abstractas) que se asignan y desasignan mediante instrucciones explícitas de tiempo de ejecución especificadas por el programador. Los ejemplos principales son los objetos dinámicos en C++ (mediante nuevos y eliminados) y todos los objetos en Java. Las variables dinámicas de montón implícitas están vinculadas al almacenamiento de montón solo cuando se les asignan valores. La asignación y liberación ocurren cuando los valores se reasignan a las variables. Como resultado, las variables dinámicas del montón implícitas tienen el mayor grado de flexibilidad. Los ejemplos principales son algunas variables en JavaScript, PHP y todas las variables en APL.

Ver también

Notas

  1. ^ Por ejemplo, Haskell requiere que los nombres de los tipos comiencen con una letra mayúscula.

Referencias

  1. ^ Compiladores: principios, técnicas y herramientas , págs. 26-28
  2. ^ Knuth, Donald (1997). El arte de la programación informática . vol. 1 (3ª ed.). Reading, Massachusetts: Addison-Wesley. págs. 3–4. ISBN 0-201-89683-4.
  3. ^ "Programación con variables". Academia Khan . Consultado el 23 de marzo de 2020 .
  4. ^ "Scratch para programadores en ciernes". Harvard . Consultado el 23 de marzo de 2020 .
  5. ^ Cómo no elegir variables, obtenido el 11 de julio de 2012 [ENLACE MUERTO]
  6. ^ Edsger Dijkstra , ¡Al diablo con los "identificadores significativos"!