Como se almacenan las variables en la memoria

Consultas de temas que no tienen nada que ver con la programación en C/C++.
Responder
Mensaje
Autor
Avatar de Usuario
Matteo
Mensajes: 43
Registrado: 14/11/2008 5:25 pm
Ubicación: Argentina - Entre Rios

Como se almacenan las variables en la memoria

#1 Mensaje por Matteo » 11/12/2008 4:19 pm

Tengo esta duda ( bueno y muchas otras, soy un bastaaaante curioso e intranquilo con lo referente a saber como funciona todo :roll: ) hace ya un tiempo, aver si alguien sabe:

Se que las variables son un monton de bits agrupados en bytes y a cada uno de estos le es dado una direccion de memoria.
Imagen
Pero la pregunta es, donde se almacena el codigo que le dice "esto es un int", "esto es un array", "llamada a funcion", etc etc.
Tengo que aprender ASM si o si para saber esto?

Avatar de Usuario
jaumegs
Mensajes: 294
Registrado: 09/10/2005 11:00 pm

#2 Mensaje por jaumegs » 11/12/2008 5:31 pm

Si realmente te interesa la programación te aconsejo aprender ensamblador, pues supone aprender como trabaja el procesador con la memoria y los periféricos, conceptos que de otra forma no comprenderías completamente.

Las variables se almacenan en la memoria (entendemos por memoria la memoria RAM) en una (o varias) dirección específica. Por ejemplo, en una arquitectura de 32 bits con direccionamiento de memoria byte a byte (la dirección N corresponde al byte [8 bits] X, la N+1 del byte Y, etc. y no a la palabra [32 bits] X, la palabra Y, etc.) y little endian, una variable X de 32 bits se almacena de la siguiente forma:

Código: Seleccionar todo

           +----------+
0x00000000 |          |
           +----------+
           |   ...    |
           +----------+
0x00003490 | X[0-7]   |
           +----------+
0x00003491 | X[8-15]  |
           +----------+
0x00003492 | X[16-23] |
           +----------+
0x00003493 | X[24-31] |
           +----------+
           |   ...    |
           +----------+
0xffffffff |          |
           +----------+
Un puntero a la variable X es un puntero a la dirección 0x00003490.

El procesador no entiende de tipos. Un puntero es una dirección de memoria y una variable es una colección de bits uno tras otro. Esta distinción la introducen los lenguajes de programación junto con los mecanismos para identificarlos. C por ejemplo solo los diferencia en tiempo de compilación, es decir, comprueba que el programa las utilice correctamente y el código generado supone que en la dirección N de memoria la variable X es del tipo T.

Saludos.

Avatar de Usuario
marioxcc
Mensajes: 170
Registrado: 17/10/2008 2:45 pm
Ubicación: México

#3 Mensaje por marioxcc » 11/12/2008 6:26 pm

Puede ser de utilidad este artícuo sobre el endianness.
La computadora no se equivoca, el programador si.

Avatar de Usuario
cheroky
Mensajes: 2571
Registrado: 22/09/2005 11:00 pm
Ubicación: Valladolid (España)

#4 Mensaje por cheroky » 12/12/2008 12:50 am

Matteo escribió:Pero la pregunta es, donde se almacena el codigo que le dice "esto es un int", "esto es un array", "llamada a funcion", etc etc.
Como ya te han dicho, los tipos son comprobados en la fase de compilación, ahora bien, el código (instrucciones) que determina el tamaño, niveles de direccionamiento y llamadas a función es almacenado en memoria cuando se carga el código ejecutable, este (valga la redundancia) se ejecuta mediante un puntero aleatorio (instrucción pointer). También hay que reseñar que los tipos compuestos son el resultado de la combinación de tamaños máximos que puede manejar el procesador sin usar código extendido, en estos casos el alineamiento de dichas variables puede (por optimización) no ser contiguo, (padding). Mas info wiki, google y meditacion trascendental.

*EOF*
Imagen

Avatar de Usuario
Matteo
Mensajes: 43
Registrado: 14/11/2008 5:25 pm
Ubicación: Argentina - Entre Rios

#5 Mensaje por Matteo » 12/12/2008 7:41 pm

Osea que en definitiva es la forma en que se llaman las instrucciones directamente, no existe tal cosa como un conjuntos de bytes destinados a decir que la memoria 0x1223fe (o la que se me ocurra) contiene un int u otro tipo, gracias a todos.
Mas info wiki, google y meditacion trascendental.
:oops:

Avatar de Usuario
jaumegs
Mensajes: 294
Registrado: 09/10/2005 11:00 pm

#6 Mensaje por jaumegs » 13/12/2008 11:34 am

En C eso es correcto, pero depende del lenguaje y la interpretación que haga el compilador. Por ejemplo, en Smalltalk (un sistema de objetos), aunque el concepto de tipo no está definido, todos los objetos tienen un puntero a la clase de la que son instancia o lo que es lo mismo, un campo que indica su tipo (variables que contiene y métodos a los que responde). Algunas implementaciones de Lisp también reservan algunos bits para esta tarea.

En C no es necesario porque el compilador sabe el tipo de todas las variables que se utilizan en el programa, estáticas o dinámicas (en las dinámicas se indica con un casting al puntero void que retorna malloc), por lo que la información del tipo de las variables se almacena en el propio código. No ocurre lo mismo con Smalltalk y Lisp, pues son lenguajes que no diferencian entre la fase de compilación y ejecución. La estructura del código puede variar completamente durante la ejecución, haciendo que sea necesario almacenar explícitamente el tipo de las variables.

Para profundizar en este tema te recomiendo que estudies algo de teoría de lenguajes y computación y profundices con varios lenguajes de diferentes paradigmas (ensamblador [lenguaje máquina], C [imperativa], Lisp [funcional-declarativa], Prolog [lógica-declarativa], Smalltalk [OO pura]).

Saludos.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado