Как машинный код взаимодействует с процессором?
Давайте возьмем Python в качестве примера. Если я не ошибаюсь, когда вы программируете в нем, компьютер сначала "переводит" код на C. Затем снова с C на сборку. Сборка написана в машинном коде. (Это лишь расплывчатое представление, которое у меня есть по этому поводу, поэтому поправьте меня, если я ошибаюсь). Но что написано в машинном коде, или, точнее, как процессор обрабатывает свои инструкции, как он "узнает", что делать??
4 ответа
Если я не ошибаюсь, когда вы программируете в нем, компьютер сначала "переводит" код на C.
Нет, это не так. C ничего особенного, кроме того, что это самый распространенный язык программирования, используемый для системного программирования.
Интерпретатор Python переводит код Python в так называемый P-код, который выполняется виртуальной машиной. Эта виртуальная машина является реальным интерпретатором, который читает P-код, и каждый миг P-кода заставляет интерпретатор выполнять предопределенный путь кода. Это мало чем отличается от того, как собственный двоичный машинный код управляет процессором. Более современный подход заключается в переводе P-кода в машинный код.
Сам интерпретатор CPython написан на C и скомпилирован в собственный двоичный файл. По сути, нативный двоичный код - это просто длинный ряд чисел (кодов операций), где каждое число обозначает определенную операцию. Некоторые коды операций сообщают компьютеру, что определенное число чисел, следующих за ним, является не кодами операций, а параметрами.
Сам ЦП содержит так называемый декодер команд, который считывает собственное двоичное число по номеру, и для каждого считываемого кода операции он подает питание на схему ЦП, которая реализует этот конкретный код операции. есть коды операций, которые адресуют память, коды операций, которые загружают данные из памяти в регистры и так далее.
как процессор обрабатывает свои инструкции, как он "узнает", что делать?
Для каждого кода операции, который является просто двоичным шаблоном, в ЦП имеется собственная схема. Если шаблон кода операции соответствует "переключателю", который включает этот код операции, эта схема обрабатывает его.
Вот WikiBook об этом: http://en.wikibooks.org/wiki/Microprocessor_Design
Несколько лет назад какой-то парень создал целый работающий компьютер из простой логики функций и микросхем памяти, то есть без микроконтроллера или подобных устройств. Весь проект под названием "Big Mess o' Wires" был более или менее процессором, созданным с нуля. Единственная вещь, которую придумал бы, построить эту вещь из одиночных транзисторов (которые на самом деле были не такими уж сложными). Он также предоставляет симулятор, который позволяет вам увидеть, как процессор работает внутри, декодируя каждую инструкцию и выполняя ее: Big Mess o 'Wires Simulator
Машинный код не "связывается с процессором".
Скорее, процессор "знает, как оценивать" машинный код. В [широко распространенной] архитектуре фон Неймана этот машинный код (программу) можно рассматривать как индексируемый массив, в котором каждая ячейка содержит инструкцию машинного кода (или данные, но давайте пока проигнорируем это).
Процессор "смотрит" на текущую инструкцию (часто идентифицируемую ПК или программным счетчиком) и решает, что делать (это можно сделать напрямую с помощью транзисторов /"голого металла" или перевести на код даже более низкого уровня).): это называется циклом выборки-декодирования-выполнения.
Когда выполняются инструкции, возникают побочные эффекты, такие как установка флага управления, помещение значения в регистр или переход к другому индексу (изменение ПК) в программе и т. Д. См. Этот простой обзор процессора, который охватывает выше немного лучше.
Это оценка каждой инструкции - как она встречается - и взаимодействие побочных эффектов, которое приводит к работе традиционного процессора.
(Конечно, современные процессоры очень сложны и делают много хитрых вещей!)
Это называется микрокодом. Это код в ЦП, который читает инструкции машинного кода и переводит их в поток данных низкого уровня.
Когда процессор, например, сталкивается с add
В инструкции, микрокод описывает, как он должен получить эти два значения, передать их в АЛУ, чтобы выполнить расчет, и куда поместить результат.
Электричество. Схемы, память и логические элементы.
Кроме того, я считаю, что Python обычно интерпретируется, а не компилируется через C → assembly → machine code.