Перейти к основному содержимому

1.19. Виды программ

Всем

Виды программ

Среди программ, которые в совокупности образуют систему, можно выделить:

  • утилиты;
  • модули;
  • плагины и расширения;
  • скрипты;
  • службы.

Утилита

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

Многие утилиты работают через командную строку, что делает их быстрыми и эффективными, но требует определённых знаний. Утилиты редко имеют графический интерфейс, так как их основная задача - выполнять конкретные действия без лишних затрат ресурсов.

Утилиты — инструменты для технических пользователей и администраторов. Они ценятся за точность, скорость и минимальное потребление ресурсов.

КатегорияПримерыОсобенности
Работа с файлами7-Zip, WinRAR, rsync, ddАрхивация, копирование с проверкой контрольных сумм, клонирование дисков побайтово.
Сетевые утилитыping, traceroute/tracert, nslookup, curl, WiresharkДиагностика подключения, анализ маршрутов, запрос DNS-записей, отправка HTTP-запросов, перехват трафика.
Системный анализTask Manager, Resource Monitor, htop, iostat, vmstatОтслеживание загрузки CPU, памяти, диска, сети в реальном времени.
Управление дискамиdiskpart, fdisk, gparted, CrystalDiskInfoСоздание/удаление разделов, проверка состояния SSD/HDD (S.M.A.R.T.), дефрагментация.
БезопасностьVeraCrypt, HashCheck, Process ExplorerШифрование томов, проверка целостности файлов по хешу, детальный анализ запущенных процессов.

Особенности утилит:

  • Минимализм интерфейса: большинство утилит работают через командную строку. Это позволяет:

    • запускать их удалённо (по SSH),
    • встраивать в скрипты автоматизации,
    • комбинировать через конвейеры (|) — результат одной утилиты становится входом для другой.
  • Модульность: утилиты редко зависят от больших фреймворков. Они самодостаточны — можно скопировать один .exe или .elf-файл и запустить на другой машине.

  • Стандартизация поведения: в Unix-подобных системах утилиты следуют принципу «делай одну вещь и делай её хорошо». Например, grep ищет строки по шаблону, sort сортирует, uniq убирает дубликаты — их комбинация даёт мощный инструмент обработки текста.

  • Портативность: многие утилиты доступны для нескольких ОС. curl, jq, ffmpeg работают одинаково на Windows, Linux и macOS.

  • Диагностическая ценность: при сбое системы администратор первым делом запускает утилиты — ipconfig, dmesg, journalctl — чтобы «прослушать» состояние машины.

Утилиты — это «лупа и отвёртка» цифрового мира. Без них невозможно профессиональное обслуживание компьютеров и сетей.


Модуль

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

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

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

Формы модулей

ТипОписаниеПримеры
Файловый модульОдин файл кода, экспортирующий функции/классыmath.py в Python, fs.js в Node.js
Библиотечный модульСкомпилированная библиотека (.dll, .so, .jar)libssl.so, Newtonsoft.Json.dll
Плагин-модульРасширение, подключаемое динамическиМодули Apache (mod_rewrite), модули ядра Linux (nvidia.ko)
МикросервисОтдельный процесс, общающийся по сетиСервис авторизации, сервис оплаты — каждый как независимый модуль системы

Примеры модулей в реальных системах

  • Веб-браузер:

    • модуль рендеринга (Chromium — Blink),
    • модуль JavaScript-движка (V8),
    • модуль управления вкладками,
    • модуль работы с куками и локальным хранилищем.
      Каждый можно обновлять независимо (хотя на практике часто обновляют весь браузер целиком).
  • Операционная система:

    • модуль файловой системы (ext4, NTFS),
    • модуль драйвера видеокарты,
    • модуль сетевого стека (TCP/IP),
    • модуль безопасности (SELinux, AppArmor).
      Ядро Linux загружает и выгружает модули динамически — insmod, rmmod.
  • Игровой движок (например, Unity):

    • модуль физики (NVIDIA PhysX),
    • модуль анимации (Mecanim),
    • модуль звука (FMOD, Wwise),
    • модуль редактора сцен.
      Разработчик подключает только нужные модули, чтобы не тащить лишний код в финальную сборку.

