awesome-everything EN
↑ Обратно к восхождению

Базовый CS с нуля

От машинного кода к языку: чтение кода и отображений

Суть Читай сниппеты assembly и высокоуровневого кода, прослеживай отображение исходник → machine code и отличай compilation от interpretation и JIT по тому, что и когда производит каждый.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min

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

Цель

Потренируй чтение отображения между слоями: assembly в machine code (один-к-одному), высокоуровневый оператор во много инструкций и разницу, которую вносят compile, interpret и JIT в то, что и когда производится.

Сниппет 1 — assembly в machine code

        LOAD  R0, 200    ; опкод 00, R0=0, операнд 200
        LOAD  R1, 201    ; опкод 00, R1=1, операнд 201
        ADD   R0, R1     ; опкод 10
        STORE 202, R0    ; опкод 01, операнд 202
Викторина

На игрушечном CPU каждая инструкция занимает 2 байта. Сколько машинных инструкций и сколько байт assembler выпустит для этих четырёх строк и почему?

Сниппет 2 — один высокоуровневый оператор

const total = price * quantity + shipping;
Викторина

Три переменные уже в памяти. Примерно во сколько машинных инструкций превращается эта одна строка TypeScript и кто решает, в какие?

Сниппет 3 — три способа запустить одну программу

A)  gcc add.c -o add   &&   ./add          # создаёт нативный бинарник, затем запускает
B)  python3 add.py                          # interpreter читает и исполняет исходник
C)  node add.js                             # сперва интерпретация, затем JIT горячих функций
Викторина

Какое утверждение верно различает A, B и C по тому, что производится и когда?

Сниппет 4 — bytecode посередине

javac App.java     ->  App.class   (bytecode, не нативный machine code)
java App           ->  JVM загружает App.class и исполняет bytecode
Викторина

Что такое App.class и зачем доставлять bytecode вместо текста исходника или нативного бинарника?

Итог

Чтение слоёв сводится к двум вопросам. Сколько машинных инструкций? Assembly — один-к-одному; высокоуровневый оператор — многие-к-одному, и инструкции выбирает compiler. Когда происходит трансляция и что производится? Compiler выпускает нативный бинарник заранее; чистый interpreter не выпускает ничего для твоей программы и транслирует каждый оператор во время работы; JIT сперва интерпретирует и компилирует горячие функции в нативный код на лету; а bytecode — переносимый промежуточный слой, который VM интерпретирует или JIT-компилирует. Сопоставь сниппет с механизмом — и остальное следует само.

Продолжить восхождение ↑От машинного кода к языку: проследи программу вниз по лестнице
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.