Как компьютер отслеживает, какой тип данных хранится в определенной ячейке памяти? - PullRequest
7 голосов
/ 27 марта 2011

Полагаю, это не совсем "программирование", но я обдумывал это некоторое время.Когда вы создаете переменную и присваиваете ей значение, компьютер выделяет определенное количество байтов для указанной переменной и сохраняет значение, но как он узнает, какой тип данных находится в этом адресе памяти, когда он возвращается, чтобы использовать его позже?

Ответы [ 3 ]

6 голосов
/ 27 марта 2011

Ответ зависит от того, интерпретируется или компилируется язык, на котором вы работаете, а также от различных других деталей.Для скомпилированного языка, такого как C, ответ заключается в том, что компилятор, в то время как он переводит ваш код в машинный код (или ассемблер), имеет внутреннюю структуру данных, сообщающую, что представляет собой каждая переменная - каков ее тип, где она хранится и, возможно,другая информация тоже для целей оптимизации.(Но к тому моменту, когда ваш код на самом деле выполняется, эта информация уже исчезла; необходимо скомпилировать код, но не запускать его.)

Для некоторых интерпретируемых языков ответ заключается в том, что интерпретатор имеетпохожая структура данных, которая ищется всякий раз, когда используется переменная.Для других интерпретатор интерпретирует все переменные одинаково, но к их значениям прикреплена информация о типах.

5 голосов
/ 27 марта 2011

Как правило, это не так. Ну, большинство динамических языков имеют что-то вроде typeof, поэтому обычно есть «заголовок объекта», в котором хранятся некоторые метаданные, включая тип (и другую информацию, например, refcount). Но вы все равно не можете определить начало объекта в случайном фрагменте памяти (в конце концов, это все 1 и 0), поэтому вам всегда нужен указатель на него ...

Традиционные статические / скомпилированные языки (обычно, конечно) не хранят такую ​​информацию. В конце концов, если компилятор знает, что x является int, он знает, сколько байтов ему нужно загрузить в регистры и какие коды операций использовать для добавления. Даже когда вы добавляете виртуальные функции, вам просто нужно скомпилировать таблицу указателей на функции (без дополнительных метаданных - obj->foo() переводится как «получить n-ую запись vtable и вызвать ее» вместо «кода вызова по этому адресу»).

3 голосов
/ 27 марта 2011

Компьютер не.Некоторые языки могут маркировать свои данные типами (в частности, динамические языки, где любая переменная может содержать любой тип данных);в других языках (например, C) вы объявляете переменные, и компилятор знает, когда он использует адресное пространство, связанное с этой переменной, для обработки значения как определенного типа.Самому компьютеру все равно, все, что он видит, это 8 бит на байт.

...