Программный код (код программирования) — это запись программы: последовательность инструкций, по которой компьютер выполняет задачу. У одной и той же программы бывает несколько форм записи. Исходный код пишет и читает человек, машинный код исполняет процессор, байт-код исполняет программа-посредник — виртуальная машина.
Содержание
Когда говорят «написать код», почти всегда имеют в виду исходный. Ниже — чем три формы отличаются, как одна превращается в другую и как одна и та же задача выглядит на четырех языках. Примеры проверены 30.09.2026 на Python 3.14.7, Node.js 24.21.0, OpenJDK 25.0.4 и Apple clang 21 (процессор arm64).
Исходный, машинный и байт-код: в чем разница
| Форма | Как выглядит | Кто создает | Кто исполняет |
|---|---|---|---|
| Исходный код | текст на языке программирования | программист | напрямую никто: нужен транслятор |
| Машинный код | числа — команды конкретного процессора | компилятор | процессор |
| Байт-код | числа — команды условной, виртуальной машины | компилятор языка | виртуальная машина (JVM, интерпретатор Python) |
Еще два слова, которые часто путают с этими тремя. Исполняемый файл — это упаковка: в нем лежит машинный код, данные и служебные заголовки для операционной системы. Язык ассемблера — это текстовая запись машинных команд, удобная человеку; сам по себе он тоже исходный код.
Один пример на четырех языках
Задача одна: функция складывает два числа, программа печатает результат для 2 и 3. Каждый файл запускается отдельно и выводит в консоль 5.
Python, файл add.py, запуск python add.py:
def add(a, b):
return a + b
print(add(2, 3))
JavaScript, файл add.js, запуск node add.js:
function add(a, b) {
return a + b;
}
console.log(add(2, 3));
C, файл add.c:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main(void) {
printf("%d\n", add(2, 3));
return 0;
}
Java, файл Add.java:
public class Add {
static int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
System.out.println(add(2, 3));
}
}
Смысл у четырех текстов одинаковый, а правила записи разные. В C и Java нужно указать типы (int) и закончить инструкцию точкой с запятой. В Python типы писать не обязательно, инструкция заканчивается переводом строки, а тело функции выделяется отступом. В JavaScript точку с запятой принято ставить, но в большинстве случаев интерпретатор расставит ее сам.
Как исходный код становится работающей программой
Процессор не понимает ни def, ни function: ему нужны машинные команды. Перевод выполняет транслятор, и основных способов два.
Компиляция — программа переводится целиком до запуска, результат сохраняется в файл. Интерпретация — программа-интерпретатор читает код и сразу выполняет его, отдельного файла с машинным кодом не остается.
Это упрощенная схема: языки редко бывают «чисто» компилируемыми или интерпретируемыми. Способ исполнения — свойство конкретной реализации языка, а не самого языка, и многие реализации совмещают оба подхода.
C: компилятор выдает машинный код
clang -O1 add.c -o add
./add
Первая команда создает исполняемый файл add, вторая запускает его и печатает 5. Исходник для запуска уже не нужен. Если попросить компилятор показать, во что превратилась функция add (clang -O1 -c add.c -o add.o, затем objdump -d add.o), получится так:
0: 0b000020 add w0, w1, w0
4: d65f03c0 ret
Слева — машинный код: два числа по четыре байта. Справа — те же команды на языке ассемблера: сложить два регистра и вернуться. Этот вывод получен на процессоре arm64; на x86-64 числа и названия команд будут другими. Поэтому машинный код не переносится между типами процессоров, а готовый файл — еще и между операционными системами: программу собирают заново под каждую платформу.
Любопытная деталь того же прогона: в main компилятор вообще не вызывает add, а сразу подставляет готовое число 5 (mov w8, #0x5). Это оптимизация: компилятор вправе переписать программу, если результат не изменится.
Java: компилятор выдает байт-код
javac Add.java
java Add
javac создает файл Add.class с байт-кодом, java запускает виртуальную машину (JVM), которая его исполняет и печатает 5. Команда javap -c Add показывает байт-код метода add:
static int add(int, int);
Code:
0: iload_0
1: iload_1
2: iadd
3: ireturn
Четыре команды: положить на стек первый аргумент, второй, сложить, вернуть. Процессор их не понимает, зато файл Add.class одинаков для Windows, Linux и macOS — различается только JVM под каждую систему. Во время работы JVM часто исполняемые участки сама переводит в машинный код; это называется JIT-компиляцией.
Python: байт-код внутри интерпретатора
Python принято называть интерпретируемым языком, но стандартный интерпретатор CPython сначала тоже компилирует исходник в байт-код и только потом исполняет его. Увидеть это можно модулем dis:
import dis
def add(a, b):
return a + b
dis.dis(add)
Вывод на Python 3.14.7:
3 RESUME 0
4 LOAD_FAST_BORROW_LOAD_FAST_BORROW 1 (a, b)
BINARY_OP 0 (+)
RETURN_VALUE
Логика та же, что в Java: загрузить a и b, применить +, вернуть значение. Набор команд байт-кода Python меняется от версии к версии, так что на другой версии названия будут отличаться. Это внутренняя кухня интерпретатора, а не формат для распространения программ.
JavaScript устроен похоже: движок V8 (Node.js, Chrome) переводит исходник в свой байт-код, а «горячие» функции дополнительно компилирует в машинный код.
| Язык (реализация) | Что получается из исходника | Что нужно для запуска |
|---|---|---|
| C (clang, gcc) | исполняемый файл с машинным кодом | только сам файл и подходящая система |
| Java (JDK) | файл .class с байт-кодом |
установленная JVM |
| Python (CPython) | байт-код в памяти; кеш .pyc в __pycache__ — только для импортируемых модулей |
установленный Python и исходник |
| JavaScript (V8) | байт-код и машинный код в памяти | браузер или Node.js и исходник |
Из чего состоит исходный код
Набор «кирпичиков» почти не зависит от языка:
- инструкции — действия: вычислить, присвоить, вывести;
- переменные и значения — именованные данные, с которыми работает программа;
- операторы — знаки действий:
+,=,==; - управляющие конструкции — условия и циклы, которые меняют порядок выполнения;
- функции — именованные блоки инструкций, которые можно вызывать многократно;
- комментарии — пояснения для человека, транслятор их пропускает.
Настоящая программа — обычно не один файл, а проект: десятки и тысячи файлов с исходным кодом, подключенные библиотеки и файлы сборки, где описано, что и в каком порядке компилировать.
Код должен быть точным: пример ошибки
Человек поймет текст с опечаткой, транслятор — нет. Сохраним копию add.py под именем bad.py и уберем двоеточие в первой строке:
def add(a, b)
return a + b
print(add(2, 3))
Результат запуска на Python 3.14.7:
File "/w/bad.py", line 1
def add(a, b)
^
SyntaxError: expected ':'
Путь в первой строке у вас будет свой — там, где лежит файл. Программа не выполнила ни одной строки: 5 на экране нет. Интерпретатор указал файл, строку и место, где ожидал двоеточие. Исправление — вернуть : после def add(a, b). Сообщения об ошибках стоит читать дословно: чаще всего в них уже названа причина.
Где пишут и как запускают код
Исходный код — обычный текст, его можно набрать даже в «Блокноте». На практике используют редакторы кода (например, Visual Studio Code) и IDE — среды разработки вроде PyCharm или IntelliJ IDEA. Они подсвечивают синтаксис, подсказывают имена, показывают ошибки до запуска и позволяют выполнять программу по шагам.
Чтобы запустить свой первый код, нужны три шага: установить транслятор языка (Python, Node.js, JDK или компилятор C), сохранить текст в файл с нужным расширением (.py, .js, .java, .c) и выполнить команду запуска в терминале или кнопкой в IDE. JavaScript можно попробовать без установки — в консоли инструментов разработчика любого браузера.
Выводы
- Программный код — это запись программы; у нее три основные формы: исходный код для человека, машинный для процессора, байт-код для виртуальной машины.
- Исходный код сам не исполняется: его переводит компилятор (целиком, заранее) или выполняет интерпретатор (по ходу работы). Многие реализации совмещают оба способа.
- Машинный код привязан к типу процессора и операционной системе, байт-код — к виртуальной машине, поэтому файл
.classпереносится между системами, а исполняемый файл C — нет. - Одна и та же задача на Python, JavaScript, C и Java записывается по разным правилам, но из одних и тех же элементов: инструкций, переменных, функций.
- Транслятор не прощает неточностей: одна пропущенная
:останавливает всю программу, а сообщение об ошибке указывает строку и причину.
Где применяется / связь с практикой
Любая программа — сайт, мобильное приложение, игра, прошивка стиральной машины — начинается с исходного кода, который затем проходит один из описанных путей до машинных команд. Понимание этого пути помогает в повседневной работе: становится ясно, почему программа «не видит» установленный интерпретатор, зачем нужна сборка и откуда берутся ошибки до запуска.
Освойте тему на практике
Начинать удобнее с языка, где мало служебных конструкций и результат виден сразу. На курсе «Python-разработчик. Базовый уровень» от синтаксиса и функций переходят к собственным проектам. Посмотреть, как преподаватели разбирают код вживую, можно на открытых уроках Otus.
FAQ
HTML — это программный код?
HTML — язык разметки: он описывает структуру страницы, а не последовательность действий. В быту его тоже называют кодом, но языком программирования он не считается.
Что такое открытый исходный код?
Это код, который опубликован под лицензией, разрешающей его читать, изменять и распространять. У закрытых программ пользователю доступен только исполняемый файл, без исходников.
Можно ли из исполняемого файла получить исходный код обратно?
Точно восстановить нельзя: при компиляции теряются имена переменных, комментарии и структура текста. Дизассемблеры и декомпиляторы дают приблизительную реконструкцию; для байт-кода Java она обычно ближе к оригиналу, чем для машинного кода.
Что такое чистый код?
Это не вид кода, а оценка его качества: понятные имена, короткие функции, отсутствие дублирования. Транслятору все равно, а людям, которые будут читать и менять программу, — нет.



