← Назад к вопросам

Что такое машинный код?

2.0 Middle🔥 61 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Машинный код

Машинный код — это набор инструкций в двоичном формате (0 и 1), которые процессор может напрямую выполнять. Это самый низкоуровневый язык программирования, непосредственно интерпретируемый процессором (CPU).

Основной концепт

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

Двоичный машинный код: 10110000 01100001
Шестнадцатеричный:     B0 61
Операция:               MOV A, 0x61 (загрузить 0x61 в регистр A)

Иерархия языков программирования

Высокоуровневые языки (Python, Java, C#)
    ↓ компиляция/интерпретация
Низкоуровневый язык ассемблер (Assembly)
    ↓ ассемблирование
Машинный код (Machine Code)
    ↓ электрические сигналы
Процессор (CPU)

Пример: от Python к машинному коду

# Python код
a = 5
b = 3
c = a + b

Этот простой код проходит несколько этапов трансформации:

  1. Python интерпретатор парсит код
  2. Компилятор (gcc, clang) преобразует в ассемблер:
mov $0x5, %eax      ; Загрузить 5 в регистр EAX
mov $0x3, %ecx      ; Загрузить 3 в регистр ECX
add %ecx, %eax      ; Сложить EAX и ECX
mov %eax, -0x4(%rbp) ; Сохранить результат в память
  1. Ассемблер преобразует в машинный код:
b8 05 00 00 00      ; MOV EAX, 5
b9 03 00 00 00      ; MOV ECX, 3
01 c8               ; ADD EAX, ECX
89 45 fc            ; MOV [RBP-4], EAX

Архитектуры процессоров

Машинный код зависит от архитектуры процессора:

x86-64 (Intel/AMD)

; x86-64 машинный код
push %rbp           ; Сохранить старый базовый указатель
mov %rsp,%rbp       ; Установить новый базовый указатель
mov $0x0,%eax       ; Вернуть 0
pop %rbp            ; Восстановить
retq                ; Вернуться из функции

ARM (мобильные устройства)

; ARM машинный код
ldr r0, [sp]        ; Загрузить из стека
add r0, r1          ; Добавить
bx lr               ; Вернуться

MIPS

; MIPS машинный код
addi $v0, $zero, 5  ; $v0 = 5
add $v0, $v0, $v1   ; $v0 += $v1
jr $ra              ; Вернуться

Взаимодействие с машинным кодом из Python

Python разработчики редко работают напрямую с машинным кодом, но существуют способы взаимодействия:

1. ctypes — вызов C функций

import ctypes

# Загрузить скомпилированную C библиотеку
libc = ctypes.CDLL("libc.so.6")  # Linux

# Вызвать функцию из библиотеки
result = libc.abs(-42)
print(result)  # 42

2. Вызов нативного кода через subprocess

import subprocess

# Скомпилировать C программу
subprocess.run(["gcc", "-o", "program", "program.c"])

# Запустить скомпилированный машинный код
result = subprocess.run(["./program"], capture_output=True, text=True)
print(result.stdout)

3. NumPy использует машинный код

import numpy as np

# NumPy операции выполняются на скомпилированном машинном коде
arr = np.array([1, 2, 3, 4, 5])
result = np.sum(arr)  # Очень быстро, потому что это машинный код
print(result)  # 15

Почему машинный код имеет значение

Производительность: Машинный код выполняется напрямую процессором, без промежуточной трансформации:

# Медленно (Python)
def sum_slow(numbers):
    total = 0
    for n in numbers:
        total += n
    return total

# Быстро (NumPy → машинный код)
import numpy as np
result = np.sum(np.array([1, 2, 3, 4, 5]))

Разница может быть в 100-1000 раз.

Регистры и стек

Машинный код работает с регистрами (очень быстрая память):

; x86-64 регистры
RAX, RBX, RCX, RDX  ; Основные регистры
RSI, RDI            ; Индексные регистры
RBP, RSP            ; Базовый и стековый указатели

Каждый регистр может хранить 64-битное число.

Дизассемблирование

Можно преобразовать машинный код обратно в ассемблер:

# Linux — использовать objdump
objdump -d ./my_program

# Результат:
0000000000001050 <main>:
    1050:   55                      push   %rbp
    1051:   48 89 e5                mov    %rsp,%rbp
    1054:   b8 00 00 00 00          mov    $0x0,%eax
    1059:   5d                      pop    %rbp
    105a:   c3                      retq

Резюме

Машинный код — это физический язык процессора, представленный в двоичном формате. Python разработчики обычно не работают с ним напрямую, но понимание того, как Python код преобразуется в машинный код через ассемблер, критично для оптимизации производительности. NumPy, Cython и расширения на C часто используют машинный код для ускорения вычислений.

Что такое машинный код? | PrepBro