Разница между машинным языком, двоичным кодом и двоичным файлом
Я изучаю программирование и во многих источниках вижу понятия "машинный язык", "двоичный код" и "двоичный файл". Разница между этими тремя неясна для меня, потому что, согласно моему пониманию, машинный язык означает необработанный язык, который может понять компьютер, то есть последовательности нулей и единиц.
Теперь, если машинный язык является последовательностью 0 и 1, а двоичный код также является последовательностью 0 и 1, то машинный язык = двоичный код?
Как насчет двоичного файла? Что на самом деле представляет собой двоичный файл? Для меня слово "двоичный файл" означает файл, который состоит из двоичного кода. Так, например, если мой файл был:
010010101010010
010010100110100
010101100111010
010101010101011
010101010100101
010101010010111
Это будет бинарный файл? Если я гуглю бинарный файл и вижу Википедию, я вижу этот пример изображения бинарного файла, который меня смущает (он не в бинарном виде?....)
Где моя путаница происходит? Я смешиваю кодировку файлов здесь или как? Если бы я попросил одного ПОКАЗАТЬ мне, что такое машинный язык, двоичный код и двоичный файл, что бы они были? =) Я думаю, что различие слишком абстрактно для меня.
Спасибо за любую помощь! знак равно
ОБНОВЛЕНИЕ:
Например, в Python в руководстве по вводу / выводу файла есть одна фраза, которую я не понимаю: открывает файл для чтения только в двоичном формате. Что означает чтение файла в двоичном формате?
4 ответа
Машинный код и двоичный код одинаковы - система счисления с основанием 2 - 1 или 0. Но машинный код также может быть выражен в шестнадцатеричном (шестнадцатеричном) формате - система счисления с основанием 16. Бинарная система и шестнадцатеричный код очень взаимосвязаны, его легко преобразовать из двоичного в шестнадцатеричный и преобразовать обратно из шестнадцатеричного в двоичный. А поскольку hex более читабелен и полезен, чем двоичный, его часто используют и показывают. Например, на картинке выше в вашем вопросе - используются шестнадцатеричные числа!
Допустим, у вас есть двоичная последовательность 1001111000001010 - она может быть легко преобразована в шестнадцатеричное с помощью группировки в блоки - каждый блок состоит из четырех битов.
1001 1110 0000 1010 => 9 14 0 10 which in hex becomes: 9E0A.
Можно согласиться с тем, что 9E0A гораздо более читабелен, чем двоичный файл, а шестнадцатеричное - это то, что вы видите на изображении.
Я искренне удивлен, что не вижу информации, которую искал, оглядываясь назад, хотя, я думаю, название этой темы не совсем соответствует вопросу, который задавал ОП.
Все вы, ребята, говорите: "Машинный код - это куча цифр".
Конечно, "КОД" - это набор цифр, но люди задаются вопросом (я полагаю), "что на самом деле происходит физически?"
Я довольно новичок, когда дело доходит до программирования, но я достаточно понимаю, чтобы чувствовать себя уверенно, "грубо" отвечая на этот вопрос.
Машинный код, по сути, не является числами или значениями. Машинный код - это группа входов напряжения, которые открыты или закрыты, и в зависимости от того, к чему они подключены, определенный индикатор будет мигать в определенное время и т. Д.
Я предполагаю, что "машинный код" определяет путь и время для конкретных электрических сигналов, которые будут проходить, чтобы достичь их общего назначения.
Таким образом, для 010101 3 выхода напряжения закрыты (0), 3 открыты (1)
Я знаю, что близок к правильному ответу здесь, но я также знаю, что он гораздо более сложный - потому что я могу представить себе то, чего не знаю.
010101 будет простой инструкцией для простой схемы, но я не могу понять, как сложный компьютер обрабатывает всю информацию.
Итак, я думаю, давайте разберемся?
x-Bit-процессоры сообщают, сколько бит процессор может обработать одновременно.
Бит равен 1 или 0, "Вкл" или "Выкл", "Открыт" или "Закрыт"
поэтому 32-битные процессоры обрабатывают "10101010 10101010 10101010 10101010" - это много битов одновременно.
Процессор - это "интегральная схема", похожая на компактную печатную плату, содержащую резисторы / конденсаторы / транзисторы и некоторую память. Я не уверен, есть ли у процессоров резисторы, но я знаю, что вы обычно найдете тонну их вокруг фактического процессора на плате.
В любом случае, транзистор является переключателем, поэтому, если он получает 1, он посылает ток в одном направлении, или, если он получает 0, он посылает ток в другом направлении... (или что-то в этом роде)
Итак, я представляю, что по мере того, как идет машинный код... сегмент кода, который получает процессор, изменяет каналы напряжения таким образом, что посылает сигнал в другую часть компьютера (как вы думаете, почему у процессоров так много выводов?), вероятно, еще одна интегральная схема, более специализированная для конкретной задачи. Затем эта интегральная схема получает порцию кода, скажем, от 2 до 4 бит 01 или 1100 или что-то еще, что дополнительно определяет, где будет конечный пункт назначения сигнала, который может быть непосредственно назад к процессору или, возможно, к некоторому выходу устройство.
Машинный код - очень эффективный способ взять схему и подключить ее к лампочке, а затем вынуть эту лампочку из схемы и переключить схему на другую лампочку.
Память в компьютере крайне необходима, потому что в противном случае, чтобы заставить компьютер что-либо делать, вам нужно было бы все печатать (в машинном коде). Вместо этого все 1 и 0 хранятся в каком-либо запоминающем устройстве, либо вращающемся жестком диске с магнитной головкой, который "читает" 1 или 0 в зависимости от заряда диска, либо устройстве флэш-памяти, которое использует серию транзисторы, где отправка напряжения через 1 и 0 (я не совсем понимаю, как работает флэш-память)
К счастью, кто-то нашел время, чтобы придумать другую базовую систему счисления для программирования (шестнадцатеричное) и способ скомпилировать эти числа (перевести их) обратно в двоичный код. И тогда все программы разветвляются оттуда.
Каждая клавиша на клавиатуре создает определенный сигнал в двоичном формате, который переводится в набор переключателей, включаемых или выключаемых с использованием определенных напряжений, так что ток может проходить через определенные отдельные пиксели на экране, которые создают "1" или "0". "или"F", или все символы этого поста.
Поэтому мне интересно, как программа "программирует" или "заставляет" компьютер "делать" что-то... Скорее, как компилятор компилирует программу с кодом, отличным от двоичного? Сейчас трудно думать, потому что я очень устал (поэтому я не буду пытаться), но также потому, что ВСЕ, что вы делаете на компьютере, происходит из-за какой-то программы. В диспетчере задач активно работают программы (процессы). Благодаря этому экран вашего компьютера выглядит так, как вы привыкли, а также позволяет манипулировать экраном так, как если бы он говорил, что изображения на экране были реальными объектами. (Это не так, это просто картинки, даже курсор мыши) (Хорошо, я закончил. Достаточно редактировать и расширять мои мысли, пора спать)
Кроме того, на самом деле я не понимаю, как нули "читаются" компьютером. Кажется, что "0" не должно быть "отсутствием напряжения", скорее, это должен быть какой-то другой тип сигнала, где, возможно, что-то вроде 1 вольт = 1 и 0,5 вольт = 0. Некоторая различимая разница между токами в цепи это все равно пошлет сигнал, но может быть разница между открытием и закрытием определенной цепи.
Если я близок к праву по поводу какого-либо из этих серьезных подвигов компьютерным инженерам мира, то уровень сложности просто потрясающий. Я надеюсь когда-нибудь узнать все о технологиях. Пока я просто пытаюсь пройти через Arduino.
И наконец... что-то, о чем я спрашиваю... возможно ли программировать современные компьютеры без использования другого компьютера?
Машинный язык - это низкоуровневый язык программирования, который обычно состоит исключительно из цифр. Поскольку они являются просто числами, их можно просматривать в двоичном, восьмеричном, десятичном, шестнадцатеричном или любом другом виде. Dave4723 дал более подробное объяснение в своем ответе.
Двоичный код - это, в основном, любая информация, представленная последовательностью 1 и 0.
Бинарный файл - это любой нетекстовый файл; например .exe
, .png
, так далее.
Вы должны понять, как компьютер работает в его основных принципах, и это прояснит для вас... Поэтому я рекомендую читать такие вещи, как Neumann Architecture.
В основном на очень простом компьютере у вас есть только одна память, например, массив, в котором есть инструкции для вашего процессора, данные и все это двоичные числа.
Ваша программа запускается в определенном месте в вашей памяти и читает первый номер...
Итак, вот поворот: эти числа могут быть инструкциями или данными. Ваш процессор читает эти числа и интерпретирует их как инструкции
Пример: начальный адрес 0
в 0 - инструкция типа "прочитать значение с адреса 120 в ALU (Math-Unit)"
затем он обращается к 1
"прочитать значение с адреса 121 в АЛУ"
затем он переходит к адресу 2
"вычесть числа в ALU"
тогда он шагает к адресу 3
"если значение ALU меньше нуля, перейдите к адресу 10"
он не меньше нуля, поэтому он переходит к адресу 4
"перейти по адресу 20"
Вы видите, что это основной if(a
Вы можете написать эти инструкции в виде чисел, и они могут выполняться вашим процессором, но поскольку никто не хочет делать эту работу (это было тем, что они делали с перфокартами в 60-х годах), был изобретен ассемблер... который выглядит так:
сложить 10,11, 20 // загрузить var из адресов 10 и 11; запустить сложение и сохранить по адресу 20
В заключение:
Ассемблер (инструкции процессора) можно назвать двоичным, потому что он хранится в простых числах
Но все остальное тоже может быть двоичным файлом.
На самом деле, если у вас есть простой файл.exe, то это оба... Если у вас есть переменные, такие как a = 10 и b = 20, эти значения могут быть сохранены где-то между предложениями if и для циклов... Это зависит от компилятор, где он положил эти
Но если у вас сложная 3D-модель, ее можно сохранить в отдельном файле без исполняемого кода...
Надеюсь, это поможет немного прояснить ситуацию.