2012-04-24 1 views
2

Мне было интересно, что компьютеры хранят всю информацию в виде 1s и 0s/low и high voltage, yada yada ... но тогда, когда мы скомпилируем программу, она - или просто любые данные, хранящиеся на comp, - это бинарная форма ... тогда как компьютер различает 2 части данных, поскольку все, что он состоит, представляет собой поток 0s и 1s ... Чтобы сделать мой вопрос более понятным, давайте возьмем смехотворно простой код от C:Как компьютеры различают 2 части данных?

void main() { 
    int A = 0; 
    int* pA = &A; 
    char c = 'c'; 
    char* pC = &c; 
    return; 
} 

он ничего не делает - просто делает 4 переменных типов int, указатель на Int, char и указатель на Char ... Теперь они будут храниться где-то в форме 0s и 1s ... Итак, как знает ли компьютер, с какого бита запускается такая и такая переменная, и где она заканчивается? Для начала вы можете сказать, что компьютер имеет адрес, хорошо, предоставлен. Но как насчет конца? ... А как насчет сложных типов данных, таких как objects/structs?

И последнее, но не в последнюю очередь, как насчет функций/процедур?

ответ

4

Абзац, который вы сейчас читаете, представляет собой не что иное, как поток букв и знаков препинания. Откуда вы знаете, где начинается и заканчивается одно слово? Откуда вы знаете, что означают слова? Как этот поток текста передает полезную информацию?

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

Ответ, конечно, заключается в том, что существуют правила. Буквы не просто объединены случайным образом - они имеют определенную последовательность. Когда вы будете следовать правилам, которые вы и я оба знаем, вы можете различить слова, понять их индивидуальные значения и объединить их в мысли.

Это то же самое с двоичными данными. То, что отличает данные от случайных бит, - это существование правил, которые, если следовать, позволяют интерпретировать биты значимым образом. Теперь вы задали много вопросов, связанных с различными правилами. Попытка объяснить их все займет больше места, чем разумно в ответе, подобном этому (и больше времени, чем я готов посвятить этому начинанию). Но если вы возьмете книгу по компьютерной архитектуре, вы найдете полное обсуждение правил, как они работают, как они организованы и как они реализованы. Это действительно интересно!

Если вы не готовы к погружению в реальной компьютерной архитектуры еще одна отличная книга, которая даст вам много проницательность Гедель, Эшер, Бах: Вечная Золотой кос Дуглас Хофстадтером. Это толстая книга и плотная идея. Но это также хорошо написано и интересно, и вам не обязательно читать его с экрана на обложку, чтобы узнать много увлекательных вещей.

1

Скомпилированная программа будет состоять из машинных инструкций, которые получают доступ к данным в шаблонах, которые отражают типы высокого уровня. Большинство языков ассемблера имеют разные инструкции по загрузке и манипулированию данными разных размеров (загрузка байтов, слов, длин и т. Д.) Или типов (целые числа с подписью и без знака, поплавки и длинные и т. Д.). Поскольку компилятор имеет информацию о типе, доступную для него во время компиляции, он может генерировать инструкции по сборке, которые обрабатывают данные в памяти, которые являются всего лишь нулями и единицами, как имеющие соответствующую структуру, путем выдачи команд для работы с данными таким образом, с системой типа.

Для структур и функций существует множество возможных кодировок в зависимости от того, какой язык вы используете. Я преподавал курс компиляторов прошлым летом, и мы провели две лекции по функциональным и объектным макетам. slides for the first и second lectures доступны по предыдущим ссылкам.

Надеюсь, это поможет!

2

Это не так. Та же последовательность бит может быть интерпретирована как числа, строки, код, структуры, что угодно. Компьютер не знает, что такое куча бит.

Попробуйте это:

int main() { 
    int A = 0; 
    char* pC = (char*)&S; 
} 

Вы увидите, что это работает. Он берет целочисленную память и говорит, что я хочу рассматривать ее как массив символов. Компьютер с радостью согласится с этим. Его редко полезно, но это можно сделать.

Единственные вещи, которые отличаются для разных типов, - это то, как они обрабатываются. Поплавки обрабатываются иначе, чем целые, обрабатываются иначе, чем строки. Если вы посмотрите на низкоуровневую версию своей программы, вы обнаружите, что каждая операция включает в себя определенный тип данных. Разница заключается не в битах, а в том, как программа работает с битами.

3

Вы можете ответить на все эти вопросы (и многие более в отношении компьютеров), получая как можно ближе к металлу, насколько это возможно: То есть, узнать assembly.I предлагает прочитать книгу Art of Assembly (свободно доступен в Интернет), которая охватывает следующие темы слишком. Кроме того, читайте мой ответ на Assembly learning resources .Теперь, позвольте мне ответить на ваши вопросы кратко:

  • Вы правы в том, что компьютер видит только бесконечный поток операционной системы bits.The делает работу по созданию файловой системы . Один барабан можно рассматривать как очень простую файловую систему (со страницами или сегментами, являющимися файлами).Теперь это означает, что в ОС есть таблица где-то, где она отслеживает, где каждая программа хранит то, что такое данные, что такое код и т. Д.

  • Переменные на уровне фундамента не более, чем байты. Теперь , когда вы пишете заявление, такие как

    а = Ь + 1

компилятор фактически назначает произвольный адрес переменной и жестких кодов (т.е. записывает фактические постоянные например, 0xA3F0) этот адрес каждое утверждение, которое ссылается на него.

  • структуры данных хранятся во многих различных ways.However, когда речь идет о гр структур, все проще: они просто хранить переменные, что эта структура содержит один за другим, если мы будем игнорировать такие вещи, как обивка и такие . Именно поэтому длина структуры всегда известна.

  • Функции на самом деле являются местами в памяти, где хранится код. Чтобы «вызывать» функцию, аргументы загружаются в stack или любое другое глобальное пространство памяти, а затем скачок, то есть goto, на адрес функции . Когда функция выполнена, она переходит к адресу, который его назвал (адрес также хранится в стеке.)

  • Важно понимать, что компилятор выполняет всю тяжелую работу по переводу вашего кода в вышеупомянутых способах. Все функции, которые языки высокого уровня являются просто абстракциями, чтобы облегчить вашу работу. В конце концов, это всего лишь биты и байты, 0 и 1 с, 5 вольт и нуль вольт.

Более того, современные архитектуры не позволяют ОС делать все, что материал по itself.Much в домашнем хозяйстве происходит на аппаратном уровне тоже, например, управление памятью, маркировка, что адрес памяти служит то, что цели и т.д.

+0

Спасибо за этот небольшой подробный ответ ... но я боюсь, кажется, что ваша ссылка на «Art of Assembly», похоже, не работает ... в любом случае, еще раз спасибо! –

+0

@ParthThakkar Извините, я исправил его. Похоже, сервер упал, работал, когда я его разместил. – byrondrossos

0

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

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

нет никакой магии ему

2

Компьютер не знает, а компьютер не заботится. Все, что он делает, это следовать инструкциям. Одна из таких команд может сказать: «Возьмите 32 бита с этого адреса и еще 32 бита с этого адреса, объедините эти две 32-битные строки, используя метод, называемый добавлением дополнений двух», и сохраните результат в 32 битах на первом упомянутый адрес ". Каждая команда указывает:

  • адрес (адреса), из которого данные должны быть считаны и к которому данные должны быть записаны

  • количество битов для чтения или записи

  • операция, выполняемая на битах, считанных

Компьютер не заботится о том, что делает операция. Это просто, что компьютерный дизайнер был достаточно хорош, чтобы сделать операцию полезной для нас, людей.

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

Таким образом, вы почти ответили на свой вопрос:

Для начала вы можете сказать, что компьютер имеет адрес, ладно, предоставивший. Но как насчет конца?

Конец известен, если вы знаете начало и длину.

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

Процедуры и функции слишком сложны для объяснения здесь.

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

+0

Я бы поддержал это более одного раза. Значение этих 0s и 1s действительно дается людьми либо напрямую, либо в виде написанной ими программы. Компьютер ничего не знает, он просто выполняет материал, написанный людьми, принимая материал, который имеет смысл для людей и, возможно, дает результаты, которые имеют смысл для людей, а не для себя. Он не может знать и не рассуждать. Все знания и рассуждения совершаются людьми. –