| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Matteo
Registrado: 14 Nov 2008 Mensajes: 43 Ubicación: Argentina - Entre Rios
| Publicado: 11/12/2008 4:19 pm | | | Título: Como se almacenan las variables en la memoria |
| Tengo esta duda ( bueno y muchas otras, soy un bastaaaante curioso e intranquilo con lo referente a saber como funciona todo ) 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.
 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? |
| | Volver arriba | |  | jaumegs
Registrado: 09 Oct 2005 Mensajes: 294
| Publicado: 11/12/2008 5:31 pm | | | Título: |
| 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: | +----------+ 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. |
| | Volver arriba | |  | marioxcc

Registrado: 17 Oct 2008 Mensajes: 171 Ubicación: México
| Publicado: 11/12/2008 6:26 pm | | | Título: |
| Puede ser de utilidad este artícuo sobre el endianness. _________________ La computadora no se equivoca, el programador si. |
| | Volver arriba | |  | | cheroky
Registrado: 22 Sep 2005 Mensajes: 2556 Ubicación: Valladolid (España)
| Publicado: 12/12/2008 12:50 am | | | Título: |
| | 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* _________________ La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí. |
| | Volver arriba | |  | Matteo
Registrado: 14 Nov 2008 Mensajes: 43 Ubicación: Argentina - Entre Rios
| Publicado: 12/12/2008 7:41 pm | | | Título: |
| 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.
| Cita: | | Mas info wiki, google y meditacion trascendental. |
 |
| | Volver arriba | |  | jaumegs
Registrado: 09 Oct 2005 Mensajes: 294
| Publicado: 13/12/2008 11:34 am | | | Título: |
| 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. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |