Я пытаюсь понять, как именно язык высокого уровня преобразуется в машинный код, а затем исполняется процессором.
Я понимаю, что код скомпилирован в машинный код, который является кодом низкого уровня, который может использовать процессор. Если у меня есть заявление о назначении, скажите:
x = x + 5;
y = x - 3;
Процессор выполняет каждую строку по одной за раз? Так что сначала он выполнит x = x + 5; инструкция, а затем следующая инструкция, которую ЦП выполнит, это y = x- 3; Я действительно пытаюсь понять процесс выполнения и как на самом деле код, который я пишу, исполняется процессором.
computer-science
cpu
Фрэнки
источник
источник
Ответы:
Строки кода не имеют ничего общего с тем, как процессор их выполняет. Я бы порекомендовал почитать на ассемблере, потому что это многому научит вас, как на самом деле работает аппаратное обеспечение. Вы также можете получить вывод ассемблера от многих компиляторов.
Этот код может скомпилироваться во что-то вроде (на языке ассемблера):
Однако, если компилятор знает, что переменная больше не используется, операция сохранения может не сработать.
Теперь, чтобы отладчик знал, какой машинный код соответствует строке исходного кода программы, компилятор добавляет аннотации, чтобы показать, какая строка соответствует месту в машинном коде.
источник
ADD Rx, Rx, $5
иSUB Ry, Rx, $3
(при условии, что переменные x и y были отображены в регистры). Вы описываете подход RISC загрузки / хранения.Это зависит.
В первые дни действительно простых машин, да, код выполнялся по одной строке за раз. По мере того, как машины становились больше, быстрее и сложнее, вы начали видеть способность выполнять несколько инструкций одновременно, а чтение и запись в память занимали намного больше времени, чем операции с регистрами.
Оптимизирующие компиляторы должны были принять это во внимание, и заданные вами строки могли бы выполняться «более или менее» параллельно, при этом одна часть процессора работала над вычислением y, тогда как другая часть сохраняла ранее вычисленное новое значение x (и вычисление y использовало это новое значение из регистра).
Control Data 6600 была первой из известных мне машин, которая делала подобные вещи. Целочисленное сложение заняло 300 нсек, обращение к памяти (чтение или запись) заняло 1000 нсек, умножение и деление заняли много дольше. До десяти инструкций могут выполняться параллельно в зависимости от того, какие функциональные блоки требуются. Компиляторы CDC 6600 FORTRAN были ОЧЕНЬ хороши в планировании всего этого.
источник
x
? Таким образом, он уже выполнил код и сохранил его в кеше.Нет, не существует однозначного сопоставления между строками кода / инструкциями на языках более высокого и более низкого уровня. На самом деле обе строки выше переведены в несколько команд машинного кода , как
Фактические детали этих инструкций различаются в зависимости от платформы.
Это основной взгляд на вещи. Однако для дальнейших вопросов затруднят, современные процессоры применяются методы как конвейеры выполнения , внеочередного исполнения и нескольких ядер , среди других. Это приводит к тому, что процессор выполняет несколько операций одновременно, например, конвейеры обрабатывают различные фазы последующих команд параллельно в одном и том же процессоре, в то время как несколько ядер могут обрабатывать независимые инструкции параллельно.
источник
Вы должны подробно изучить книгу, чтобы узнать больше о том, как она работает, возможно, также и о классе компилятора.
По сути, ваш вопрос сосредоточен на двух разных аспектах.
1) Как код переводится в машинный код?
2) Когда / как код вычисляется с использованием распараллеливания?
Ответ на 1) зависит от языка, который вы используете (хотя для вашего примера это тривиально, поэтому вывод будет таким же). То, как компилятор выполняет перевод в машинный код, является одной из сил языка. Кроме того, в вашем примере необходимо учесть несколько проблем: код должен загружать данные в память, сохранять их и т. Д.
Наконец, распараллеливание - это функция, которую вы можете использовать с точки зрения программирования, но в двух словах, некоторые процессоры могут пытаться думать, что некоторая часть кода может быть запущена одновременно, потому что они независимы. Очевидно, что в вашем случае это не так, поскольку вам нужно выполнять операторы последовательно, поэтому нет, он не будет выполняться одновременно.
источник