Особенности модулей:

  • Чёткие границы интерфейса: модуль взаимодействует с внешним миром через строго определённый API — набор функций, событий, входных/выходных форматов. Всё остальное скрыто внутри (инкапсуляция).

  • Низкая связанность (loose coupling): замена одного модуля не требует переделки других — если интерфейс остался прежним. Например, можно заменить базу данных с SQLite на PostgreSQL, не трогая бизнес-логику.

  • Повторное использование: один и тот же модуль можно включить в несколько проектов. Например, модуль логирования (log4j, Serilog) используется в десятках тысяч приложений.

  • Изоляция сбоев: падение одного модуля (например, плагина) не обязательно приводит к падению всей программы — если система поддерживает изоляцию (как в Firefox с multi-process architecture).

  • Удобство командной разработки: разные команды могут работать над разными модулями параллельно, не мешая друг другу.

Модульность превращает гигантскую программу в конструктор — где каждая деталь имеет своё назначение, маркировку и способ крепления.


Расширение и плагин

Расширение / Плагин – дополнение к основной программе. Часто от сторонних разработчиков. Расширение добавляет (буквально – расширяя возможности) функции, а плагин подключается к API программы. Примеры плагинов – VST для Audacity, плагины WordPress. Примеры расширений – расширения для браузера Google Chrome. Плагины обычно интегрируются в программы через интерфейс программирования приложений (это и есть API), и становятся её частью, а расширения чаще всего встречаются в браузерах, и работают как дополнительные инструменты, которые можно включать и выключать по желанию пользователя. Оба типа дополнений позволяют адаптировать программы под свои нужды, не изменяя их исходный код.

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

Особенности плагинов:

  • Требуют явной поддержки со стороны хост-программы: приложение должно предоставлять точки подключения (хуки), интерфейсы для регистрации, систему загрузки.
  • Часто имеют доступ к внутренним структурам хоста: могут читать/изменять данные, перехватывать события, добавлять элементы интерфейса.
  • Обычно компилируются в нативный код или байт-код, совместимый со средой хоста.

Примеры:

  • VST-плагины в аудиоредакторах (Ableton Live, FL Studio):
    • Генераторы звука (синтезаторы),
    • Эффекты (реверберация, компрессия),
    • Анализаторы спектра.

Каждый VST — отдельный .dll (Windows) или .vst3-пакет, загружаемый в среду по стандарту Steinberg.

  • Плагины WordPress:
    • WooCommerce — добавляет интернет-магазин,
    • Yoast SEO — оптимизирует контент под поисковики,
    • Akismet — фильтрует спам в комментариях.

Подключаются через PHP-интерфейсы (add_action, add_filter), участвуют в обработке запросов на всех этапах.

  • Плагины для IDE:
    SonarLint — проверка кода на качество,
    Database Tools — подключение к СУБД,
    Rainbow Brackets — цветовая индикация скобок.
    Используют SDK среды (например, IntelliJ Platform Plugin SDK), получают доступ к AST-дереву кода, редактору, системе сборки.

Расширение — дополнение, чаще всего работающее в рамках ограничений, накладываемых хостом, но не требующее глубокого вмешательства в его ядро. Самый распространённый тип — веб-браузерные расширения.

Особенности расширений:

  • Обычно пишутся на высокоуровневых языках (JavaScript, HTML, CSS),
  • Упаковываются в архив с манифестом (например, manifest.json),
  • Запускаются в изолированной среде (песочнице), что повышает безопасность,
  • Взаимодействуют с хостом через строго ограниченные API (например, chrome.tabs, browser.storage).

Примеры:

  • Расширения для Chrome / Edge / Firefox:
    • uBlock Origin — блокировщик рекламы (анализирует DOM и сетевые запросы),
    • Dark Reader — инвертирует цвета страниц,
    • Grammarly — проверка орфографии и стиля в текстовых полях.

Каждое расширение состоит из:

  • фонового скрипта (фоновая логика),

  • контент-скрипта (взаимодействие со страницей),

  • popup-интерфейса (иконка в панели),

  • опционального options-страницы.

  • Расширения для VS Code:
    Хотя технически они тоже называются «extensions», по архитектуре ближе к плагинам:

    • Prettier — автоформатирование кода,
    • Live Server — локальный веб-сервер для HTML-файлов,
    • Remote - SSH — работа над проектами на удалённой машине.

Написаны на TypeScript/JavaScript, используют VS Code API, могут добавлять команды, панели, провайдеры файловых систем.


Скрипт

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

Скрипт — программа, написанная на интерпретируемом языке, предназначенная для автоматизации рутинных задач, быстрой проверки гипотез или связи между другими программами. Скрипты — «клей», соединяющий компоненты системы.

Особенности скриптов:

  • Краткость и простота: скрипт редко превышает несколько сотен строк. Его цель — решить одну задачу «здесь и сейчас».
  • Быстрый цикл разработки: редактируй → запусти → проверь → исправь — без этапа компиляции.
  • Высокоуровневые операции: скрипты оперируют не байтами, а файлами, строками, HTTP-запросами, процессами.
  • Зависимость от среды: для запуска нужен интерпретатор (python, node, bash) и, возможно, пакеты (pip install requests).
  • Часто выполняются разово или по расписанию: cron-задачи, пакетные обработки, миграции.

Примеры скриптов по назначению:

КатегорияПримерОписание
Файловые операцииbackup.shАрхивирует папку /home/user/docs, добавляет дату в имя (docs_20251227.zip), копирует в облако через rclone.
Сетевая диагностикаcheck-servers.pyОтправляет HTTP-запросы к 10 внутренним сервисам, записывает статус-коды и время ответа в CSV-файл.
API-взаимодействиеtelegram-bot.jsПринимает команды через Telegram Bot API, возвращает курсы валют с ЦБ РФ (через их XML API).
Обработка данныхcsv-cleaner.rbЧитает input.csv, удаляет пустые строки, приводит телефоны к формату +7 (XXX) XXX-XX-XX, сохраняет output.csv.
Развёртываниеdeploy.ps1Останавливает службу, копирует новые файлы, запускает миграции БД, перезапускает службу — всё через PowerShell.

Популярные языки для скриптов:

  • Bash / PowerShell — управление ОС, запуск программ, работа с файлами и процессами.
  • Python — универсальный выбор: богатая стандартная библиотека, удобный синтаксис, множество пакетов (requests, pandas, paramiko).
  • JavaScript (Node.js) — работа с веб-API, обработка JSON, событийные задачи.
  • Perl — классика для текстовой обработки (регулярные выражения «из коробки»).
  • Ruby — часто используется в DevOps (Chef, Puppet DSL).

Скрипты могут быть «одноразовыми» — написаны для одной задачи и больше не используются. А могут стать основой для полноценного приложения: многие веб-фреймворки (Django, Express) начинались как набор скриптов для внутренних нужд.

Главное правило хорошего скрипта: он должен быть понятен через месяц — даже автору. Поэтому — комментарии, осмысленные имена, обработка ошибок (try/catch, проверка кода возврата).


Служба

Служба – программа, работающая в фоне без участия пользователя, к примеру служба печати или веб-сервер nginx. Они обеспечивают бесперебойную работу системы и часто являются её ключевыми компонентами. Например, служба печати управляет отправкой документов на принтер, а веб-сервер обрабатывает запросы пользователей к сайту. Службы могут запускаться автоматически при старте системы и продолжать работать даже тогда, когда пользователь неактивен. Они отличаются от утилит и скриптов своим фоновым и зачастую постоянным процессом.

Служба (в Windows) / демон (в Unix-подобных системах) — программа, которая работает в фоновом режиме, без графического интерфейса и без прямого участия пользователя. Службы обеспечивают непрерывную работу системных и прикладных функций.

Особенности служб:

  • Автозапуск при старте системы: служба регистрируется в системе и запускается до входа пользователя (ранний старт) или после (пользовательские службы).
  • Долгоживущесть: работает часами, днями, месяцами — пока система не будет перезагружена или служба не будет остановлена вручную.
  • Изоляция от сессий пользователя: служба продолжает работать, даже если все пользователи вышли из системы.
  • Собственный жизненный цикл: у службы есть методы Start(), Stop(), Pause(), Resume() — управляются через системные утилиты (services.msc, systemctl).
  • Журналирование: пишет логи в системный журнал (Event Log в Windows, journalctl в Linux).

Примеры системных служб:

