En algunos lenguajes de programación de alto nivel , una variable es una ubicación de almacenamiento o indirección abstracta emparejada con un nombre simbólico asociado , que contiene una cantidad conocida o desconocida de datos u objeto denominado valor ; 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.) o indefinido . [ 1 ] En otros lenguajes como BASIC, Python o Ruby, una variable se describe con mayor precisión como un nombre asociado a un valor, con la asignación de memoria manejada de forma transparente por el intérprete o el entorno de ejecución. Una variable puede eventualmente asociarse o identificarse mediante una dirección de memoria . El nombre de la variable es la forma habitual de referenciar el valor almacenado, además de referirse a la variable misma, según el contexto. Esta separación entre 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 el valor de la variable puede, por lo tanto, cambiar durante el curso de la ejecución del programa . [ 2 ] [ 3 ] [ 4 ] [ 5 ]
En programación, las variables pueden no corresponderse directamente con el concepto de variable 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 necesariamente forma parte de una ecuación o fórmula , como en matemáticas. Además, las variables también pueden ser constantes si su valor se define estáticamente. En programación, las variables suelen tener nombres largos para que describan su uso con mayor precisión, mientras que en matemáticas suelen tener nombres concisos de uno o dos caracteres para facilitar su transcripción y manipulación.
La ubicación de almacenamiento de una variable puede ser referenciada por varios identificadores diferentes, una situación conocida como alias . Asignar un valor a la variable usando uno de los identificadores modificará el valor al que se puede acceder a través de los demás identificadores.
Los compiladores deben 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 suelen permanecer fijos, los datos almacenados en dicha ubicación pueden cambiar durante la ejecución del programa.
Acciones sobre una variable
En los lenguajes de programación imperativos , los valores generalmente se pueden acceder o modificar en cualquier momento. En los lenguajes puramente funcionales y lógicos , las variables están vinculadas a expresiones y conservan un único valor durante toda su vida útil debido a los requisitos de transparencia referencial . En los lenguajes imperativos, las constantes ( con nombre o simbólicas) presentan el mismo comportamiento , a diferencia de las variables (normales).
Según el sistema de tipos de un lenguaje de programación, las variables solo pueden almacenar un tipo de dato específico (por ejemplo, entero o cadena de caracteres ). Alternativamente, un tipo de dato puede estar asociado únicamente al valor actual, lo que permite que una sola variable almacene cualquier valor compatible con el lenguaje de programación. Las variables son los contenedores para almacenar los valores.
Variables y alcance:
- Variables automáticas : Cada variable local en una función existe solo cuando se llama a la función y desaparece cuando se sale de ella. Estas variables se conocen como variables automáticas.
- Variables externas: Son variables externas a una función a las que cualquier función puede acceder por su nombre. Estas variables existen de forma permanente; en lugar de aparecer y desaparecer al llamar y finalizar las funciones, conservan sus valores incluso después de que las funciones que las establecieron hayan finalizado.
Identificadores que hacen referencia a una variable
Se puede utilizar un identificador que haga referencia a una variable para acceder a ella, leer su valor, modificarlo o editar otros atributos , como permisos de acceso, bloqueos , semáforos , etc.
Por ejemplo, una variable podría ser referenciada por el identificador " total_count" y la variable puede contener el número 1956. Si la misma variable rtambién es referenciada por el identificador " ", y si usando este identificador " r", el valor de la variable se modifica a 2009, entonces leer el valor usando el identificador " total_count" dará como resultado 2009 y no 1956.
Si una variable se referencia con un solo identificador, ese identificador puede denominarse simplemente el nombre de la variable ; de lo contrario, podemos referirnos a él como uno de los nombres de la variable . Por ejemplo, en el ejemplo anterior, el identificador " total_count" es el nombre de la variable en cuestión, y " r" es otro nombre de la misma variable.
Alcance y extensión
El ámbito de una variable describe dónde se puede usar en el código del programa, mientras que su duración (también llamada tiempo de vida ) describe cuándo tiene un valor (significativo) durante la ejecución del programa. El ámbito de una variable afecta a su duración. El ámbito es una propiedad del nombre de la variable, mientras que la duración es una propiedad de su ubicación de almacenamiento. No deben confundirse con el contexto (también llamado entorno ), que es una propiedad del programa y varía según el punto del código o la ejecución del programa (véase ámbito: una descripción general ). Además, la duración de un objeto puede coincidir con la de una variable, pero en muchos casos no está vinculada a ella.
El ámbito es una parte importante de la resolución de nombres de una variable. La mayoría de los lenguajes definen un ámbito específico para cada variable (así como para cualquier otra entidad con nombre), que puede variar dentro de un programa dado. El ámbito 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 generalmente inicia la vida útil de una variable (al entrar en contexto) y la salida de ese ámbito generalmente finaliza su vida útil (al salir de contexto). Por ejemplo, una variable con " ámbito léxico " tiene significado solo dentro de una función/ subrutina determinada , o más específicamente dentro de un bloque de expresiones/instrucciones (según el ámbito de función o el ámbito de 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 ámbito dinámico se resuelve en tiempo de ejecución, basándose en una pila de enlace global que depende del flujo de control específico . Las variables accesibles solo dentro de ciertas funciones se denominan " variables locales ". Una " variable global ", o una con alcance indefinido, puede ser referenciada en cualquier parte del programa.
Por otro lado, la extensión es un aspecto dinámico (en tiempo de ejecución ) de una variable. Cada vinculación de una variable a un valor puede tener su propia extensión en tiempo de ejecución. La extensión de la vinculación 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 cuyo alcance exceda permanentemente su ámbito puede provocar una fuga de memoria , en cuyo caso la memoria asignada a la variable nunca podrá liberarse, ya que la variable que se usaría para referenciarla con fines de desasignación ya no es accesible. Sin embargo, puede ser permisible que la vinculación de una variable se extienda más allá de su ámbito, como ocurre en los cierres de Lisp y las variables locales estáticas de C ; cuando la ejecución regresa al ámbito de la variable, esta puede volver a utilizarse. Se dice que una variable cuyo ámbito comienza antes que su alcance no está inicializada y, a menudo, tiene un valor indefinido y arbitrario si se accede a ella (véase puntero salvaje ), ya que aún no se le ha asignado explícitamente un valor particular. Una variable cuyo alcance termina antes que su ámbito 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 por los dos casos anteriores están fuera de alcance o no vinculadas . En muchos lenguajes, es un error intentar usar el valor de una variable cuando está fuera de alcance. En otros idiomas, hacerlo puede generar resultados impredecibles . Sin embargo, a dicha variable se le puede asignar un nuevo valor, lo que le confiere un nuevo alcance.
Para optimizar el uso del espacio, la memoria necesaria para una variable se asigna solo cuando se utiliza por primera vez y se libera cuando ya no se necesita. Una variable solo se necesita cuando está dentro de su ámbito; por lo tanto, iniciar el ciclo de vida de cada variable cuando entra en dicho ámbito puede liberar espacio para variables no utilizadas. Para evitar este desperdicio, los compiladores suelen advertir a los programadores si una variable se declara pero no se utiliza.
Se considera una buena práctica de programación limitar al máximo el alcance de las variables para evitar que diferentes partes de un programa interactúen accidentalmente modificando las variables de las demás. Esto también previene acciones a distancia . Las técnicas comunes para lograrlo consisten en que diferentes secciones de un programa utilicen espacios de nombres distintos o en hacer que las variables individuales sean "privadas" mediante el ámbito dinámico o el ámbito léxico de las variables .
Muchos lenguajes de programación emplean un valor reservado (a menudo llamado null o nil ) para indicar una variable no válida o no inicializada.
Mecanografía
En lenguajes de tipado estático como C , C++ , Java o C# , 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. [ 6 ]
En lenguajes de tipado dinámico como Python , el tipo de una variable se infiere a partir de su valor y puede cambiar según este. En Common Lisp , ambas situaciones coexisten: a una variable se le asigna un tipo (si no se declara, se asume que es el supertipoT universal ) que existe en tiempo de compilación. Los valores también tienen tipos, que pueden verificarse y consultarse en tiempo de ejecución.
La tipificación de variables también permite resolver el polimorfismo en tiempo de compilación. Sin embargo, esto difiere 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 almacene valores de otros tipos de datos . Dichos lenguajes también pueden permitir que las funciones sean paramétricamente polimórficas . Estas funciones operan como variables para representar datos de múltiples tipos. Por ejemplo, una función llamada lengthpuede determinar la longitud de una lista. Dicha lengthfunción puede ser paramétricamente polimórfica 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 los elementos.
Parámetros
Los parámetros formales (o argumentos formales ) de las funciones también se denominan variables. Por ejemplo, en este segmento de código Python ,
def add_two ( x : int ) -> int : return x + 2print ( add_two ( 5 )) # imprime: 7La variable denominada xes un parámetro porque se le asigna un valor cuando se llama a la función. El entero 5 es el argumento que le da xsu valor. En la mayoría de los lenguajes, los parámetros de las funciones tienen un ámbito local. Esta variable específica, denominada, xsolo puede ser referenciada dentro de la add_twofunció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 dado. Muchas implementaciones de lenguaje asignan espacio para variables locales , cuya extensión dura una sola 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 el enlace por nombre , el nombre de una variable está vinculado a la dirección de un bloque particular (secuencia contigua) de bytes en la memoria, y las operaciones sobre 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. Dichas 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. Sin embargo, un valor es una abstracción, una idea; en la práctica, un valor se representa mediante un objeto de datos , que se almacena en la memoria del ordenador. El programa, o el entorno de ejecución , debe reservar memoria para cada objeto de datos y, dado que la memoria es finita, asegurarse de que esta se libere para su reutilización cuando el objeto ya no sea necesario para representar el valor de alguna variable.
Los objetos asignados desde el montón deben ser recuperados , especialmente cuando ya no son necesarios. En lenguajes con recolección de basura (como C# , Java , Python, Golang y Lisp ), el entorno de ejecución recupera automáticamente los objetos cuando las variables existentes ya no pueden hacer referencia a ellos. En lenguajes sin recolección de basura, como C , el programa (y el programador) deben asignar memoria explícitamente y luego liberarla para recuperarla. No hacerlo provoca fugas de memoria , en las que el montón se agota durante la ejecución del programa, lo que conlleva el riesgo de un fallo eventual por agotamiento de la memoria disponible.
Cuando una variable hace referencia a una estructura de datos creada dinámicamente, algunos de sus componentes pueden ser accesibles solo indirectamente a través de la variable. En tales circunstancias, los recolectores de basura (o funciones de programación análogas en lenguajes que carecen de recolectores de basura) deben gestionar el caso en el que solo se necesita recuperar una parte de la memoria accesible desde la variable.
Convenciones de nomenclatura
A diferencia de sus contrapartes matemáticas, las variables y constantes de programación suelen tener nombres de varios caracteres, por ejemplo, COSTo total. Los nombres de un solo carácter se utilizan con mayor frecuencia solo para variables auxiliares; por ejemplo, i, j, kpara variables de índice de matriz .
Algunas convenciones de nomenclatura se aplican a nivel de lenguaje como parte de la sintaxis, que incluye el formato de los identificadores válidos. En casi todos los lenguajes, los nombres de las variables no pueden comenzar con un dígito (0-9) ni contener espacios en blanco. El uso de signos de puntuación en los nombres de las variables varía según el lenguaje; muchos solo permiten el guion bajo ("_") y prohíben cualquier otro signo de puntuación. En algunos lenguajes de programación, se añaden símbolos o signos de puntuación a los identificadores de las variables para indicar su tipo de dato o ámbito.
La distinción entre mayúsculas y minúsculas en los nombres de variables también varía entre lenguajes, y algunos requieren el uso de un tipo específico de mayúsculas y minúsculas al nombrar ciertas entidades; [ nota 1 ] La mayoría de los lenguajes modernos distinguen entre mayúsculas y minúsculas; algunos lenguajes más antiguos no. Algunos lenguajes reservan ciertas formas de nombres de variables para su uso interno; en muchos lenguajes, los nombres que comienzan con dos guiones bajos ("__") suelen pertenecer a esta categoría.
Sin embargo, más allá de las restricciones básicas impuestas por un lenguaje, la denominación de variables es en gran medida una cuestión de estilo. A nivel de código máquina , no se utilizan nombres de variables, por lo que los nombres exactos elegidos no importan para la computadora. Así, los nombres de las variables las identifican; para lo demás, son simplemente 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 dificultar la revisión del código en comparación con nombres no descriptivos, por lo que a menudo se recomienda el uso de nombres claros. [ 7 ] [ 8 ]
Los programadores suelen crear y seguir guías 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 son más rápidos de escribir, pero menos descriptivos; los nombres más largos suelen facilitar la lectura de los programas y la comprensión del propósito de las variables. Sin embargo, una excesiva verbosidad en los nombres de las variables también puede dar lugar a un código menos comprensible.
Tipos de variables (según su duración)
Podemos clasificar las variables según su tiempo de vida. 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 conocida como variable global, se vincula a una celda de memoria antes de que comience la ejecución y permanece en la misma celda 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 instrucción de declaración y se libera cuando el procedimiento finaliza. Los principales ejemplos son las variables locales en subprogramas de C y métodos de Java. Las variables dinámicas de montón explícitas son celdas de memoria sin nombre (abstractas) que se asignan y liberan mediante instrucciones de tiempo de ejecución explícitas especificadas por el programador. Los principales ejemplos son los objetos dinámicos en C++ (mediante `new` y `delete`) y todos los objetos en Java. Las variables dinámicas de montón implícitas se vinculan al almacenamiento del montón solo cuando se les asignan valores. La asignación y liberación ocurren cuando se reasignan valores a las variables. Como resultado, las variables dinámicas de 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.
Véase también
- Atributo (programación orientada a objetos)
- Clase (programación)
- Variable de control (programación)
- Variable dinámica
- Expresión (informática)
- Indirección
- Variable no local
- Objeto (informática)
- Propiedad (programación orientada a objetos)
- Escalar (matemáticas)
- Estado (informática)
- Variable temporal
- interpolación variable
Notas
Referencias
- ↑ Brookshear 2019 , pág. 249, "Variables y tipos de datos", "los lenguajes de programación de alto nivel permiten que las ubicaciones en la memoria principal se referencien mediante nombres descriptivos en lugar de direcciones numéricas."
- ↑ Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D. (1986), Compiladores: Principios, técnicas y herramientas , págs. 26–28 , Bibcode : 1986cptt.book.....A
- ↑ Knuth, Donald (1997). El arte de la programación informática . Vol. 1 (3.ª ed.). Reading, Massachusetts: Addison-Wesley. pp. 3–4 . ISBN 0-201-89683-4.
- ↑ "Programación con variables" . Khan Academy . Consultado el 23 de marzo de 2020 .
- ↑ "Scratch para programadores principiantes" . Harvard. Archivado del original el 23 de marzo de 2020. Consultado el 23 de marzo de 2020 .
- ↑ "Tipado estático - Glosario de MDN Web Docs: Definiciones de términos relacionados con la web | MDN" . developer.mozilla.org . 8 de junio de 2023 . Consultado el 6 de mayo de 2024 .
- ↑ Cómo no elegir variables Archivado el 21/12/2016 en Wayback Machine , consultado el 11 de julio de 2012 [ENLACE ROTO]
- ↑ Edsger Dijkstra , ¡Al diablo con los "identificadores significativos"!
Obras citadas
- Brookshear, J. Glenn (2019). "Informática: una visión general" (PDF) . Recuperado el 1 de abril de 2024 .
- Variable (informática)
- conceptos de lenguajes de programación
- Tipos de datos
- teoría de tipos