1

Я знаю, что после компиляции программного обеспечения или приложения его код преобразуется в машинный язык.

Содержит ли скомпилированное программное обеспечение двоичные 0 и 1?

Что происходит после компиляции программного обеспечения? Код преобразуется в двоичные 0 и 1? Что на самом деле происходит с его исходным кодом? Как такое огромное количество 0 и 1 хранится в компьютере?

4 ответа4

7

Да. Каждая часть информации на вашем компьютере состоит из битов (на ПК это обычно 8 бит на байт, а некоторые системы определяют байты как имеющие разное количество бит). Хотя технически исходный код хранится в двоичном виде, можно использовать различные подходы и методы для определения его как «текста».

Двоичный код - это обозначение, используемое для описания представления данных в формате base-2 (1 и 0). Этот документ объясняет эту нотацию очень подробно и, вероятно, будет вам интересен:

  Бинарный код
  http://en.wikipedia.org/wiki/Binary_code

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

Язык высокого уровня, такой как C, Pascal, Perl и т.д., Может быть скомпилирован в двоичный код, который затем запускается непосредственно процессором, и этот двоичный код чаще всего называют «машинным языком».

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

Когда интерпретируемый код запускается (например, с помощью скрипта), он компилируется интерпретатором на лету, когда встречается каждая строка или раздел, и в результате имеет тенденцию работать намного медленнее, чем двоичный код. BASIC (такой как GW-BASIC из дней DOS в 1980-х и начале 1990-х), хотя и не известен как язык сценариев, также интерпретировался (включая циклы - кэширования не было, каждая строка постоянно переинтерпретировалась).

1

Все на компьютере представляет собой набор байтов. Поскольку байты представляют собой набор (обычно 8) единиц и нулей, на самом деле все в компьютере - это единицы и нули.

Программа - это поток инструкций.

ЦП работает, выбирая байты из ОЗУ и выполняя действия, основанные на значении этого байта. Поток таких байтов образует программу. Байты в этом контексте называются кодами операций и представляют элементарные операции.

Компиляция - это многоэтапный процесс, который по существу "конвертирует" или "переводит" текст исходного кода в поток кодов операций. Ничего не происходит с оригинальным исходным кодом.

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

Программы редко выполняются от начала до конца. Обычно решения (т.е. условные заявления) сделаны на основе данных , собранных в рамках программы , и программа может пропустить (ака прыгать или ветви) к различным разделам себя. В качестве альтернативы разделы программ могут быть записаны в виде подпрограмм или функций и могут использоваться повторно или вызываться по всей программе. Из-за этого большинству компиляторов приходится делать два или более проходов по исходному коду, чтобы выяснить, где заканчиваются все "скачки". Это называется связыванием.

Огромное количество нулей и единиц может быть сохранено, главным образом, благодаря достижениям в технологии производства чипов и тому факту, что ЦП может получить доступ к объему оперативной памяти, равному 2 от количества имеющихся у него адресных линий . 32-разрядный процессор обычно имеет как минимум 32 адресные строки, так что это 2 ^ 32 или 4 Гбайт оперативной памяти. Память не всегда была такой дешевой или обильной. В рекламе компьютеров в конце 70-х - начале 80-х годов указывалось, что объем оперативной памяти составляет 4 000 и более долларов за 4 Кбайт, и даже дороже, чем раньше.

1

Как и в других ответах, да, компьютеры хранят и обрабатывают данные и инструкции BINARY, поэтому они или, что лучше, их основные элементы (транзисторы и т.д.) Вычисляются с двумя состояниями: Вкл / Выкл, Низкий / Высокий или 0 и 1.

Но есть (или были) другие методы! Существуют аналоговые компьютеры, в отличие от цифровых компьютеров, где цифровые означают, что вы можете указать ДИСКРЕТ и конкретные значения (цифра <-> палец). В аналоговых компьютерах вы не можете, нет значений определенного характера, все что-то промежуточное (как в целых числах, так и в действительных числах). Но нет "программы", которая компилируется в машинный код. Существуют механические / электронные элементы, которые определяют "программу"

Более интересно: есть ЦИФРОВЫЕ компьютеры, которые не работают в двоичном формате, но ТЕРНАРНЫЕ:

http://en.wikipedia.org/wiki/Setun

http://en.wikipedia.org/wiki/Ternary_computer

В этих компьютерах есть ТРИ состояния, -1/0/1. И есть даже программы, которые компилируются в машинный код. Итак, вывод: возможно. Скомпилированное программное обеспечение также может содержать три цифровых идентификатора, -1, 0 и 1;)

0

Хотя ответ «да» является правильным, ответ «нет» является более правильным.

Информация хранится (как уже было сказано) в электрических зарядов: on и off или , может быть positive и negative или high и low или low и high а в некоторых системах используется ток вместо заряда. Но в итоге есть два электрических состояния.

Чтобы упростить задачу, люди абстрагировали это до 0 и 1, поэтому им не нужно было знать, как аппаратное обеспечение это делало, а код был более переносимым.

Позже добавилось больше слоев абстракции: ассемблер, коды символов (ASCII и т.д.), Затем…

так

if (a==b)
{
    …
}

может стать

ld r1 a
ld r0 b
cmp r1,r0
br.z %endif1
…
%endif1

Теперь вы можете услышать, что cmp r1,r2 преобразуется в 0110110111001010 , но это не совсем правильно. Потому что 0110110111001010 - это последовательность из 16 символов (по крайней мере, 16 байтов без сжатия), которая представляет 2 байта данных. Но так ли это говорить? Ну, только то, что я говорю, что у меня были спагетти на ужин, неправильно. У меня не было последовательности символов s p a g h e t t i на обед. Я не могу показать вам, что у меня было. Я могу показать картинку, но я не ел картинку. Помните, что 0 с и 1 с - просто представление того, что действительно происходит. И когда я говорю, что вижу 1 луну в небе, эта 1 представляет что-то совершенно другое. И когда я говорю, остерегайтесь того, что символы 1 и l и символы 0 и O могут быть перепутаны, эти 1 s и 0 s снова - другое дело.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .