От машинного кода к языкам программирования

Почему программы не пишут в машинном коде, что такое язык высокого уровня и чем компилятор отличается от интерпретатора. Смотрим, в какие команды учебного процессора М-8 превращается строка c = a + b.

Содержание

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

Чем неудобен машинный код

В предыдущих уроках мы писали программы для учебного процессора М-8 прямо его командами. Так можно, но у этого способа три больших недостатка.

Длинно. Чтобы умножить 4 на 3, понадобилось девять команд и четыре ячейки с данными. А мысль у человека была одна и короткая: «перемножить два числа».

Легко ошибиться. В байте 2D, команде ADD 13, достаточно изменить один бит, чтобы получилось 3D — SUB 13. Программа запустится, отработает и выдаст неверный ответ, ни о чём не предупредив. А если вставить в середину программы новую команду, все следующие сдвинутся на одну ячейку, и адреса в каждом JUMP и JZ придётся пересчитывать вручную.

Привязано к процессору. Программа для М-8 бесполезна для любого другого процессора. Понадобилось запустить её на другой машине — пишите заново.

Язык высокого уровня

Выход напрашивается сам: пусть человек пишет так, как ему удобно думать, а в команды это переведёт программа. Вот запись, понятная без объяснений:

TXT
c = a + b

Здесь a, b и c — переменные: имена, за которыми стоят ячейки памяти. Программист не выбирает адреса и не вспоминает коды операций. Язык, на котором можно писать так, называют языком высокого уровня: он далёк от устройства процессора и близок к человеку. Язык ассемблера, наоборот, низкого уровня: каждая его строка — одна команда процессора.

Посмотрим, во что эта строка превращается для М-8. Сначала переводчик раздаёт переменным ячейки: пусть a получит адрес 13, b — 14, c — 15. Затем он подбирает команды.

TXT
строка программы     команды М-8     машинный код
c = a + b            LOAD 13         1D
                     ADD 14          2E
                     STORE 15        4F

Одна строка — три команды. Так же переводятся и конструкции посложнее. «Если» и «пока» превращаются в сочетания JZ и JUMP из урока Переходы, условия и циклы, а запись c = a * b развернулась бы для М-8 в целый цикл со сложением.

Строка c = a + b попадает в компилятор, который отводит переменным a, b и c ячейки 13, 14 и 15. На выходе машинный код: LOAD 13, ADD 14, STORE 15, то есть байты 1D, 2E, 4F, которые выполняет процессор М-8
Рисунок 1 — Путь программы: исходный текст, компилятор, машинный код, процессор

Компилятор: перевод целиком и заранее

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

Представьте, что Вам подарили настольную игру с правилами на английском. Можно один раз перевести правила целиком и распечатать. Потом Вы играете по распечатке — быстро и без словаря. Это компиляция.

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

Так обычно работают с языком C++. Если захотите попробовать сами, на Marcus есть бесплатный учебник по C++.

Интерпретатор: исполнение по шагам

Интерпретатор не создаёт файла с машинным кодом. Он читает программу по частям и сразу выполняет прочитанное: взял строку, разобрал, исполнил, перешёл к следующей.

В примере с настольной игрой это друг, который знает английский. Он сидит рядом и перед каждым ходом читает нужное правило вслух по-русски. Распечатки ждать не надо, играть можно сразу. Зато без друга игра не пойдёт, и каждая партия тянется дольше.

Так обычно выполняют программы на Python. Плюсы и минусы здесь зеркальные: программу можно запустить сразу, и один и тот же текст работает на любом компьютере, где установлен интерпретатор. Но выполняется она медленнее, и интерпретатор нужен при каждом запуске.

Что сравниваемКомпиляторИнтерпретатор
Когда переводитзаранее, всю программуво время работы, по частям
Что нужно для запускафайл с машинным кодомисходный текст и интерпретатор
Скорость работы программывышениже
Пример языкаC++Python

Путь программы

Соберём всё вместе. Вот что происходит с программой на компилируемом языке.

  1. Программист пишет исходный текст — обычный текстовый файл.
  2. Компилятор проверяет текст. Если в нём есть ошибки записи, он сообщает о них и ничего не переводит.
  3. Компилятор переводит текст в машинный код и сохраняет его в файл.
  4. При запуске машинный код загружается в память, а в счётчик команд записывается адрес первой команды.
  5. Процессор начинает свой обычный цикл: выборка, расшифровка, исполнение.

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

Немного истории

Первые программисты писали в машинном коде, затем на ассемблере. В начале 1950-х годов команда Грейс Хоппер выпустила программу A-0, которую считают первым компилятором. Умела она ещё немногое.

Перелом наступил с языком Фортран. Его создала в 1954–1957 годах группа Джона Бэкуса в компании IBM. Название — сокращение от английского formula translator, «переводчик формул». Фортран называют первым языком высокого уровня, который получил практическое применение. На нём пишут и сейчас — главным образом научные и инженерные расчёты.

Частые вопросы

Процессор понимает Python или C++?

Нет. Процессор исполняет только свой машинный код. Программа на любом языке высокого уровня доходит до него уже в переводе.

Компилятор — тоже программа. А кто перевёл его?

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

Зачем знать про машинный код, если есть удобные языки?

Чтобы понимать, что стоит за строкой программы: почему число может переполниться, почему цикл иногда не заканчивается, почему приложение для телефона не запускается на ноутбуке.

Коротко

  • Машинный код длинный, в нём легко ошибиться, и он привязан к одному типу процессора.
  • В языке высокого уровня программист пишет формулы и слова, а адреса и коды команд подбирает программа-переводчик.
  • Компилятор переводит всю программу в машинный код заранее; готовый файл работает быстро, но только на своём типе процессора.
  • Интерпретатор читает программу и выполняет её по шагам; он нужен при каждом запуске.
  • На каком бы языке ни писали программу, процессор в итоге выполняет свои команды в цикле выборки и исполнения.

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

Использованная литература

  1. Компилятор — Википедия [Электронный ресурс]. — URL: https://ru.wikipedia.org/wiki/Компилятор (дата обращения: 09.10.2026).
  2. Интерпретатор — Википедия [Электронный ресурс]. — URL: https://ru.wikipedia.org/wiki/Интерпретатор (дата обращения: 09.10.2026).
  3. Фортран — Википедия [Электронный ресурс]. — URL: https://ru.wikipedia.org/wiki/Фортран (дата обращения: 09.10.2026).
  4. Грейс Хоппер — Википедия [Электронный ресурс]. — URL: https://ru.wikipedia.org/wiki/Хоппер,_Грейс (дата обращения: 09.10.2026).