Например, если компьютер 10111100
хранится в одном конкретном байте ОЗУ, как компьютер узнает, что он интерпретирует этот байт как целое число, символ ASCII или что-то еще? Данные типа хранятся в соседнем байте? (Я не думаю, что это будет так, поскольку это приведет к использованию вдвое больше места для одного байта.)
Я подозреваю, что, возможно, компьютер даже не знает тип данных, что знает только программа, использующая его. Я предполагаю, что, поскольку ОЗУ является R AM и, следовательно, не читается последовательно, то конкретная программа просто говорит ЦП извлечь информацию с определенного адреса, и программа определяет, как ее обрабатывать. Казалось бы, это согласуется с такими вещами в программировании, как необходимость в типизировании.
Я на правильном пути?
источник
Ответы:
Ваше подозрение верно. Процессор не заботится о семантике ваших данных. Иногда, однако, это имеет значение. Например, некоторые арифметические операции дают разные результаты, когда аргументы семантически подписаны или не подписаны. В этом случае вам нужно указать процессору, какую интерпретацию вы намеревались.
Это зависит от программиста, чтобы понять ее данные. Процессор только подчиняется приказам, блаженно не подозревая об их значении или целях.
источник
mov al, 42
отчасти до высокого уровня - очевидно, есть только одна возможная инструкция, которую можно вызвать, но она все еще несколько абстрагирована. Тем не менее, использованиеmov.8 al, 42
явно делает это до боли очевидным :)Как уже отвечали другие, современные распространенные процессоры не знают, что содержит данная позиция памяти; программное обеспечение решает.
Однако есть и другие возможности. Например, в Lisp Machines использовалась архитектура с тегами, в которой сохранялся тип каждой позиции в памяти; таким образом, само оборудование может выполнять некоторые функции языков высокого уровня.
И даже сейчас, я думаю, вы могли бы считать, что бит NX в Intel, AMD, ARM и других архитектурах следует тому же принципу: различать на аппаратном уровне, содержит ли данная зона памяти данные или инструкции.
Кроме того, просто для полноты, в гарвардских архитектурах (например, в некоторых микроконтроллерах) данные и инструкции физически разделены, поэтому ЦП действительно имеет некоторое представление о том, что он читает.
В этом вопросе Quora есть некоторые комментарии о том, как работает помеченная память, ее влияние на производительность и ее гибель, и многое другое.
источник
Да. Программа просто получает байт из памяти и может интерпретировать его так, как хочет.
источник
Нет типовых аннотаций.
RAM хранит чистые данные, а затем программа определяет, что делать.
С ЦП регистры немного сложнее, если у вас есть регистры данного типа (например, FPU), вы говорите, что внутри.
Операции с регистрами с плавающей запятой явно используют типизированные данные. Вы или ваш компилятор говорите, что и когда следует поместить туда, чтобы у вас не было такой свободы.
Компьютер не делает никаких предположений относительно базовых данных в ОЗУ, и в регистрах с одним исключением - типизированные регистры в ЦП имеют известный тип, оптимизированный для работы с ними. Это только для того, чтобы показать, что есть места, где данные должны быть ожидаемого типа, но ничто не мешает вам преобразовывать строки в числа с плавающей точкой и умножать их.
В языках программирования вы указываете тип, или в языках более высокого уровня данные являются общими, а компилятор / интерпретатор / VM кодирует то, что находится внутри, с накладными расходами.
Например, в C ваш тип указателя говорит, что делать с данными, как получить к ним доступ.
Конечно, вы можете читать строки (символы), а затем обрабатывать их как значения с плавающей точкой, целые числа и смешивать их.
источник
Процессору все равно, он выполняет ассемблерный код, который просто перемещает данные, перемещает их, добавляет или умножает их ...
Типы данных являются языковой концепцией более высокого уровня: в C или C ++ вам необходимо указывать типы для каждого отдельного фрагмента данных, которым вы манипулируете; Компилятор C / C ++ заботится о том, чтобы преобразовать эти фрагменты данных в нужные команды для процессора (компиляторы пишут код сборки)
В некоторых языках даже более высокого уровня Типы могут быть выведены: в Python или Javascript, например, нет необходимости указывать типы данных, но у данных есть тип, и вы не можете добавить строку с целым числом, но вы можете добавить число с плавающей точкой с целым числом: «компилятор» (который в случае с Javascript является компилятором JIT (Just in Time). Javascript часто называют «интерпретируемым» языком, потому что исторически браузеры интерпретировали код Javascript, но в настоящее время механизмы Javascript являются компиляторами.
Код всегда заканчивается компиляцией в машинный код, но, очевидно, формат машинного кода зависит от машины, на которую вы ориентируетесь (64-битный код x86 не будет работать, например, на 32-битной машине x86 или процессоре ARM)
Таким образом, на самом деле существует много уровней, задействованных в выполнении интерпретированного кода.
Java и C # являются другими интересными, так как код Java или C # технически «компилируется» в двоичный файл Java (байт-код), но сам этот код затем интерпретируется средой выполнения Java, которая специфична для базового оборудования (необходимо установить JRE, предназначенная для правильной машины для запуска двоичных файлов Java (Jars)
источник
Типы данных не являются аппаратной функцией. Процессор знает пару (ну очень много) разных команд. Это называется набор команд процессора.
Одним из наиболее известных из них является набор инструкций x86 . Если вы ищете «умножить» на этой странице, вы получите 50 результатов.
MULPD
иMULSD
для умножения двойныхFIMUL
чисел , для целочисленного умножения, ...Эти команды работают с регистрами. Регистры - это слоты памяти, которые могут содержать фиксированное количество битов (часто 32 или 64, в зависимости от архитектуры вашего процессора), независимо от того, что представляют эти биты. Следовательно, инструкция CPU интерпретирует значения регистров по-другому, но сами значения не имеют типов.
Пример был приведен на PyCon 2017 Стюартом Уильямсом :
источник
В точку. Но ОЗУ не читается «последовательно», а означает « Оперативное запоминающее устройство», как раз наоборот.
Кроме того , зная , что байты это , вы даже не знаете , если это байты , или фрагмент большего элемента , как число с плавающей точкой.
Я хотел бы добавить к другим ответам, приведя некоторые конкретные примеры.
Посмотрим
01000001
. Программа может скопировать его из одного места в другое как часть большого пакета данных, не обращая внимания на его значение. Но копирование этого адреса по адресу, используемому видеобуфером в текстовом режиме, приведет к тому, что букваA
будет отображаться в некоторой позиции на экране. Точно такое же действие, когда карта находится в графическом режиме CGA, будет отображать красный и синий пиксели.В регистре это может быть число 65 как целое число. Выполнение арифметики для установки бита 32 может означать что-либо без контекста, но, в частности, может означать изменение буквы на нижний регистр.
CPU 8086 (все еще) имеет специальные инструкции под названием DAA ※, которые используются, когда регистр содержит 2 десятичных цифры, поэтому, если вы просто использовали эту инструкцию, вы интерпретируете ее как две цифры
41
.Программы аварийно завершают работу, потому что слово памяти читается, думая, что это указатель, когда что-то еще хранилось там
Используя отладчик, проверяющий память, карта используется для направления интерпретации для отображения. Без этой символьной информации низкоуровневый отладчик позволяет вам указать: показывать этот адрес как 16-битные слова, показывать этот адрес как длинную с плавающей точкой, как строки ... что угодно. Если посмотреть на дамп сетевого пакета или неизвестный формат файла, выяснить это будет непросто.
Это основной источник мощи и гибкости в современной компьютерной архитектуре: ячейка памяти может означать что угодно , данные или инструкцию, подразумеваемые только в том, что они «значат» для программы тем, что она делает со значением и как это влияет на последующие операции. значение глубже целой ширины: эти символы ... символы в ascii или ebcdic? Формировать слова на английском или SQU код продукта? Адрес для отправки или обратный адрес, с которого он пришел? Самый низкий уровень интерпретации (логические биты, целое число типа, знаком или без знака; поплавок; BCD; указатель) контекстная на уровне набора команд, но вы видите , что это все контекст на каком - то уровне: вадрес это то, что он из-за местоположения он напечатан на конверте. Это контекстуально правилам почтальона, а не процессору. Контекст представляет собой один большой континуум с битами на одном конце.
※ Сноска: инструкция DAA кодируется в виде байта
00100111
. Таким образом, этот байт является вышеупомянутой инструкцией, если она читается в потоке команд, и цифрами,27
если они интерпретируются как цифры bcd, и 0x27 = 39 как целое число, которое является цифрой 9 в ASCII, и частью таблицы прерываний (половина INT 13 2-байтовый адрес, используемый для процедур обслуживания BIOS).источник
Единственный способ, которым компьютер знает, что ячейка памяти - это инструкция, состоит в том, что регистр специального назначения, называемый указателем инструкций, указывает на них в той или иной точке. Если указатель инструкции указывает на слово памяти, он загружается как инструкция. Кроме этого, у компьютера нет возможности узнать разницу между программами и другими типами данных.
источник