Por ejemplo, si la computadora ha 10111100
almacenado en un byte particular de RAM, ¿cómo sabe la computadora interpretar este byte como un entero, un carácter ASCII u otra cosa? ¿Los datos de tipo se almacenan en un byte adyacente? (No creo que este sea el caso, ya que resultaría en usar el doble de espacio para un byte).
Sospecho que tal vez una computadora ni siquiera sabe el tipo de datos, que solo el programa que lo usa sabe. Supongo que debido a que la RAM es R AM y, por lo tanto, no se lee secuencialmente, un programa en particular solo le dice a la CPU que busque la información de una dirección específica y el programa define cómo tratarla. Esto parece encajar con cosas de programación, como la necesidad de conversión de texto.
¿Estoy en el camino correcto?
Respuestas:
Tu sospecha es correcta. La CPU no se preocupa por la semántica de sus datos. A veces, sin embargo, hace la diferencia. Por ejemplo, algunas operaciones aritméticas producen resultados diferentes cuando los argumentos están semánticamente firmados o sin firmar. En ese caso, debe decirle a la CPU qué interpretación pretendía.
Depende del programador dar sentido a sus datos. La CPU solo obedece las órdenes, felizmente inconsciente de su significado u objetivos.
fuente
mov al, 42
es un poco de alto nivel, es obvio que solo hay una posible instrucción que esto podría llamar, pero todavía está algo abstraído. Sin embargo, el usomov.8 al, 42
explícito hace que esto sea dolorosamente obvio :)Como otros ya han respondido, las CPU comunes de hoy no saben qué contiene una posición de memoria determinada; El software decide.
Sin embargo, hay otras posibilidades. Lisp Machines, por ejemplo, utilizó una arquitectura etiquetada que almacenaba el tipo de cada posición de memoria; de esa manera, el hardware en sí podría hacer parte del trabajo de los lenguajes de alto nivel.
E incluso ahora, supongo que podría considerar el bit NX en Intel, AMD, ARM y otras arquitecturas para seguir el mismo principio: distinguir a nivel de hardware si una zona de memoria dada contiene datos o instrucciones.
Además, solo para completar, en las arquitecturas de Harvard (como algunos microcontroladores) los datos y las instrucciones están físicamente separados, por lo que la CPU tiene una idea de lo que está leyendo.
En esta pregunta de Quora hay algunos comentarios sobre cómo funciona la memoria etiquetada, sus implicaciones de rendimiento y desaparición, y más.
fuente
Sí. El programa solo obtiene un byte de la memoria y puede interpretarlo como quiera.
fuente
No hay anotaciones de tipo.
RAM almacena datos puros, y luego el programa define qué hacer.
Con los registros de la CPU es un poco más difícil, si tiene registros de un tipo dado (como FPU), usted dice lo que hay dentro.
Las operaciones en registros de coma flotante utilizan explícitamente datos escritos. Usted o su compilador dicen qué y cuándo deben colocarse allí, para que no tengan tanta libertad.
La computadora no hace suposiciones sobre los datos subyacentes en la RAM, y en los registros con una excepción: los registros escritos en la CPU son de tipo conocido, optimizados para manejarlos. Esto es solo para mostrar que hay lugares donde los datos deben ser del tipo esperado, pero nada le impide lanzar cadenas a flotantes y multiplicarlos.
En los lenguajes de programación, se especifica el tipo, o en los idiomas de nivel superior, los datos son generales y el compilador / intérprete / VM codifica lo que hay dentro con sobrecarga.
Por ejemplo, en C, su tipo de puntero le dice qué hacer con los datos, cómo acceder a ellos.
Por supuesto, puede leer cadenas (caracteres) y tratarlas como valores de punto flotante, enteros y mezclarlos.
fuente
A la CPU no le importa, ejecuta el código de ensamblaje, que simplemente mueve los datos, los cambia, los agrega o los multiplica ...
Los tipos de datos son un concepto de lenguaje de nivel superior: en C o C ++ debe especificar los tipos para cada pieza de datos que manipula; el compilador C / C ++ se encarga de transformar estos datos en los comandos correctos para que los procese la CPU (los compiladores escriben el código de ensamblaje)
En algunos lenguajes de nivel aún más alto, se pueden inferir Tipos: en Python o Javascript, por ejemplo, uno no tiene que especificar tipos de datos, sin embargo, los datos tienen un tipo y no puede agregar una cadena con un entero, pero puede agregar un flotante con un número entero: el 'compilador' (que en el caso de Javascript es un compilador JIT (Just in Time). A menudo se llama a JavaScript un lenguaje 'interpretado' porque históricamente los navegadores interpretaban el código Javascript, pero hoy en día los motores Javascript son compiladores.
El código siempre se compila en código de máquina, pero obviamente el formato del código de máquina depende de la máquina a la que se dirige (el código x86 de 64 bits no funcionará en una máquina x86 de 32 bits o un procesador ARM, por ejemplo)
Entonces, en realidad, hay muchas capas involucradas en la ejecución de código interpretado.
Java y C # son otros interesantes, ya que el código Java o C # está técnicamente 'compilado' en un binario Java (código de bytes), pero ese código en sí es interpretado por Java Runtime, que es específico del hardware subyacente (uno necesita instalar JRE dirigido a la máquina correcta para ejecutar binarios Java (Jars)
fuente
Los tipos de datos no son una característica de hardware. La CPU conoce un par (bueno, mucho) de comandos diferentes. Esos se llaman el conjunto de instrucciones de una CPU.
Uno de los más conocidos es el conjunto de instrucciones x86 . Si busca "multiplicar" en esta página, obtendrá 50 resultados.
MULPD
yMULSD
para la multiplicación de dobles,FIMUL
para la multiplicación de enteros, ...Esos comandos funcionan en registros. Los registros son ranuras de memoria que pueden contener un número fijo de bits (a menudo 32 o 64, dependiendo de la arquitectura que utilice su CPU), sin importar lo que representen estos bits. Por lo tanto, la instrucción de la CPU interpreta los valores de los registros de una manera diferente, pero los valores en sí mismos no tienen tipos.
Stuart Williams dio un ejemplo en PyCon 2017 :
fuente
Exactamente. Pero la RAM no se lee "secuencialmente" y significa Memoria de acceso aleatorio, que es exactamente lo contrario.
Además de saber lo que un byte es , que ni siquiera sabe si es un byte , o un fragmento de un artículo más grande como un número de coma flotante.
Me gustaría agregar a otras respuestas dando algunos ejemplos específicos.
Considere
01000001
. El programa podría copiarlo de un lugar a otro como parte de un gran paquete de datos sin tener en cuenta su significado. Pero copiar eso a la dirección utilizada por el búfer de video en modo texto hará que la letra seA
muestre en alguna posición en la pantalla. La misma acción exacta cuando la tarjeta está en un modo de gráficos CGA mostrará un píxel rojo y un píxel azul.En un registro, podría ser el número 65 como un entero. Hacer aritmética para establecer el bit de 32 podría significar cualquier cosa sin contexto, pero podría específicamente cambiar una letra a minúscula.
La CPU 8086 (todavía) tiene instrucciones especiales llamadas DAA ※ que se usan cuando el registro contiene 2 dígitos decimales, por lo que si acaba de usar esa instrucción la está interpretando como dos dígitos
41
.Los programas se bloquean porque se lee una palabra de memoria pensando que es un puntero cuando se almacena algo allí.
Usando un depurador, inspeccionando la memoria, se usa un mapa para guiar la interpretación para su visualización. Sin esta información de símbolo, un depurador de bajo nivel le permite especificar: mostrar esta dirección como palabras de 16 bits, mostrar esta dirección como punto flotante largo, como cadenas ... lo que sea. Observar un volcado de paquetes de red o un formato de archivo desconocido, resolverlo es un desafío.
Esa es una fuente importante de poder y flexibilidad en la arquitectura moderna de la computadora: una celda de memoria puede significar cualquier cosa , datos o instrucción, implícita solo en lo que "significa" para el programa por lo que hace con el valor y cómo afecta las operaciones posteriores. el significado es más profundo que el ancho entero: ¿son estos caracteres ... caracteres en ascii o ebcdic? ¿Formando palabras en inglés o códigos de producto SQU? ¿La dirección para enviar o la dirección de devolución? La interpretación más bajo nivel (bits lógicos; número entero similar, con o sin signo; flotador; BCD; puntero) es contextual a nivel de instrucción-set, pero se ve que es todo el contexto en algún nivel: el dela dirección es lo que es debido a la ubicación que está impresa en el sobre. Es contextual a las reglas del cartero, no de la CPU. El contexto es un gran continuo, con bits en un extremo.
※ Nota al pie: La instrucción DAA está codificada como un byte
00100111
. De modo que ese byte es la instrucción mencionada anteriormente si se lee en el flujo de instrucciones, y los dígitos27
si se interpretan como dígitos bcd, y 0x27 = 39 como un entero, que es el número 9 en ASCII, y parte de la tabla de interrupción (mitad de INT 13 Dirección de 2 bytes, utilizada para las rutinas de servicio del BIOS).fuente
La única forma en que la computadora sabe que una ubicación de memoria es una instrucción es que un registro de propósito especial llamado puntero de instrucción los señala en un punto u otro. Si el puntero de instrucción apunta a una palabra de memoria, se carga como una instrucción. Aparte de eso, la computadora no tiene forma de saber la diferencia entre los programas y otros tipos de datos.
fuente