СлужбаНазначениеПлатформа
sshdПринимает входящие SSH-соединенияLinux/macOS
winlogonУправляет входом/выходом пользователейWindows
cron / systemd-timersЗапускает задачи по расписаниюUnix
spoolerУправляет очередью печатиWindows
dockerdЯдро Docker — управляет контейнерамиКроссплатформенная
nginx / apache2Веб-серверы, обслуживающие HTTP-запросыКроссплатформенные

Примеры прикладных служб:

  • Базы данных: postgresql, mysqld, mssql-server — слушают порт, принимают запросы, управляют транзакциями.
  • Мессенджеры в фоне: Telegram Desktop (служба Telegram.exe --start-in-tray), Discord (фоновый процесс для уведомлений).
  • Антивирусы: AvastSvc, Kaspersky Security Network Service — сканируют в реальном времени, обновляют базы.
  • Облачные синхронизаторы: OneDrive.exe, rclone mount — фоновая синхронизация файлов.

Управление службами:

  • Windows:
    — Графически: services.msc,
    — Командная строка: net start Spooler, sc query wuauserv,
    — PowerShell: Get-Service, Start-Service.

  • Linux (systemd):
    systemctl start nginx,
    systemctl enable nginx (автозапуск),
    systemctl status docker,
    journalctl -u postgresql (логи конкретной службы).

Службы — «невидимые работники» цифровой инфраструктуры. Без них не было бы веба, почты, баз данных, обновлений и многого другого.


Исполняемый файл

Исполняемый файл – файл, который компьютер может запустить напрямую. Их мы разберём в отдельной главе. Это машинный код, понятный процессору компьютера, бинарные файлы.

Форматы исполняемых файлов:

ОСФорматРасширение / Особенность
WindowsPE (Portable Executable).exe (приложения), .dll (библиотеки), .sys (драйверы)
Linux / UnixELF (Executable and Linkable Format)Без расширения (обычно), или .out; разрешение +x обязательно
macOSMach-O.app — на самом деле папка-контейнер, внутри Contents/MacOS/program
JavaJAR (Java ARchive).jar — содержит байт-код, запускается через java -jar file.jar
.NETPE + CIL.exe, .dll — содержат промежуточный код, выполняемый CLR

Особенности исполняемых файлов:

  • Заголовок и метаданные: содержат информацию для ОС: архитектура (x86, x64, ARM), точка входа (main), требуемые библиотеки, права доступа.
  • Секции кода и данных:
    .text — инструкции процессора,
    .data — инициализированные глобальные переменные,
    .bss — неинициализированные переменные,
    .rodata — строки, константы (только для чтения).
  • Зависимости от ОС и архитектуры:
    — Исполняемый файл, собранный под Windows x64, не запустится на Linux без эмуляции (Wine);
    — Файл под ARM не запустится на x86-процессоре.
  • Подписи и проверка целостности:
    — В Windows — цифровая подпись (Authenticode), проверяется в момент запуска;
    — В macOS — Gatekeeper блокирует неподписанные приложения по умолчанию;
    — В Linux — проверка через sha256sum, хотя формально ОС не требует подписи.

Примеры исполняемых файлов в повседневности:

  • notepad.exe — стандартный текстовый редактор Windows.
  • /bin/ls — утилита просмотра файлов в Linux (ELF-файл).
  • java — сам интерпретатор Java (исполняемый), который затем запускает .jar.
  • chrome — браузер (в Linux — ELF, в Windows — PE). При запуске создаёт несколько процессов: браузер, рендерер, GPU-процесс.
  • ffmpeg — консольная утилита для обработки видео. Принимает параметры (-i input.mp4 -c:v libx264 output.mp4) и работает без GUI.

Как создать исполняемый файл:

  1. Компиляция:
    gcc hello.c -o hellohello (ELF)
    csc Program.csProgram.exe (PE)

  2. Упаковка:
    pyinstaller script.pydist/script/script.exe (включает интерпретатор Python),
    pkg index.js → автономный .exe из Node.js-кода.

  3. Сборка из байт-кода:
    javac Main.javaMain.classjar cfe app.jar Main *.classjava -jar app.jar.

Исполняемый файл — точка перехода от абстрактного кода к реальному действию. Это тот самый «черный ящик», который пользователь дважды щёлкает — и видит результат.