1.19. Что такое программа?
Программа
Понятие программы
★ Программа – просто набор инструкций, написанных на языке, понятном компьютеру, которые выполняют определённую задачу. Без программ компьютер был бы просто набором электронных компонентов, не способных ни на что полезное.
Как работает программа?
1. Написание кода
Программист пишет код на соответствующем языке программирования (к примеру, Java). Этот код состоит из набора команд, которые компьютер в конечном итоге должен выполнить.
★ Инструкция — элементарная команда для процессора, записанная на машинном языке. Инструкция — это атомарное действие, которое процессор способен выполнить за один такт или за несколько тактов своей работы. Примеры таких действий:
- сложить два числа,
- перенести данные из одной ячейки памяти в другую,
- сравнить два значения,
- перейти к другой инструкции в зависимости от условия.
Инструкции имеют строгую структуру: код операции (что делать) и операнды (с чем делать). Совокупность инструкций образует машинный код — программу, понятную напрямую аппаратному обеспечению. Современные процессоры поддерживают тысячи разных инструкций, объединённых в так называемый набор команд (Instruction Set Architecture, ISA). Архитектуры x86, ARM, RISC-V — это разные наборы инструкций, определяющие, какие действия может выполнять процессор.
Программист редко пишет инструкции вручную — вместо этого он использует языки программирования более высокого уровня, которые транслируются в инструкции автоматически. Но каждая строчка высокоуровневого кода в конечном счёте становится цепочкой таких инструкций.
★ Команда — термин, родственный инструкции, но употребляемый чаще на уровне пользователя или системного администрирования. Команда — это запрос к программе или операционной системе, выполненный через интерфейс: текстовую строку в терминале, графическую кнопку, голосовой ввод или HTTP-запрос.
Команда может быть простой — ls в Linux, dir в Windows — и вызывает готовую утилиту для отображения содержимого папки.
Команда может быть составной — git commit -m "Fix login" — и запускает последовательность действий в системе контроля версий: подготовку изменений, создание коммита, запись сообщения.
Команда может содержать параметры и флаги, которые уточняют её поведение: ping -c 4 google.com означает «отправить ровно 4 пакета и остановиться».
В отличие от инструкций, команды не привязаны к машинному коду. Они интерпретируются оболочкой (shell), интерпретатором, приложением или API-сервером — и лишь затем превращаются в инструкции, если требуется выполнение на процессоре.
Команды — основа взаимодействия человека с программным миром. Даже нажатие кнопки в графическом интерфейсе — это, технически, исполнение команды: «открыть окно», «сохранить файл», «отправить сообщение».
2. Компиляция или интерпретация
Код первоначально – человекочитаемый набор текста, состоящий из ключевых слов, которые исторически были определены создателями языков программирования, и нужно перевести текст в набор машинных инструкций:
Компиляция (C#, Java) – код преобразуется в машинные инструкции заранее, создавая исполняемый файл. Такие языки называют компилируемыми.
Интерпретация (Python, JavaScript) – код выполняется построчно специальной программой (интерпретатором). Такие языки называют интерпретируемыми.
★ Компиляция — процесс преобразования исходного кода целиком в исполняемый машинный код до запуска программы. Результат компиляции — отдельный бинарный файл (например, .exe в Windows или ELF-файл в Linux), который операционная система может загрузить и передать процессору напрямую.
Процесс выглядит так:
- Программист пишет код (например, на C++).
- Компилятор анализирует его — проверяет синтаксис, типы данных, зависимости.
- Генерирует машинный код, оптимизированный под целевую архитектуру.
- Связывает с библиотеками.
- Формирует итоговый исполняемый файл.
Преимущества компиляции:
- высокая производительность (код уже готов к выполнению),
- возможность глубокой оптимизации,
- скрытие исходного кода от конечного пользователя.
Языки с компиляцией: C, C++, Rust, Go (частично), C# (в .NET — JIT-компиляция, но всё равно этап компиляции присутствует).
★ Интерпретация — процесс выполнения исходного кода по мере чтения, строка за строкой, с помощью специальной программы — интерпретатора. Исходный код не превращается в отдельный исполняемый файл. Вместо этого интерпретатор загружает текст программы в память и выполняет его в реальном времени.
Этапы интерпретации:
- Программист пишет код (например, на Python).
- Запускает
python script.py. - Интерпретатор читает первую строку, разбирает её, выполняет действие.
- Переходит ко второй строке — и так до конца.
Преимущества интерпретации:
- мгновенный запуск без этапа сборки,
- гибкость — можно изменить код и сразу увидеть результат,
- удобство отладки и экспериментов.
Языки с интерпретацией: Python, JavaScript (в браузере), Ruby, PHP, Bash.
Современные системы часто используют гибридные подходы. Например, Java компилируется в байт-код (промежуточный формат), который затем интерпретируется или компилируется JIT (Just-In-Time) виртуальной машиной (JVM). C# работает аналогично в среде .NET. Такие подходы сочетают преимущества обоих методов.
Главное различие: компиляция — это подготовка кода к выполнению заранее; интерпретация — это выполнение кода в процессе чтения.
3. Выполнение процессором
Программа загружается в оперативную память, и процессор выполняет все указанные инструкции шаг за шагом.
★ Выполнение программы — процесс, при котором процессор последовательно обрабатывает инструкции программы, загруженной в оперативную память. Это динамическое состояние: программа переходит от «набора инструкций на диске» к «активной задаче в системе».
Этапы выполнения:
- Загрузка — операционная система копирует исполняемый файл (или байт-код) из постоянного хранилища (жёсткий диск, SSD) в оперативную память.
- Инициализация — выделяется память для стека, кучи, глобальных переменных; загружаются динамические библиотеки; подготавливается среда выполнения (например, виртуальная машина Java).
- Начало работы — процессор передаёт управление первой инструкции точки входа (обычно функция
main()или её аналог). - Цикл выполнения — процессор повторяет три действия:
- Выборка — считывает следующую инструкцию по адресу из счётчика команд;
- Декодирование — определяет, какую операцию выполнить и с какими операндами;
- Исполнение — выполняет операцию (сложение, переход, запись в память и т.д.).
- Завершение — программа достигает конца или вызывает команду
exit; операционная система освобождает занятые ресурсы (память, дескрипторы файлов, сетевые соединения).
Во время выполнения программа может:
- взаимодействовать с пользователем (ввод/вывод),
- читать и записывать файлы,
- отправлять и получать данные по сети,
- запускать другие программы,
- создавать новые потоки или процессы.
Выполнение — это живой процесс, в котором участвуют: процессор, память, дисковая подсистема, сетевая карта, устройства ввода-вывода, системные службы и планировщик операционной системы. Программа существует во времени — с началом, развитием и концом.
4. Взаимодействие со средой
Программа каким-то образом может влиять на окружающую компонентную среду – читать и записывать файлы, отправлять данные в сеть, выводить изображение на экран или принимать ввод от пользователя.

★ Окружающая компонентная среда — совокупность программных и аппаратных ресурсов, с которыми программа взаимодействует во время выполнения. Это не абстрактное «окружение», а конкретные объекты: файлы, устройства, процессы, службы, сетевые узлы и даже другие программы.
Компонентная среда включает в себя:
- Файловую систему — программа может читать конфигурацию из
config.json, сохранять отчёты в папкуreports/, открывать лог-файлы для записи. Вся эта работа происходит через системные вызовы к файловой подсистеме ОС. - Устройства ввода-вывода — клавиатура, мышь, микрофон, принтер, монитор. Программа получает события нажатий, отправляет звук в аудиодрайвер, выводит пиксели на экран через графический стек (например, DirectX или Vulkan).
- Сетевую инфраструктуру — приложение может открыть сокет, подключиться к серверу по IP-адресу и порту, отправить HTTP-запрос. Это взаимодействие опосредовано сетевыми драйверами, протоколами и маршрутизаторами.
- Другие процессы и службы — браузер может запросить сертификат у службы криптографии Windows (
CryptoAPI), антивирус может сканировать запускаемый файл в реальном времени через фильтр драйвера, база данных может получать команды от клиентского приложения через локальный сокет. - Переменные среды и реестр — программа может прочитать
%TEMP%, чтобы определить папку для временных файлов, или запросить значениеLANG, чтобы выбрать язык интерфейса.
Программа не имеет прямого доступа к «железу». Всё взаимодействие идёт через посредников — драйверы, системные вызовы, API операционной системы. Это обеспечивает:
- Безопасность — процесс не может читать память другого процесса без разрешения;
- Портативность — один и тот же код может работать на разных компьютерах, если ОС предоставляет одинаковый интерфейс;
- Стабильность — сбой в одной программе не приводит к падению всей системы.
Окружающая компонентная среда — это «мир», в котором живёт программа. Чем шире её возможности взаимодействия, тем больше функций она может реализовать.